From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8399 invoked by alias); 7 Feb 2008 20:47:51 -0000 Received: (qmail 8373 invoked by uid 367); 7 Feb 2008 20:47:50 -0000 Date: Thu, 07 Feb 2008 20:47:00 -0000 Message-ID: <20080207204750.8358.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Maintain a task list indexed by ProcessIdentifier. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: eac0c5123c615be6efa3ca1738175ea0a59be132 X-Git-Newrev: d54209223897ff92941df463fb87059a1e6afbf4 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/msg00173.txt.bz2 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 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 * 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 + * 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