This is the mail archive of the frysk@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]

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_:

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