From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31647 invoked by alias); 14 Feb 2008 16:38:37 -0000 Received: (qmail 31550 invoked by uid 367); 14 Feb 2008 16:38:35 -0000 Date: Thu, 14 Feb 2008 16:38:00 -0000 Message-ID: <20080214163835.31532.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Change Status to a scanner class like Stat; update. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 6f90ccc376e5bc50e2ad3a6cd97f1424660d6329 X-Git-Newrev: e5a826018181d156023024ce27a707bbfb62c0a0 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q1/txt/msg00211.txt.bz2 The branch, master has been updated via e5a826018181d156023024ce27a707bbfb62c0a0 (commit) from 6f90ccc376e5bc50e2ad3a6cd97f1424660d6329 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit e5a826018181d156023024ce27a707bbfb62c0a0 Author: Andrew Cagney Date: Thu Feb 14 11:38:11 2008 -0500 Change Status to a scanner class like Stat; update. frysk-core/frysk/isa/corefiles/ChangeLog 2008-02-14 Andrew Cagney * IA32LinuxElfCorefile.java: Delete use of Status. * PPC64LinuxElfCorefile.java: Ditto. * PPC32LinuxElfCorefile.java: Ditto. * X8664LinuxElfCorefile.java: Ditto. frysk-core/frysk/proc/live/ChangeLog 2008-02-14 Andrew Cagney * LinuxPtraceProc.java: Update to match Status. * LinuxPtraceTaskState.java: Ditto. frysk-sys/frysk/sys/proc/ChangeLog 2008-02-14 Andrew Cagney * Status.java: Rewrite. * TestStatus.java: Update. * cni/Status.cxx (Status::scan): Update. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/isa/corefiles/ChangeLog | 7 + .../frysk/isa/corefiles/IA32LinuxElfCorefile.java | 5 +- .../frysk/isa/corefiles/PPC32LinuxElfCorefile.java | 5 +- .../frysk/isa/corefiles/PPC64LinuxElfCorefile.java | 5 +- .../frysk/isa/corefiles/X8664LinuxElfCorefile.java | 5 +- frysk-core/frysk/proc/live/ChangeLog | 3 + frysk-core/frysk/proc/live/LinuxPtraceProc.java | 8 +- .../frysk/proc/live/LinuxPtraceTaskState.java | 6 +- frysk-sys/frysk/sys/proc/ChangeLog | 6 + frysk-sys/frysk/sys/proc/Status.java | 116 ++++++-------------- frysk-sys/frysk/sys/proc/TestStatus.java | 55 ++++----- frysk-sys/frysk/sys/proc/cni/Status.cxx | 82 +++++++++++++- 12 files changed, 168 insertions(+), 135 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/isa/corefiles/ChangeLog b/frysk-core/frysk/isa/corefiles/ChangeLog index da92ce7..086d81c 100644 --- a/frysk-core/frysk/isa/corefiles/ChangeLog +++ b/frysk-core/frysk/isa/corefiles/ChangeLog @@ -1,3 +1,10 @@ +2008-02-14 Andrew Cagney + + * IA32LinuxElfCorefile.java: Delete use of Status. + * PPC64LinuxElfCorefile.java: Ditto. + * PPC32LinuxElfCorefile.java: Ditto. + * X8664LinuxElfCorefile.java: Ditto. + 2008-02-13 Andrew Cagney * IA32LinuxElfCorefile.java: Update to match Status. diff --git a/frysk-core/frysk/isa/corefiles/IA32LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/IA32LinuxElfCorefile.java index fd2fe28..7fc5bcc 100644 --- a/frysk-core/frysk/isa/corefiles/IA32LinuxElfCorefile.java +++ b/frysk-core/frysk/isa/corefiles/IA32LinuxElfCorefile.java @@ -61,7 +61,6 @@ import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; -import frysk.sys.proc.Status; /** * LinuxElfCorefilex86. Extends LinuxCorefile. Fill in @@ -120,8 +119,8 @@ public class IA32LinuxElfCorefile extends LinuxElfCorefile { // Set rest of prpsinfo prpsInfo.setPrFlag(processStat.flags); - prpsInfo.setPrUid(Status.getUID(ProcessIdentifierFactory.create(pid))); - prpsInfo.setPrGid(Status.getGID(ProcessIdentifierFactory.create(pid))); + prpsInfo.setPrUid(process.getUID()); + prpsInfo.setPrGid(process.getGID()); prpsInfo.setPrPid(pid); prpsInfo.setPrPpid(processStat.ppid.intValue()); diff --git a/frysk-core/frysk/isa/corefiles/PPC32LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/PPC32LinuxElfCorefile.java index 93cc4e0..e418179 100644 --- a/frysk-core/frysk/isa/corefiles/PPC32LinuxElfCorefile.java +++ b/frysk-core/frysk/isa/corefiles/PPC32LinuxElfCorefile.java @@ -65,7 +65,6 @@ import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; -import frysk.sys.proc.Status; /** * PPC32LinuxElfCorefile. Extends LinuxCorefile. Fill in @@ -125,8 +124,8 @@ public class PPC32LinuxElfCorefile extends LinuxElfCorefile { // Set rest of prpsinfo prpsInfo.setPrFlag(processStat.flags); - prpsInfo.setPrUid(Status.getUID(ProcessIdentifierFactory.create(pid))); - prpsInfo.setPrGid(Status.getGID(ProcessIdentifierFactory.create(pid))); + prpsInfo.setPrUid(process.getUID()); + prpsInfo.setPrGid(process.getGID()); prpsInfo.setPrPid(pid); prpsInfo.setPrPpid(processStat.ppid.intValue()); diff --git a/frysk-core/frysk/isa/corefiles/PPC64LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/PPC64LinuxElfCorefile.java index 7fc9005..cf31acf 100644 --- a/frysk-core/frysk/isa/corefiles/PPC64LinuxElfCorefile.java +++ b/frysk-core/frysk/isa/corefiles/PPC64LinuxElfCorefile.java @@ -64,7 +64,6 @@ import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; -import frysk.sys.proc.Status; /** * PPC64LinuxElfCorefile. Extends LinuxCorefile. Fill in @@ -124,8 +123,8 @@ public class PPC64LinuxElfCorefile extends LinuxElfCorefile { // Set rest of prpsinfo prpsInfo.setPrFlag(processStat.flags); - prpsInfo.setPrUid(Status.getUID(ProcessIdentifierFactory.create(pid))); - prpsInfo.setPrGid(Status.getGID(ProcessIdentifierFactory.create(pid))); + prpsInfo.setPrUid(process.getUID()); + prpsInfo.setPrGid(process.getGID()); prpsInfo.setPrPid(pid); prpsInfo.setPrPpid(processStat.ppid.intValue()); diff --git a/frysk-core/frysk/isa/corefiles/X8664LinuxElfCorefile.java b/frysk-core/frysk/isa/corefiles/X8664LinuxElfCorefile.java index 6197f31..2a27a1b 100644 --- a/frysk-core/frysk/isa/corefiles/X8664LinuxElfCorefile.java +++ b/frysk-core/frysk/isa/corefiles/X8664LinuxElfCorefile.java @@ -60,7 +60,6 @@ import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; -import frysk.sys.proc.Status; /** * X8664LinuxElfCorefile. Extends LinuxCorefile. Fill in @@ -120,8 +119,8 @@ public class X8664LinuxElfCorefile extends LinuxElfCorefile { // Set rest of prpsinfo prpsInfo.setPrFlag(processStat.flags); - prpsInfo.setPrUid(Status.getUID(ProcessIdentifierFactory.create(pid))); - prpsInfo.setPrGid(Status.getGID(ProcessIdentifierFactory.create(pid))); + prpsInfo.setPrUid(process.getUID()); + prpsInfo.setPrGid(process.getGID()); prpsInfo.setPrPid(pid); prpsInfo.setPrPpid(processStat.ppid.intValue()); diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog index 0cec713..d370c3e 100644 --- a/frysk-core/frysk/proc/live/ChangeLog +++ b/frysk-core/frysk/proc/live/ChangeLog @@ -1,5 +1,8 @@ 2008-02-14 Andrew Cagney + * LinuxPtraceProc.java: Update to match Status. + * LinuxPtraceTaskState.java: Ditto. + * LiveTask.java: Update to match Task. * LinuxPtraceProc.java: Ditto. * LinuxPtraceHost.java: Ditto. diff --git a/frysk-core/frysk/proc/live/LinuxPtraceProc.java b/frysk-core/frysk/proc/live/LinuxPtraceProc.java index 2c179c3..e5808f5 100644 --- a/frysk-core/frysk/proc/live/LinuxPtraceProc.java +++ b/frysk-core/frysk/proc/live/LinuxPtraceProc.java @@ -176,11 +176,15 @@ public class LinuxPtraceProc extends LiveProc { } public int getUID() { - return Status.getUID(ProcessIdentifierFactory.create(getPid())); + Status status = new Status(); + status.scan(ProcessIdentifierFactory.create(getPid())); + return status.uid; } public int getGID() { - return Status.getGID(ProcessIdentifierFactory.create(getPid())); + Status status = new Status(); + status.scan(ProcessIdentifierFactory.create(getPid())); + return status.gid; } /** diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java index ff60e45..f84ab24 100644 --- a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java +++ b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java @@ -181,13 +181,15 @@ class LinuxPtraceTaskState extends State { LinuxPtraceTaskState handleAttach(LinuxPtraceTask task) { logger.log(Level.FINE, "{0} handleAttach\n", task); task.sendAttach(); + Status status = new Status(); + status.scan(task.tid); if (task.getProc().getMainTask() == task - && Status.isStopped(task.tid)) { + && status.stoppedState) { // The attach has been initiated on the main // task of the process; the process state // should transition to (T) TRACED. If it is // instead (T) STOPPED then the process is - // stuck (suspended), send it a SIGSTOP to + // stuck (suspended), send it a SIGCONT to // unwedge it. /proc/status is used as that // differentiates between STOPPED an TRACED. logger.log(Level.FINE, diff --git a/frysk-sys/frysk/sys/proc/ChangeLog b/frysk-sys/frysk/sys/proc/ChangeLog index 4ebb3a3..0ba620c 100644 --- a/frysk-sys/frysk/sys/proc/ChangeLog +++ b/frysk-sys/frysk/sys/proc/ChangeLog @@ -1,3 +1,9 @@ +2008-02-14 Andrew Cagney + + * Status.java: Rewrite. + * TestStatus.java: Update. + * cni/Status.cxx (Status::scan): Update. + 2008-02-13 Andrew Cagney * Status.java (getGID(ProcessIdentifier)): Replace getGID(int). diff --git a/frysk-sys/frysk/sys/proc/Status.java b/frysk-sys/frysk/sys/proc/Status.java index d3414e7..0590f4e 100644 --- a/frysk-sys/frysk/sys/proc/Status.java +++ b/frysk-sys/frysk/sys/proc/Status.java @@ -39,6 +39,7 @@ package frysk.sys.proc; +import frysk.rsl.Log; import frysk.sys.ProcessIdentifier; /** @@ -52,107 +53,56 @@ import frysk.sys.ProcessIdentifier; */ public class Status { + private static final Log fine = Log.fine(Status.class); - private native static byte[] statusSlurp (int pid); - - /** - * Converts a byte[] data structure to a - * String[] data structure - * @param byteBuffer[] - source byte byffer - * @return String[] - converted String buffer - */ - private static String[] byteBuffertoStringbuffer(byte[] byteBuffer) { - String byteString = new String(byteBuffer); - return byteString.split("\n"); + public Status() { } + public String toString() { + if (pid != null) + return "/proc/" + pid + "/status"; + else + return super.toString(); + } + + public Status scan(ProcessIdentifier pid) { + fine.log(this, "stan", pid); + this.pid = pid; + return scan(pid.intValue()); + } + private native Status scan(int pid); /** - * Given a byte[] buffer from /proc/$$/status - * find and return either GID or UID. - * @param idType - Type to return. Accepts Gid or Uid - * @param byteidBuffer - buffer to search. - * @return int either GID or UID of process, or -1 on error. + * For testing only; package private. */ - private static int getID(String idType, byte[] byteidBuffer) { - // As fetching a GID/UID are very similar we just pass of the - // search code to a simple lookup method - String[] idBuffer = byteBuffertoStringbuffer(byteidBuffer); - int idIndex = 5; - int idIndexEnd = 0; - for (int i=0; i= 0; - } + public boolean stoppedState; } diff --git a/frysk-sys/frysk/sys/proc/TestStatus.java b/frysk-sys/frysk/sys/proc/TestStatus.java index e855a82..e826c64 100644 --- a/frysk-sys/frysk/sys/proc/TestStatus.java +++ b/frysk-sys/frysk/sys/proc/TestStatus.java @@ -40,21 +40,19 @@ package frysk.sys.proc; import frysk.junit.TestCase; +import frysk.sys.Pid; /** * Test the Status getUID() and getGID() a predefined set of * /proc$$/status buffer. */ -public class TestStatus - extends TestCase -{ - public void testParseStatusGetID() - { +public class TestStatus extends TestCase { + public void testParseStatusGetID() { // Construct valid status buffer - String[] status = new String[] { + String[] statusBuf = new String[] { "Name:\tgaim\n", - "State:\tS (sleeping)\n", + "State:\tT (stopped)\n", "SleepAVG:\t88%\n", "Tgid:\t2765\n", "Pid:\t2765\n", @@ -87,31 +85,20 @@ public class TestStatus "SigCgt:\t0000000180014407\n", "CapInh:\t0000000000000000\n", "CapPrm:\t0000000000000000\n", - "CapEff:\t0000000000000000"}; + "CapEff:\t0000000000000000\n" + }; - byte[] buf = TestLib.stringsToBytes (status); + byte[] buf = TestLib.stringsToBytes(statusBuf); + Status status = new Status().scan(buf); + assertNotNull("status", status); // Test normal-expected results from a valid status buffer - assertEquals ("Normal Process UID", 500, Status.getUID(buf)); - assertEquals ("Normal Process GID", 500, Status.getGID(buf)); + assertEquals("Process UID", 500, status.uid); + assertEquals("Process GID", 500, status.gid); + assertEquals("Process Stopped State", true, status.stoppedState); } - public void testParseStatusNullBufferGetID() - { - // Test abnormal-expected results from invald status buffers - - // Test null buffer - - assertEquals("Null Buffer Process UID", -1, - Status.getUID((byte[])null)); - assertEquals("Null Buffer Process GID", -1, - Status.getGID((byte[])null)); - - } - - - public void testParseStatusInvalidBufferGetID() - { + public void testParseStatusInvalidBufferGetID() { // Test abnormal-expected results from invald status buffers // Test non-null but invalid buffer @@ -121,10 +108,18 @@ public class TestStatus "We stuck, nor breath nor motion;\n", "As idle as a painted ship\n", "Upon a painted ocean."}; - byte[] buf = TestLib.stringsToBytes(randomText); + Status status = new Status(); + assertNull("scan", status.scan(buf)); + + assertEquals("Non null Buffer, invalid text Process UID", -1, + status.uid); + assertEquals("Non null Buffer, invalid text Process GID", -1, + status.gid); + } - assertEquals("Non null Buffer, invalid text Process UID", -1, Status.getUID(buf)); - assertEquals("Non null Buffer, invalid text Process GID", -1, Status.getGID(buf)); + public void testSelf() { + Status status = new Status(); + assertNotNull("status value", status.scan(Pid.get())); } } diff --git a/frysk-sys/frysk/sys/proc/cni/Status.cxx b/frysk-sys/frysk/sys/proc/cni/Status.cxx index 62c4911..9cb6813 100644 --- a/frysk-sys/frysk/sys/proc/cni/Status.cxx +++ b/frysk-sys/frysk/sys/proc/cni/Status.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2006, Red Hat Inc. +// Copyright 2006, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,17 +37,87 @@ // version and license this file solely under the GPL without // exception. +#include +#include +#include + #include #include "frysk/sys/proc/cni/slurp.hxx" #include "frysk/sys/cni/Errno.hxx" #include "frysk/sys/proc/Status.h" +#include "frysk/rsl/Log.h" +#include "frysk/rsl/cni/Log.hxx" #include "java/lang/String.h" -jbyteArray -frysk::sys::proc::Status::statusSlurp (jint pid) -{ - jbyteArray buf = slurp (pid, "status"); - return buf; +static bool +scan(const char** p, jint* val, const char* prefix) { + (*p) = strstr((*p), prefix); + if ((*p) == NULL) + return false; + (*p) += strlen(prefix); + char *endp; + (*val) = strtol((*p), &endp, 10); + if ((*p) == endp) + return false; + return true; +} + +static frysk::sys::proc::Status* +scan(const char *p, frysk::sys::proc::Status* const status, + frysk::rsl::Log* const fine) { + // Clear everything + status->state = '\0'; + status->stoppedState = false; + status->uid = -1; + status->gid = -1; + + // STATE (SUBSTATE) + const char *state = "\nState:"; + p = strstr(p, state); + if (p == NULL) + return NULL; + p += strlen(state); + for (; (*p) != '\r' && (*p) != '\0'; p++) { + char c = (*p); + if (isspace(c)) + continue; + if (strchr("RSDZTW", c) != NULL) { + status->state = c; + logf(fine, "state '%c'", c); + const char *stopped = " (stopped)"; + status->stoppedState = strncmp(p + 1, stopped, strlen(stopped)) == 0; + logf(fine, "stopped %s", status->stoppedState ? "true" : "false"); + break; + } + } + if (state == '\0') hooks/post-receive -- frysk system monitor/debugger