public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Maintain a local ProcessIdentifier indexed table of processes.
Date: Fri, 08 Feb 2008 22:45:00 -0000	[thread overview]
Message-ID: <20080208224548.25229.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  56a8ca502dd2862e7411cf97e2248fb719db5dac (commit)
      from  a92ed3564375cfa4673641a266c79d6c8e520b9f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 56a8ca502dd2862e7411cf97e2248fb719db5dac
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri Feb 8 17:44:18 2008 -0500

    Maintain a local ProcessIdentifier indexed table of processes.
    
    frysk-core/frysk/proc/live/ChangeLog
    2008-02-08  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxPtraceHost.java (procs): New.
    	(getProc(ProcessIdentifier)): New.
    	(putProc(ProcessIdentifier,LinuxPtraceProc)): New.
    	(ProcChanges): Use.
    	* LinuxPtraceProc.java: Use.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/proc/live/ChangeLog            |    6 +++
 frysk-core/frysk/proc/live/LinuxPtraceHost.java |   49 +++++++++++++----------
 frysk-core/frysk/proc/live/LinuxPtraceProc.java |    3 +
 3 files changed, 37 insertions(+), 21 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog
index f2f0210..7cfa15a 100644
--- a/frysk-core/frysk/proc/live/ChangeLog
+++ b/frysk-core/frysk/proc/live/ChangeLog
@@ -1,5 +1,11 @@
 2008-02-08  Andrew Cagney  <cagney@redhat.com>
 
+	* LinuxPtraceHost.java (procs): New.
+	(getProc(ProcessIdentifier)): New.
+	(putProc(ProcessIdentifier,LinuxPtraceProc)): New.
+	(ProcChanges): Use.
+	* LinuxPtraceProc.java: Use.
+	
 	* LinuxPtraceHost.java: Update to match
 	ProcBuilder.build(ProcessIdentifier).
 	* LinuxPtraceProc.java: Ditto.
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceHost.java b/frysk-core/frysk/proc/live/LinuxPtraceHost.java
index 09fe0a7..4aab80e 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceHost.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceHost.java
@@ -62,8 +62,6 @@ import frysk.sys.Pid;
 import frysk.event.Event;
 import frysk.proc.FindProc;
 import frysk.proc.HostRefreshBuilder;
-import java.util.Map;
-import java.util.WeakHashMap;
 import java.util.Collection;
 
 /**
@@ -83,7 +81,7 @@ public class LinuxPtraceHost extends LiveHost {
     /**
      * Maintain a cache of tasks indexed by ProcessIdentifier.
      */
-    private final Map tasks = new WeakHashMap();
+    private final HashMap tasks = new HashMap();
     LinuxPtraceTask getTask(ProcessIdentifier pid) {
 	return (LinuxPtraceTask) tasks.get(pid);
     }
@@ -92,6 +90,17 @@ public class LinuxPtraceHost extends LiveHost {
     }
 
     /**
+     * Maintain a cache of procs indexed by ProcessIdentifier.
+     */
+    private final HashMap procs = new HashMap();
+    LinuxPtraceProc getProc(ProcessIdentifier pid) {
+	return (LinuxPtraceProc) procs.get(pid);
+    }
+    void putProc(ProcessIdentifier pid, LinuxPtraceProc proc) {
+	procs.put(pid, proc);
+    }
+
+    /**
      * Either add or update a process, however, before doing that
      * determine the parent and ensure that it has been updated.
      */
@@ -107,14 +116,13 @@ public class LinuxPtraceHost extends LiveHost {
 	 * works backwards removing any that are processed, by the end
 	 * it contains processes that no longer exist.
 	 */
-	HashMap removed = (HashMap) ((HashMap) procPool).clone();
+	HashMap removed = (HashMap) procs.clone();
 
 	/**
 	 * Update PROCID, either adding it
 	 */
 	Proc update(ProcessIdentifier pid) {
-	    ProcId procId = new ProcId(pid.intValue());
-	    Proc proc = (Proc) procPool.get(procId);
+	    Proc proc = getProc(pid);
 	    if (proc == null) {
 		// New, unknown process. Try to find both the process
 		// and its parent. In the case of a daemon process, a
@@ -130,7 +138,7 @@ public class LinuxPtraceHost extends LiveHost {
 		    // Scan in the process's stat file. Of course, if
 		    // the stat file disappeared indicating that the
 		    // process exited, return NULL.
-		    if (! stat.refresh(procId.id))
+		    if (stat.scan(pid) == null)
 			return null;
 		    // Find the parent, every process, except process
 		    // 1, has a parent.
@@ -141,10 +149,10 @@ public class LinuxPtraceHost extends LiveHost {
 			break;
 		}
 		// .. and then add this process.
-		proc = new LinuxPtraceProc(LinuxPtraceHost.this, parent, procId, stat);
+		proc = new LinuxPtraceProc(LinuxPtraceHost.this, parent,
+					   new ProcId(pid.intValue()), stat);
 		added.add(proc);
-	    }
-	    else if (removed.get(procId) != null) {
+	    } else if (removed.containsKey(pid)) {
 		// Process 1 never gets a [new] parent.
 		if (pid.intValue() > 1) {
 		    Stat stat = ((LinuxPtraceProc) proc).getStat();
@@ -163,7 +171,7 @@ public class LinuxPtraceHost extends LiveHost {
 			newParent.add(proc);
 		    }
 		}
-		removed.remove(procId);
+		removed.remove(pid);
 	    }
 	    return proc;
 	}
@@ -215,21 +223,20 @@ public class LinuxPtraceHost extends LiveHost {
 
     public void requestProc(final int theProcId, final FindProc theFinder) {
 	Manager.eventLoop.add(new Event() {
-		private final int procId = theProcId;
+		private final ProcessIdentifier pid
+		    = ProcessIdentifierFactory.create(theProcId);
 		private final FindProc finder = theFinder;
 		public void execute() {
 		    // Iterate (build) the /proc tree starting with
 		    // the given procId.
-		    final ProcChanges procChanges = new ProcChanges();
-		    ProcBuilder pidBuilder = new ProcBuilder() {
-			    public void build(ProcessIdentifier pid) {
-				procChanges.update(pid);
-			    }
-			};
-		    pidBuilder.construct(procId);
-		    final Proc proc = Manager.host.getProc(new ProcId(procId));
+		    new ProcBuilder() {
+			public void build(ProcessIdentifier pid) {
+			    new ProcChanges().update(pid);
+			}
+		    }.construct(pid);
+		    Proc proc = getProc(pid);
 		    if (proc == null) {
-			finder.procNotFound(procId);
+			finder.procNotFound(pid.intValue());
 		    } else {
 			proc.sendRefresh();
 			finder.procFound(proc);
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceProc.java b/frysk-core/frysk/proc/live/LinuxPtraceProc.java
index b805fba..1147982 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceProc.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceProc.java
@@ -53,6 +53,7 @@ import java.util.ArrayList;
 import frysk.sys.proc.CmdLineBuilder;
 import frysk.sys.proc.MapsBuilder;
 import frysk.sys.ProcessIdentifier;
+import frysk.sys.ProcessIdentifierFactory;
 import frysk.sys.proc.Status;
 import java.util.logging.Level;
 import frysk.sys.proc.ProcBuilder;
@@ -76,6 +77,7 @@ public class LinuxPtraceProc extends LiveProc {
      */
     public LinuxPtraceProc(Host host, Proc parent, ProcId pid, Stat stat) {
 	super(host, parent, pid);
+	((LinuxPtraceHost)host).putProc(ProcessIdentifierFactory.create(pid.hashCode()), this);
 	this.newState = LinuxPtraceProcState.initial(false);
 	this.stat = stat;
 	this.breakpoints = new BreakpointAddresses(this);
@@ -86,6 +88,7 @@ public class LinuxPtraceProc extends LiveProc {
      */
     public LinuxPtraceProc(Task task, ProcessIdentifier fork) {
 	super(task, new ProcId(fork.intValue()));
+	((LinuxPtraceHost)getHost()).putProc(fork, this);
 	this.newState = LinuxPtraceProcState.initial(true);
 	this.breakpoints = new BreakpointAddresses(this);
     }


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-02-08 22:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080208224548.25229.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).