This is the mail archive of the
frysk@sources.redhat.com
mailing list for the frysk project.
try this on your kernel
- From: Andrew Cagney <cagney at redhat dot com>
- To: Phil Muldoon <pmuldoon at redhat dot com>
- Cc: frysk <frysk at sources dot redhat dot com>
- Date: Fri, 18 Aug 2006 16:06:59 -0400
- Subject: try this on your kernel
Phil,
Can you give this a spin on your kernel?
Andrew
Index: frysk-core/frysk/proc/LinuxHost.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/proc/LinuxHost.java,v
retrieving revision 1.55
diff -p -u -r1.55 LinuxHost.java
--- frysk-core/frysk/proc/LinuxHost.java 16 Aug 2006 10:58:50 -0000 1.55
+++ frysk-core/frysk/proc/LinuxHost.java 18 Aug 2006 20:04:44 -0000
@@ -40,6 +40,7 @@
package frysk.proc;
+import frysk.event.Event;
import frysk.event.EventLoop;
import frysk.event.SignalEvent;
import frysk.sys.Ptrace;
@@ -241,6 +242,48 @@ public class LinuxHost
Wait.Observer waitObserver = new Wait.Observer()
{
+ /**
+ * Maintain a list of fscked up kernel waitpid events - where
+ * an event for a pid arrives before it has been created - so
+ * that they can be re-processed when there's a fork.
+ */
+ private List fsckedOrderedKernelEvents;
+ /**
+ * Run through the list of fscked up kernel waitpid events
+ * attempting delivery of each in turn.
+ */
+ private void attemptDeliveringFsckedKernelEvents ()
+ {
+ if (fsckedOrderedKernelEvents != null) {
+ Event[] pending = (Event[]) fsckedOrderedKernelEvents.toArray (new Event[0]);
+ fsckedOrderedKernelEvents = null;
+ for (int i = 0; i < pending.length; i++) {
+ pending[i].execute ();
+ }
+ }
+ }
+ /**
+ * Append the fscked-up stop event (it arrived when the task
+ * didn't exist) to the fscked-up list. Will get re-processed
+ * later.
+ */
+ private void saveFsckedOrderedKernelStopedEvent (final int aPid,
+ final int aSignal)
+ {
+ if (fsckedOrderedKernelEvents == null)
+ fsckedOrderedKernelEvents = new LinkedList ();
+ fsckedOrderedKernelEvents.add (new Event ()
+ {
+ final int pid = aPid;
+ final int signal = aSignal;
+ public void execute ()
+ {
+ waitObserver.stopped (pid, signal);
+ }
+ });
+
+ }
+
// Hold onto a scratch ID; avoids overhead of
// allocating a new taskId everytime a new event
// arrives -- micro optimization..
@@ -300,6 +343,7 @@ public class LinuxHost
throw new RuntimeException("caught TaskException", e);
}
task.processForkedEvent(forkTask);
+ attemptDeliveringFsckedKernelEvents ();
}
public void exitEvent (int pid, boolean signal, int value,
@@ -330,6 +374,10 @@ public class LinuxHost
public void stopped (int pid, int sig)
{
Task task = getTask(pid, "{0} stopped\n");
+ if (task == null) {
+ saveFsckedOrderedKernelStopedEvent (pid, sig);
+ return;
+ }
switch (sig)
{
case Sig.STOP_: