This is the mail archive of the frysk-cvs@sources.redhat.com mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[SCM] master: Maintain a task list indexed by ProcessIdentifier.


The branch, master has been updated
       via  d54209223897ff92941df463fb87059a1e6afbf4 (commit)
      from  eac0c5123c615be6efa3ca1738175ea0a59be132 (commit)

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

- Log -----------------------------------------------------------------
commit d54209223897ff92941df463fb87059a1e6afbf4
Author: Andrew Cagney <cagney@redhat.com>
Date:   Thu Feb 7 15:46:54 2008 -0500

    Maintain a task list indexed by ProcessIdentifier.
    
    frysk-core/frysk/proc/live/ChangeLog
    2008-02-07  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxPtraceHost.java (getTask(ProcessIdentifier)): New.
    	(putTask(ProcessIdentifier,LinuxPtraceTask)): New.
    	* LinuxWaitBuilder.java (searchId): Delete.
    	(get(ProcessIdentifier,String)): New.
    	* LinuxPtraceTask.java: Register with LinuxPtraceHost.

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

Summary of changes:
 frysk-core/frysk/proc/live/ChangeLog             |    6 ++
 frysk-core/frysk/proc/live/LinuxPtraceHost.java  |   13 +++++
 frysk-core/frysk/proc/live/LinuxPtraceTask.java  |    3 +
 frysk-core/frysk/proc/live/LinuxWaitBuilder.java |   56 ++++++++-------------
 4 files changed, 43 insertions(+), 35 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog
index c38ab2b..86391b7 100644
--- a/frysk-core/frysk/proc/live/ChangeLog
+++ b/frysk-core/frysk/proc/live/ChangeLog
@@ -1,5 +1,11 @@
 2008-02-07  Andrew Cagney  <cagney@redhat.com>
 
+	* LinuxPtraceHost.java (getTask(ProcessIdentifier)): New.
+	(putTask(ProcessIdentifier,LinuxPtraceTask)): New.
+	* LinuxWaitBuilder.java (searchId): Delete.
+	(get(ProcessIdentifier,String)): New.
+	* LinuxPtraceTask.java: Register with LinuxPtraceHost.
+
 	* LinuxPtraceHost.java (requestRefreshXXX()): Delete.
 	* TestTaskObserverBlocked.java: Update.
 	
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceHost.java b/frysk-core/frysk/proc/live/LinuxPtraceHost.java
index 67ae93b..5e89a41 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceHost.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceHost.java
@@ -61,6 +61,8 @@ 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;
 
 /**
@@ -78,6 +80,17 @@ public class LinuxPtraceHost extends LiveHost {
 
 
     /**
+     * Maintain a cache of tasks indexed by ProcessIdentifier.
+     */
+    private final Map tasks = new WeakHashMap();
+    LinuxPtraceTask getTask(ProcessIdentifier pid) {
+	return (LinuxPtraceTask) tasks.get(pid);
+    }
+    void putTask(ProcessIdentifier pid, LinuxPtraceTask task) {
+	tasks.put(pid, task);
+    }
+
+    /**
      * Either add or update a process, however, before doing that
      * determine the parent and ensure that it has been updated.
      */
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTask.java b/frysk-core/frysk/proc/live/LinuxPtraceTask.java
index 3753819..51f2ca6 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceTask.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceTask.java
@@ -83,6 +83,7 @@ public class LinuxPtraceTask extends LiveTask {
     public LinuxPtraceTask(Proc proc, TaskId id) {
 	super(proc, id);
 	tid = ProcessIdentifierFactory.createFIXME(id.hashCode());
+	((LinuxPtraceHost)proc.getHost()).putTask(tid, this);
 	newState = LinuxPtraceTaskState.detachedState();
     }
     /**
@@ -92,6 +93,7 @@ public class LinuxPtraceTask extends LiveTask {
 	// XXX: shouldn't need to grub around in the old task's state.
 	super(task, new TaskId(clone.intValue()));
 	tid = clone;
+	((LinuxPtraceHost)getProc().getHost()).putTask(tid, this);
 	newState = LinuxPtraceTaskState.clonedState(((LinuxPtraceTask)task).getState ());
     }
     /**
@@ -101,6 +103,7 @@ public class LinuxPtraceTask extends LiveTask {
 			   TaskObserver.Attached attached) {
 	super(proc, attached);
 	tid = ProcessIdentifierFactory.createFIXME(proc.getPid());
+	((LinuxPtraceHost)proc.getHost()).putTask(tid, this);
 	newState = LinuxPtraceTaskState.mainState();
 	if (attached != null) {
 	    TaskObservation ob = new TaskObservation(this, attachedObservers,
diff --git a/frysk-core/frysk/proc/live/LinuxWaitBuilder.java b/frysk-core/frysk/proc/live/LinuxWaitBuilder.java
index f16d53e..a583c3f 100644
--- a/frysk-core/frysk/proc/live/LinuxWaitBuilder.java
+++ b/frysk-core/frysk/proc/live/LinuxWaitBuilder.java
@@ -44,24 +44,25 @@ import frysk.sys.Signal;
 import frysk.sys.WaitBuilder;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import frysk.proc.TaskId;
+import frysk.rsl.Log;
 import frysk.proc.Task;
 import frysk.proc.TaskObserver;
 import frysk.sys.ProcessIdentifier;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * Handles wait events generated by the wait builder.
  */
 
 class LinuxWaitBuilder implements WaitBuilder {
-    LinuxWaitBuilder (LinuxPtraceHost host)
-    {
-	searchId = new SearchId (host);
-    }
+    private static final Logger logger = Logger.getLogger("frysk");
+    private static final Log fine = Log.fine(LinuxWaitBuilder.class);
 
-    static final Logger logger = Logger.getLogger("frysk");
+    private final LinuxPtraceHost host;
+    LinuxWaitBuilder(LinuxPtraceHost host) {
+	this.host = host;
+    }
 
     /**
      * Maintain a list of fscked up kernel waitpid events - where an
@@ -102,29 +103,14 @@ class LinuxWaitBuilder implements WaitBuilder {
 		    return "" + super.toString () + ",stopped,pid=" + pid;
 		}
 	    };
-	logger.log(Level.FINE, "{0} rescheduled\n", rescheduled);
+	fine.log(this, "rescheduled", rescheduled);
 	fsckedOrderedKernelEvents.add(rescheduled);
     }
     
-    // Hold onto a scratch ID; avoids overhead of allocating a new
-    // taskId everytime a new event arrives -- micro optimization..
-    static class SearchId extends TaskId {
-	private final LinuxPtraceHost host;
-	SearchId (LinuxPtraceHost host) {
-	    super (0);
-	    this.host = host;
-	}
-	LinuxPtraceTask get(int pid, String why) {
-	    id = pid;
-	    logger.log(Level.FINE, why, this);
-	    return (LinuxPtraceTask) (host.get(this));
-	}
-	LinuxPtraceTask get(ProcessIdentifier pid, String why) {
-	    logger.log(Level.FINE, why, pid);
-	    return get(pid.intValue(), why);
-	}
+    private LinuxPtraceTask get(ProcessIdentifier pid, String why) {
+	fine.log(this, why, pid);
+	return host.getTask(pid);
     }
-    private final SearchId searchId;
     
     private void logMissing(String what, ProcessIdentifier pid) {
 	logger.log(Level.WARNING,
@@ -140,7 +126,7 @@ class LinuxWaitBuilder implements WaitBuilder {
         // what happened. Note that hot on the heels of this event is
         // a clone.stopped event, and the clone Task must be created
         // before that event arrives.
-        LinuxPtraceTask task = searchId.get(pid, "{0} cloneEvent\n");
+        LinuxPtraceTask task = get(pid, "cloneEvent");
         // Create an attached, and running, clone of TASK.
         LinuxPtraceTask clone = new LinuxPtraceTask(task, clonePid);
         task.processClonedEvent(clone);
@@ -153,7 +139,7 @@ class LinuxWaitBuilder implements WaitBuilder {
         // happened. Note that hot on the heels of this fork event is
         // the child's stop event, the fork Proc must be created
         // before that event arrives.
-        LinuxPtraceTask task = searchId.get(pid, "{0} forkEvent\n");
+        LinuxPtraceTask task = get(pid, "forkEvent");
         // Create an attached and running fork of TASK.
         LinuxPtraceProc forkProc = new LinuxPtraceProc(task, fork);
         // The main task.
@@ -165,7 +151,7 @@ class LinuxWaitBuilder implements WaitBuilder {
     
     public void exitEvent(ProcessIdentifier pid, Signal signal,
 			  int status, boolean coreDumped) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} exitEvent\n");
+        LinuxPtraceTask task = get(pid, "exitEvent");
 	if (task == null)
 	    // Stray pid from uncontrolled fork.
 	    logMissing("exited", pid);
@@ -174,12 +160,12 @@ class LinuxWaitBuilder implements WaitBuilder {
     }
     
     public void execEvent(ProcessIdentifier pid) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} execEvent\n");
+        LinuxPtraceTask task = get(pid, "execEvent");
         task.processExecedEvent();
     }
     
     public void disappeared(ProcessIdentifier pid, Throwable w) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} disappeared\n");
+        LinuxPtraceTask task = get(pid, "disappeared");
         // XXX Sometimes it seems it has already disappeared and this fails
         // Catch the failure, but not sure what to do with the failure right now
         // Failures were seen here while running frysk.hpd.TestRunCommand -r 20
@@ -189,12 +175,12 @@ class LinuxWaitBuilder implements WaitBuilder {
     }
 
     public void syscallEvent(ProcessIdentifier pid) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} syscallEvent\n");
+        LinuxPtraceTask task = get(pid, "syscallEvent");
         task.processSyscalledEvent();
     }
     
     public void stopped(ProcessIdentifier pid, Signal sig) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} stopped\n");
+        LinuxPtraceTask task = get(pid, "stopped");
 	if (task == null) {
 	    // If there's no Task corresponding to TID, assume that
 	    // the kernel fscked up its event ordering - notifying of
@@ -209,7 +195,7 @@ class LinuxWaitBuilder implements WaitBuilder {
     
     public void terminated(ProcessIdentifier pid, Signal signal,
 			   int status, boolean coreDumped) {
-        LinuxPtraceTask task = searchId.get(pid, "{0} terminated\n");
+        LinuxPtraceTask task = get(pid, "terminated");
 	if (task == null)
 	    // Stray pid from uncontrolled fork.
 	    logMissing("terminated", pid);


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]