jniprocess.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 203 行

JAVA
203
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * @author Scott Ferguson */package com.caucho.bootjni;import com.caucho.boot.*;import com.caucho.config.ConfigException;import com.caucho.util.*;import com.caucho.vfs.*;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.Constructor;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;/** * Resin's bootstrap class. */public class JniProcess extends Process implements JniProcessAPI{  private static final L10N L    = new L10N(JniProcess.class);  private static final Logger log    = Logger.getLogger(JniProcess.class.getName());  private static Throwable _jniLoadException;    private static boolean _hasJni;  private int _stdoutFd = -1;  private int _pid = -1;  private int _exitValue = -1;  private int _status = -1;  private ReadStream _is;  public JniProcess()  {    if (_jniLoadException == null)      _hasJni = isNativeBootAvailable();  }  private JniProcess(ArrayList<String> args,		     HashMap<String,String> env,		     String chroot,		     String pwd,		     String user,		     String group)  {    if (! _hasJni)      throw new UnsupportedOperationException("No JNI available");    String []argv = new String[args.size()];    args.toArray(argv);    String []envp = new String[env.size()];    int i = 0;    for (Map.Entry<String,String> entry : env.entrySet()) {      envp[i++] = entry.getKey() + '=' + entry.getValue();    }    setFdMax();    if (! exec(argv, envp, chroot, pwd, user, group))      throw new IllegalStateException("exec failed");    int stdoutFd = _stdoutFd;    _stdoutFd = -1;    try {      StreamImpl stream;      Class cl = Class.forName("com.caucho.vfs.JniFileStream",			       false, getClass().getClassLoader());      Constructor ctor = cl.getConstructor(new Class[] { int.class, boolean.class, boolean.class });            stream = (StreamImpl) ctor.newInstance(stdoutFd, true, false);            _is = new ReadStream(stream);    } catch (Exception e) {      throw ConfigException.create(e);    }  }  public JniProcess create(ArrayList<String> args,                           HashMap<String,String> env,                           String chroot,                           String pwd,                           String user,                           String group)  {    if (_hasJni)      return new JniProcess(args, env, chroot, pwd, user, group);    else      throw new UnsupportedOperationException("No JNI available");  }  public boolean isValid()  {    return _hasJni;  }    public OutputStream getOutputStream()  {    return new NullOutputStream();  }  public InputStream getInputStream()  {    return _is;  }  public InputStream getErrorStream()  {    return getInputStream();  }  public int waitFor()  {    int pid = _pid;    _pid = 0;        if (pid > 0) {      _status = waitpid(pid, true);    }    return _status;  }  public int exitValue()  {    if (_status >= 0)      return _status;    if (_pid > 0) {      int result = waitpid(_pid, false);      if (result < 0)	throw new IllegalThreadStateException("Pid " + _pid + " not yet closed");      _pid = 0;      _status = result;    }    return _status;  }  public void destroy()  {  }  static class NullOutputStream extends OutputStream {    public void write(int ch)    {    }        public void flush()    {    }        public void close()    {    }  }    public native boolean isNativeBootAvailable();    public native boolean clearSaveOnExec();  public native static int getFdMax();  public native static int setFdMax();    private native boolean exec(String []argv,			      String []envp,			      String chroot,			      String pwd,			      String user,			      String group);    private native int waitpid(int pid, boolean isBlock);  static {    try {      System.loadLibrary("resin_os");    } catch (Throwable e) {      log.log(Level.FINE, e.toString(), e);            _jniLoadException = e;    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?