Package org.rzo.yajsw.os.posix.solaris

Source Code of org.rzo.yajsw.os.posix.solaris.SolarisProcess$psinfo

package org.rzo.yajsw.os.posix.solaris;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;

import org.rzo.yajsw.os.Process;
import org.rzo.yajsw.os.posix.PosixProcess;

import com.sun.jna.Memory;

public class SolarisProcess extends PosixProcess
{

  /*
   * #define PRARGSZ 80 /* number of chars of arguments typedef struct psinfo
   * { 0int pr_flag; /* process flags (DEPRECATED; do not use) 4int pr_nlwp;
   * /* number of active lwps in the process 8pid_t pr_pid; /* unique process
   * id 12pid_t pr_ppid; /* process id of parent 16pid_t pr_pgid; /* pid of
   * process group leader 20pid_t pr_sid; /* session id 24uid_t pr_uid; /*
   * real user id 28uid_t pr_euid; /* effective user id 32gid_t pr_gid; /*
   * real group id 36gid_t pr_egid; /* effective group id 40uintptr_t pr_addr;
   * /* address of process 44size_t pr_size; /* size of process image in
   * Kbytes 48size_t pr_rssize; /* resident set size in Kbytes 52size_t
   * pr_pad1; 56dev_t pr_ttydev; /* controlling tty device (or PRNODEV) /* The
   * following percent numbers are 16-bit binary /* fractions [0 .. 1] with
   * the binary point to the /* right of the high-order bit (1.0 == 0x8000)
   * 60ushort_t pr_pctcpu; /* % of recent cpu time used by all lwps 62ushort_t
   * pr_pctmem; /* % of system memory used by process 62timestruc_t pr_start;
   * /* process start time, from the epoch 94timestruc_t pr_time; /* usr+sys
   * cpu time for this process 126timestruc_t pr_ctime; /* usr+sys cpu time
   * for reaped children 158char pr_fname[PRFNSZ]; /* name of execed file char
   * pr_psargs[PRARGSZ]; /* initial characters of arg list int pr_wstat; /* if
   * zombie, the wait() status int pr_argc; /* initial argument count
   * uintptr_t pr_argv; /* address of initial argument vector uintptr_t
   * pr_envp; /* address of initial environment vector char pr_dmodel; /* data
   * model of the process char pr_pad2[3]; taskid_t pr_taskid; /* task id
   * projid_t pr_projid; /* project id int pr_nzomb; /* number of zombie lwps
   * in the process poolid_t pr_poolid; /* pool id zoneid_t pr_zoneid; /* zone
   * id id_t pr_contract; /* process contract int pr_filler[1]; /* reserved
   * for future use lwpsinfo_t pr_lwp; /* information for representative lwp }
   * psinfo_t;
   */

  static int  PRARGSZ  = 80/* number of chars of arguments */

  public static class psinfo
  {
    ByteBuffer  _b;

    psinfo(ByteBuffer b)
    {
      _b = b;
    }

    int getPid()
    {
      return _b.getInt(8);
    }

    int getNlwp()
    {
      return _b.getInt(4);
    }

    int getPctcpu()
    {
      return (int) (((double) _b.getShort(60)) * 100) / 0x8000;
    }

    int getPr_size()
    {
      return _b.getInt(44);
    }

  }

  public int getStdOutNo()
  {
    return 1;
  }

  public int getStdErrNo()
  {
    return 2;
  }

  public int getStdInNo()
  {
    return 3;
  }

  public static Process getProcess(int pid)
  {
    SolarisProcess result = null;
    File f = new File("/proc/" + pid);
    if (f.exists())
    {
      result = new SolarisProcess();
      result._pid = pid;
      result._user = result.getUserInternal();
      result._cmd = result.getCommandInternal();
      result._workingDir = result.getWorkingDirInternal();
    }
    return result;
  }

  private String getCommandInternal()
  {
    String result = _utils.osCommand(String.format("pargs -l %1$s", _pid), 5000);
    if (result == null)
      result = "?";
    // System.out.println("cmd line: "+result);
    return result;
  }

  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];
  }

  private psinfo getPsinfo()
  {
    FileChannel in;
    try
    {
      in = new FileInputStream(String.format("/proc/%1$s/psinfo", _pid)).getChannel();
    }
    catch (FileNotFoundException e)
    {
      System.out.println("error in getCurrentThreads() " + e.getMessage());
      return null;
    }
    int size;
    try
    {
      size = (int) in.size();
    }
    catch (IOException e)
    {
      System.out.println("error in getCurrentThreads() " + e.getMessage());
      return null;
    }
    ByteBuffer b = ByteBuffer.allocateDirect(size);
    b.order(ByteOrder.LITTLE_ENDIAN);
    try
    {
      in.read(b);
    }
    catch (IOException e)
    {
      System.out.println("error in getCurrent*() " + e.getMessage());
      return null;
    }
    psinfo s = new psinfo(b);
    try
    {
      in.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
    return s;
  }

  public int getCurrentCpu()
  {
    int result = -1;
    if (!isRunning())
      return result;
    psinfo s = getPsinfo();
    if (s == null)
      return -1;
    return s.getPctcpu();
  }

  public int getCurrentThreads()
  {
    int result = -1;
    if (!isRunning())
      return result;
    psinfo s = getPsinfo();
    if (s == null)
      return -1;
    return s.getNlwp();
  }

  public int getCurrentVirtualMemory()
  {
    int result = -1;
    if (!isRunning())
      return result;
    psinfo s = getPsinfo();
    if (s == null)
      return -1;
    return s.getPr_size() * 1024;
  }

  protected String getWorkingDirInternal()
  {

    String f = "/proc/" + getPid() + "/cwd";
    short BUFSIZE = 512;
    Memory result = new Memory(BUFSIZE);
    result.clear();
    short size = CLibrary.INSTANCE.readlink(f, result, (short) (BUFSIZE - 1));
    if (size <= 0)
    {
      System.out.println("error reading process working dir -> please edit wrapper.working.dir in configuration file");
      return f;
    }
    result.setByte((long) size, (byte) 0);
    return result.getString(0);

    /*
     * String result = null; File f = new File("/proc/" + getPid() +
     * "/cwd"); try { result = f.getCanonicalPath(); } catch (IOException e)
     * { e.printStackTrace(); } return result;
     */

  }

}
 
TOP

Related Classes of org.rzo.yajsw.os.posix.solaris.SolarisProcess$psinfo

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.