Package org.rzo.yajsw.os.posix.bsd.macosx

Source Code of org.rzo.yajsw.os.posix.bsd.macosx.MacOsXProcess

package org.rzo.yajsw.os.posix.bsd.macosx;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.rzo.yajsw.io.CyclicBufferFileInputStream;
import org.rzo.yajsw.io.CyclicBufferFilePrintStream;
import org.rzo.yajsw.os.OperatingSystem;
import org.rzo.yajsw.os.Process;
import org.rzo.yajsw.os.posix.PosixProcess;

import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

public class MacOsXProcess extends PosixProcess
{

  public String getStdInName()
  {
    return "__stdinp";
  }

  public String getStdOutName()
  {
    return "__stdoutp";
  }

  public String getStdErrName()
  {
    return "__stderrp";
  }

  /**
   * Gets the current cpu.
   *
   * @return the current cpu
   */
  public int getCurrentCpu()
  {
    return -1;
  }

  public int getCurrentThreads()
  {
    return -1;
  }

  /**
   * Gets the current physical memory.
   *
   * @return the current physical memory
   */
  public int getCurrentPhysicalMemory()
  {
    return -1;
  }

  /**
   * Gets the current virtual memory.
   *
   * @return the current virtual memory
   */
  public int getCurrentVirtualMemory()
  {
    return -1;
  }

  /**
   * Gets the current page faults.
   *
   * @return the current page faults
   */
  public int getCurrentPageFaults()
  {
    return -1;
  }

  public boolean start()
  {
    if (_arrCmd == null && _cmd == null)
      return false;
    if (_arrCmd == null)
    {
      _arrCmd = _cmd.split(" ");
      log("exec: " + _cmd);
    }
    else
    {
      String cmd = "";
      for (String c : _arrCmd)
        cmd += c + " ";
      log("exec:" + cmd);
    }

    log("starting ");

    int pid = 0;
    _exitCode = -2;
    String title = _title == null ? "yajsw" : _title;
    _terminated = false;
    if (_visible)
      setCommand(String.format("xterm -hold -sb -T %1$s -e %2$s", title, getCommand()));

    // System.out.println("exec \n"+getCommand());
    // System.out.println("working dir\n"+getWorkingDir());

    if (_visible)
      _pipeStreams = false;
    /*
     * // if (_pipeStreams) { CLibrary.INSTANCE.pipe(_inPipe);
     * CLibrary.INSTANCE.pipe(_outPipe); CLibrary.INSTANCE.pipe(_errPipe);
     * // System.out.println(_outPipe[0]+" "+_outPipe[1]); }
     */

    // fork a child process
    if ((pid = CLibrary.INSTANCE.fork()) == 0)
    {
      // System.out.println("afer fork");

      int stdout = getStdOutNo();
      int stderr = getStdErrNo();// CLibrary.INSTANCE.fileno(NativeLibrary.getInstance("c").getFunction(getStdErrName()).getPointer(0));
      int stdin = getStdInNo();// CLibrary.INSTANCE.fileno(NativeLibrary.getInstance("c").getFunction(getStdInName()).getPointer(0));

      // pipe streams to OS pipes
      // if (_pipeStreams)
      {
        CLibrary.INSTANCE.close(_inPipe[1]);
        moveDescriptor(_inPipe[0], stdin);
        CLibrary.INSTANCE.close(_outPipe[0]);
        moveDescriptor(_outPipe[1], stdout);
        CLibrary.INSTANCE.close(_errPipe[0]);
        moveDescriptor(_errPipe[1], stderr);
      }

      // closeDescriptors();

      // disconect from parent
      CLibrary.INSTANCE.umask(0);
      if (CLibrary.INSTANCE.setsid() < 0)
        CLibrary.INSTANCE.exit(-1);

      // set working dir
      if (getWorkingDir() != null)
        if (CLibrary.INSTANCE.chdir(getWorkingDir()) != 0)
          log("could not set working dir");

      // set priority
      if (_priority == PRIORITY_BELOW_NORMAL)
      {
        if (CLibrary.INSTANCE.nice(1) == -1)
          log("could not set priority ");
      }
      else if (_priority == PRIORITY_LOW)
      {
        if (CLibrary.INSTANCE.nice(2) == -1)
          log("could not set priority ");
      }
      else if (_priority == PRIORITY_ABOVE_NORMAL)
      {
        if (CLibrary.INSTANCE.nice(-1) == -1)
          log("could not set priority ");
      }
      else if (_priority == PRIORITY_HIGH)
      {
        if (CLibrary.INSTANCE.nice(-2) == -1)
          log("could not set priority ");
      }
      if (getUser() != null)
        switchUser(getUser(), getPassword());

      try
      {
        int res = CLibrary.INSTANCE.execvp(_arrCmd[0], _arrCmd);
        int err = Native.getLastError();
        log("errno " + err + " " + CLibrary.INSTANCE.strerror(err));
        log("exec res " + res);
      }
      catch (Exception ex)
      {
        ex.printStackTrace();
      }
      lock = false;
      // CLibrary.INSTANCE.exit(-1);
    } // child code
    else if (pid > 0)
    {
      _pid = pid;
      try
      {
        Thread.sleep(1000);
      }
      catch (InterruptedException e1)
      {
      }

      // or pipe streams to cyclic buffer files
      if (_teeName != null && _tmpPath != null)
      {
        // System.out.println("opening tee streams");
        File f = new File(_tmpPath);
        try
        {
          if (!f.exists())
            f.mkdir();
        }
        catch (Exception ex)
        {
          ex.printStackTrace();
          Thread.currentThread().interrupt();
        }
        try
        {
          // System.out.println("opening tee streams out");
          _inputStream = new CyclicBufferFileInputStream(createRWfile(_tmpPath, "out_" + _teeName));
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
        try
        {
          // System.out.println("opening tee streams err");
          _errorStream = new CyclicBufferFileInputStream(createRWfile(_tmpPath, "err_" + _teeName));
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
        try
        {
          // System.out.println("opening tee streams in");
          _outputStream = new CyclicBufferFilePrintStream(createRWfile(_tmpPath, "in_" + _teeName));
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
        // System.out.println("- opening tee streams");
      }
      /*
       * if (!_pipeStreams) {
       * System.out.println("setting out streams to /dev/null/");
       * CLibrary.INSTANCE.freopen("/dev/null", "w", _outPipe[0]);
       * System.out.println("setting err streams to /dev/null/");
       * CLibrary.INSTANCE.freopen("/dev/null", "w", _errPipe[0]);
       * //System.out.println("setting streams to /dev/null/");
       * //CLibrary.INSTANCE.freopen("/dev/null", "r", _inPipe[1]);
       * System.out.println("- setting streams to /dev/null/"); }
       */

      // System.out.println("parent");
      if (_pipeStreams && _teeName == null && _tmpPath == null)
      {
        writefd(in_fd, _inPipe[1]);
        writefd(out_fd, _outPipe[0]);
        writefd(err_fd, _errPipe[0]);

        _outputStream = new BufferedOutputStream(new FileOutputStream(in_fd));
        _inputStream = new BufferedInputStream(new FileInputStream(out_fd));
        _errorStream = new BufferedInputStream(new FileInputStream(err_fd));

        CLibrary.INSTANCE.close(_inPipe[0]);
        CLibrary.INSTANCE.close(_outPipe[1]);
        CLibrary.INSTANCE.close(_errPipe[1]);

      }

      if (_cpuAffinity != AFFINITY_UNDEFINED)
      {
        IntByReference affinity = new IntByReference();
        affinity.setValue(_cpuAffinity);
        if (CLibrary.INSTANCE.sched_setaffinity(_pid, 4, affinity) == -1)
          log("error setting affinity");
      }

      executor.execute(new Runnable()
      {

        public void run()
        {
          int r = CLibrary.INSTANCE.waitpid(_pid, status, 0);
          // System.out.println("wait for "+r);
          if (r == _pid)
            _exitCode = status.getValue();
          log("exit code linux process " + _exitCode);
          _terminated = true;
        }

      });

      log("started process " + _pid);
      return true;
    } // parent process
    else if (pid < 0)
    {
      log("failed to fork: " + pid);
      return false;
    }
    return false;

  }

  private String getCurrentJava()
  {
    int myPid = OperatingSystem.instance().processManagerInstance().currentProcessId();
    Process myProcess = OperatingSystem.instance().processManagerInstance().getProcess(myPid);
    String cmd = myProcess.getCommand();
    String jvm = null;
    if (cmd.startsWith("\""))
      jvm = cmd.substring(0, cmd.indexOf("\" ") + 1);
    else
      jvm = cmd.substring(0, cmd.indexOf(" "));

    return jvm;
  }

  public String getCommandInternal()
  {
    if (_pid < 0)
      return null;
    String cmd = String.format("ps -p %1$s -o command", _pid);
    String res = _utils.osCommand(cmd, 5000);
    if (res == null)
      return null;
    String[] resx = res.split(System.getProperty("line.separator"));
    return resx[1];
  }

  public String getUserInternal()
  {
    if (_pid < 0)
      return null;
    String cmd = String.format("ps -p %1$s -o user", _pid);
    String res = _utils.osCommand(cmd, 5000);
    if (res == null)
      return null;
    String[] resx = res.split(System.getProperty("line.separator"));
    return resx[1];
  }

  public String getWorkingDirInternal()
  {
    if (_pid < 0)
      return null;
    return null;
  }

  public static Process getProcess(int pid)
  {
    MacOsXProcess result = null;
    result = new MacOsXProcess();
    result.setPid(pid);
    result.setUser(result.getUserInternal());
    result.setCommand(result.getCommandInternal());
    result.setWorkingDir(result.getWorkingDirInternal());
    if (result.getCommand() == null)
      return null;
    return result;
  }

  public void waitFor(long timeout)
  {
    long start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < timeout)
    {
      if (!isRunning())
        return;
      try
      {
        Thread.sleep(100);
      }
      catch (InterruptedException e)
      {
        if (_logger != null)
          _logger.throwing(PosixProcess.class.getName(), "waitFor", e);
        Thread.currentThread().interrupt();
      }
    }

  }

}
TOP

Related Classes of org.rzo.yajsw.os.posix.bsd.macosx.MacOsXProcess

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.