From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1584 invoked by alias); 25 Jan 2008 17:32:07 -0000 Received: (qmail 1544 invoked by uid 367); 25 Jan 2008 17:32:04 -0000 Date: Fri, 25 Jan 2008 17:32:00 -0000 Message-ID: <20080125173204.1529.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: frysk-core/frysk/bindir/ChangeLog X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 814da5d7520162288f0153df0afe06ce4e39f764 X-Git-Newrev: a548829d7ca92f9c2853d83dcf9781ce7a56a488 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/msg00128.txt.bz2 The branch, master has been updated via a548829d7ca92f9c2853d83dcf9781ce7a56a488 (commit) via 9324844373a69121875354223dbbe799279aeb49 (commit) from 814da5d7520162288f0153df0afe06ce4e39f764 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit a548829d7ca92f9c2853d83dcf9781ce7a56a488 Author: Andrew Cagney Date: Fri Jan 25 12:31:06 2008 -0500 frysk-core/frysk/bindir/ChangeLog 2008-01-25 Andrew Cagney * TestFdebuginfo.java (testPathListing()): Mark as unresolved; bug 5671. commit 9324844373a69121875354223dbbe799279aeb49 Author: Andrew Cagney Date: Fri Jan 25 12:22:06 2008 -0500 Initialize the ISA during the task attach. frysk-core/frysk/proc/ChangeLog 2008-01-24 Andrew Cagney * Task.java: Mention that ISA can be null. (clearIsa()): Make protected. frysk-core/frysk/proc/live/ChangeLog 2008-01-25 Andrew Cagney * TestRuntimeIsa.java (assertHasNoIsa(String,Task)): New. (assertHasIsaEquals(String,Task,boolean)): Delete. * LinuxPtraceTask.java (hasIsa()): Delete. (clearIsa()): Make protected. (getISA()): Simplify, throw an NPE when the ISA is null. (sendSetOptions()): Delete. (ptraceOptions): Initialize directly. (startTracingSyscalls(), stopTracingSyscalls()): Call Ptrace.setOptions. (initializeAttachedState()): New. * LinuxPtraceTaskState.java: Call Task.initializeAttachedState(), instead of Task.sendSetOptions() as the task is attached. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/bindir/ChangeLog | 5 + frysk-core/frysk/bindir/TestFdebuginfo.java | 2 + frysk-core/frysk/proc/ChangeLog | 3 + frysk-core/frysk/proc/Task.java | 9 +- frysk-core/frysk/proc/live/ChangeLog | 13 ++ frysk-core/frysk/proc/live/LinuxPtraceTask.java | 63 ++++------ .../frysk/proc/live/LinuxPtraceTaskState.java | 130 ++++++++++++-------- frysk-core/frysk/proc/live/TestRuntimeIsa.java | 101 ++++++--------- 8 files changed, 175 insertions(+), 151 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog index 179ded3..3c04859 100644 --- a/frysk-core/frysk/bindir/ChangeLog +++ b/frysk-core/frysk/bindir/ChangeLog @@ -1,3 +1,8 @@ +2008-01-25 Andrew Cagney + + * TestFdebuginfo.java (testPathListing()): Mark as unresolved; bug + 5671. + 2008-01-24 Andrew Cagney * TestFhd.java: Do not call Expect.close(); do not hard-wire a diff --git a/frysk-core/frysk/bindir/TestFdebuginfo.java b/frysk-core/frysk/bindir/TestFdebuginfo.java index 26e7048..3dccc0e 100644 --- a/frysk-core/frysk/bindir/TestFdebuginfo.java +++ b/frysk-core/frysk/bindir/TestFdebuginfo.java @@ -51,6 +51,8 @@ import frysk.testbed.SlaveOffspring; public class TestFdebuginfo extends TestLib { public void testPathListing() { + if (unresolved(5671)) + return; // Create an unattached child process. SlaveOffspring child = SlaveOffspring.createChild(); Task task = child.findTaskUsingRefresh(true); diff --git a/frysk-core/frysk/proc/ChangeLog b/frysk-core/frysk/proc/ChangeLog index cd99c9d..246cbdc 100644 --- a/frysk-core/frysk/proc/ChangeLog +++ b/frysk-core/frysk/proc/ChangeLog @@ -9,6 +9,9 @@ 2008-01-24 Andrew Cagney + * Task.java: Mention that ISA can be null. + (clearIsa()): Make protected. + * TaskObserver.java (Signaled): Replace updateSignaled(Task,int) with updateSignaled(Task,Signal). * TestTaskSyscallObserver.java: Update. diff --git a/frysk-core/frysk/proc/Task.java b/frysk-core/frysk/proc/Task.java index dd0e331..5e41213 100644 --- a/frysk-core/frysk/proc/Task.java +++ b/frysk-core/frysk/proc/Task.java @@ -93,7 +93,12 @@ public abstract class Task { protected abstract String getStateFIXME(); /** - * Return's this Task's Instruction Set Architecture. + * Return's this Task's Instruction Set Architecture; or throw a + * NullPointerException if the ISA is not available. + * + * The isa is only available while the task is under observation + * (attached) as an un-observed task can switch isa's (using + * exec(2)) undetected. */ public abstract ISA getISA(); @@ -337,7 +342,7 @@ public abstract class Task { */ public abstract int getMod(); - public void clearIsa() { + protected void clearIsa() { syscallTable = null; signalTable = null; } diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog index 71ff7f4..2895d21 100644 --- a/frysk-core/frysk/proc/live/ChangeLog +++ b/frysk-core/frysk/proc/live/ChangeLog @@ -1,5 +1,18 @@ 2008-01-25 Andrew Cagney + * TestRuntimeIsa.java (assertHasNoIsa(String,Task)): New. + (assertHasIsaEquals(String,Task,boolean)): Delete. + * LinuxPtraceTask.java (hasIsa()): Delete. + (clearIsa()): Make protected. + (getISA()): Simplify, throw an NPE when the ISA is null. + (sendSetOptions()): Delete. + (ptraceOptions): Initialize directly. + (startTracingSyscalls(), stopTracingSyscalls()): Call + Ptrace.setOptions. + (initializeAttachedState()): New. + * LinuxPtraceTaskState.java: Call Task.initializeAttachedState(), + instead of Task.sendSetOptions() as the task is attached. + * TestTaskObserverCode.java: Eliminate uses of frysk.sys.Signal.equals(int); import frysk.isa.signals.Signal instead of frysk.sys.Signal. diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTask.java b/frysk-core/frysk/proc/live/LinuxPtraceTask.java index 3dfe3f5..9111181 100644 --- a/frysk-core/frysk/proc/live/LinuxPtraceTask.java +++ b/frysk-core/frysk/proc/live/LinuxPtraceTask.java @@ -149,18 +149,14 @@ public class LinuxPtraceTask extends LiveTask { * Can this instead look at AUXV? */ public ISA getISA() { - if (currentISA == null) - // FIXME: This should use task.proc.getExe(). Only that - // causes wierd failures; take a rain-check :-( - currentISA = ElfMap.getISA(new File("/proc/" + getTid() + "/exe")); - return currentISA; + ISA scratch = currentISA; + if (scratch == null) + throw new NullPointerException("ISA unavailable; task " + + this + " has no observers"); + return scratch; } private ISA currentISA; - boolean hasIsa() { - return (currentISA != null); - } - /** * Return the Task's ISA. * @@ -291,26 +287,6 @@ public class LinuxPtraceTask extends LiveTask { Signal.STOP.tkill(getTid()); } - private int ptraceOptions; - public void sendSetOptions () - { - logger.log(Level.FINE, "{0} sendSetOptions\n", this); - try - { - // XXX: Should be selecting the trace flags based on the - // contents of .observers. - ptraceOptions |= Ptrace.optionTraceClone(); - ptraceOptions |= Ptrace.optionTraceFork(); - ptraceOptions |= Ptrace.optionTraceExit(); - // ptraceOptions |= Ptrace.optionTraceSysgood (); not set by default - ptraceOptions |= Ptrace.optionTraceExec(); - Ptrace.setOptions(getTid(), ptraceOptions); - } - catch (Errno.Esrch e) - { - postDisappearedEvent(e); - } - } public void sendAttach () { @@ -363,18 +339,29 @@ public class LinuxPtraceTask extends LiveTask { } } - public void startTracingSyscalls () - { + // XXX: Should be selecting the trace flags based on the contents + // of .observers? Ptrace.optionTraceSysgood not set by default + private long ptraceOptions + = Ptrace.optionTraceClone() + | Ptrace.optionTraceFork() + | Ptrace.optionTraceExit() + | Ptrace.optionTraceExec(); + void initializeAttachedState() { + logger.log(Level.FINE, "{0} initializeAttachedState\n", this); + Ptrace.setOptions(getTid(), ptraceOptions); + // FIXME: This should use task.proc.getExe(). Only that + // causes wierd failures; take a rain-check :-( + currentISA = ElfMap.getISA(new File("/proc/" + getTid() + "/exe")); + } + void startTracingSyscalls() { logger.log(Level.FINE, "{0} startTracingSyscalls\n", this); ptraceOptions |= Ptrace.optionTraceSysgood(); - this.sendSetOptions(); + Ptrace.setOptions(getTid(), ptraceOptions); } - - public void stopTracingSyscalls () - { + void stopTracingSyscalls() { logger.log(Level.FINE, "{0} stopTracingSyscalls\n", this); ptraceOptions &= ~ (Ptrace.optionTraceSysgood()); - this.sendSetOptions(); + Ptrace.setOptions(getTid(), ptraceOptions); } @@ -714,6 +701,7 @@ public class LinuxPtraceTask extends LiveTask { //Flush the isa in case it has changed between exec's. clearIsa(); //XXX: When should the isa be rebuilt? + initializeAttachedState(); for (Iterator i = execedObservers.iterator(); i.hasNext();) { TaskObserver.Execed observer = (TaskObserver.Execed) i.next(); if (observer.updateExeced(this) == Action.BLOCK) @@ -993,7 +981,8 @@ public class LinuxPtraceTask extends LiveTask { setRegister(pcRegister(), addr); } - public void clearIsa() { + protected void clearIsa() { + logger.log(Level.FINE, "{0} clearIsa\n", this); super.clearIsa(); pcRegister = null; memory = null; diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java index 5f0b39a..aa1b4cd 100644 --- a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java +++ b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java @@ -183,13 +183,13 @@ class LinuxPtraceTaskState extends State { task.sendAttach(); if (task.getProc().getMainTask() == task && Status.isStopped(task.getTid())) { - // The attach has been initiated on the main task - // of the process; the process state should - // transition to (T) TRACED. If it is instead (T) - // STOPPED then the process is stuck (suspended), - // send it a SIGSTOP to unwedge it. /proc/status - // is used as that differentiates between STOPPED - // an TRACED. + // The attach has been initiated on the main + // task of the process; the process state + // should transition to (T) TRACED. If it is + // instead (T) STOPPED then the process is + // stuck (suspended), send it a SIGSTOP to + // unwedge it. /proc/status is used as that + // differentiates between STOPPED an TRACED. logger.log(Level.FINE, "{0} wake the suspended process", task); Signal.CONT.tkill(task.getTid()); @@ -234,7 +234,9 @@ class LinuxPtraceTaskState extends State { // Toss the stop event. signal = Signal.NONE; } - ((LinuxPtraceProc)task.getProc()).performTaskAttachCompleted(task); + task.initializeAttachedState(); + ((LinuxPtraceProc)task.getProc()) + .performTaskAttachCompleted(task); return new Attached.WaitForContinueOrUnblock(signal); } } @@ -287,6 +289,8 @@ class LinuxPtraceTaskState extends State { LinuxPtraceTaskState handleAddObservation(LinuxPtraceTask task, TaskObservation observation) { logger.log(Level.FINE, "{0} handleAddObservation\n", task); + // XXX: Need to check needsSuspendedAction; the task isn't + // stopped. observation.add(); return this; } @@ -296,6 +300,8 @@ class LinuxPtraceTaskState extends State { LinuxPtraceTaskState handleDeleteObservation(LinuxPtraceTask task, TaskObservation observation) { logger.log(Level.FINE, "{0} handleDeleteObservation\n", task); + // XXX: Need to check needsSuspendedAction; the task isn't + // stopped. observation.delete(); return handleUnblock(task, observation.getTaskObserver()); } @@ -348,7 +354,6 @@ class LinuxPtraceTaskState extends State { */ static LinuxPtraceTaskState transitionToRunningState(LinuxPtraceTask task, Signal signal) { logger.log(Level.FINE, "transitionToRunningState\n"); - task.sendSetOptions(); if (task.notifyAttached() > 0) return new BlockedSignal(signal, false); else @@ -425,9 +430,9 @@ class LinuxPtraceTaskState extends State { * influence this assumption: the task stops; and the controlling * proc orders an attach. * - * If the LinuxPtraceTask stops then, once the ForkedOffspring observers have - * stopped blocking this, do the detach. * ForkOffspring - * observers of this). + * If the LinuxPtraceTask stops then, once the ForkedOffspring + * observers have stopped blocking this, do the detach. + * ForkOffspring observers of this). * * If, on the other hand, an attach order is received, change the * assumption to that the task should be attached and proceed on @@ -446,27 +451,32 @@ class LinuxPtraceTaskState extends State { new StartMainTask("wantToDetach") { LinuxPtraceTaskState handleAttach(LinuxPtraceTask task) { logger.log(Level.FINE, "{0} handleAttach\n", task); - ((LinuxPtraceProc)task.getProc()).performTaskAttachCompleted(task); + ((LinuxPtraceProc)task.getProc()) + .performTaskAttachCompleted(task); return StartMainTask.wantToAttach; } LinuxPtraceTaskState handleStoppedEvent(LinuxPtraceTask task, Signal signal) { if (signal == Signal.STOP || signal == Signal.TRAP) { - if (task.notifyForkedOffspring() > 0) + task.initializeAttachedState(); + if (task.notifyForkedOffspring() > 0) { return StartMainTask.detachBlocked; - task.sendDetach(Signal.NONE); - ((LinuxPtraceProc)task.getProc()).performTaskDetachCompleted(task); - return detached; + } else { + task.sendDetach(Signal.NONE); + ((LinuxPtraceProc)task.getProc()) + .performTaskDetachCompleted(task); + return detached; + } } else { throw unhandled(task, "handleStoppedEvent " + signal); } } }; /** - * The detaching LinuxPtraceTask has stopped and the ForkedOffspring - * observers have been notified; just waiting for all the - * ForkedOffspring blockers to be removed before finishing the - * detach. + * The detaching LinuxPtraceTask has stopped and the + * ForkedOffspring observers have been notified; just waiting + * for all the ForkedOffspring blockers to be removed before + * finishing the detach. */ static final LinuxPtraceTaskState detachBlocked = new StartMainTask("detachBlocked") { @@ -477,22 +487,30 @@ class LinuxPtraceTaskState extends State { // (waiting for ForkedOffspring observers to // unblock before finishing the attach). logger.log(Level.FINE, "{0} handleAttach\n", task); - ((LinuxPtraceProc)task.getProc()).performTaskAttachCompleted(task); + ((LinuxPtraceProc)task.getProc()) + .performTaskAttachCompleted(task); return StartMainTask.attachBlocked; } LinuxPtraceTaskState handleUnblock(LinuxPtraceTask task, TaskObserver observer) { - logger.log(Level.FINE, "{0} handleUnblock\n", task); + logger.log(Level.FINE, "{0} handleUnblock {1}\n", + new Object[] { task, observer }); task.blockers.remove(observer); - logger.log(Level.FINER, "{0} handleUnblock number of blockers left {1}\n", new Object[]{task, new Integer(task.blockers.size())}); - + logger.log(Level.FINER, + "{0} handleUnblock number blockers left {1}\n", + new Object[]{ + task, + new Integer(task.blockers.size()) + }); if (task.blockers.size() == 0) { // Ya! All the blockers have been removed. task.sendDetach(Signal.NONE); - ((LinuxPtraceProc)task.getProc()).performTaskDetachCompleted(task); + ((LinuxPtraceProc)task.getProc()) + .performTaskDetachCompleted(task); return detached; + } else { + return StartMainTask.detachBlocked; } - return StartMainTask.detachBlocked; } }; /** @@ -506,16 +524,19 @@ class LinuxPtraceTaskState extends State { LinuxPtraceTaskState handleAddObservation(LinuxPtraceTask task, TaskObservation observation) { logger.log(Level.FINE, "{0} handleAddObservationr\n", task); - // XXX - This should most likely test needsSuspendedAction + // XXX - This should most likely test + // needsSuspendedAction observation.add(); return this; } LinuxPtraceTaskState handleStoppedEvent(LinuxPtraceTask task, Signal signal) { if (signal == Signal.STOP || signal == Signal.TRAP) { + task.initializeAttachedState(); if (task.notifyForkedOffspring() > 0) return StartMainTask.attachBlocked; - return Attached.waitForContinueOrUnblock; + else + return Attached.waitForContinueOrUnblock; } else { throw unhandled(task, "handleStoppedEvent " + signal); } @@ -533,20 +554,24 @@ class LinuxPtraceTaskState extends State { new StartMainTask("wantToAttachContinue") { LinuxPtraceTaskState handleStoppedEvent(LinuxPtraceTask task, Signal signal) { - // Mark this LinuxPtraceTask as just started. See - // Running.handleTrapped for more explanation. - task.justStartedXXX = true; - if (task.notifyForkedOffspring() > 0) - return StartMainTask.attachContinueBlocked; - else { - if (signal == Signal.STOP || signal == Signal.TRAP) - // Discard the signal. - signal = Signal.NONE; - return Attached.transitionToRunningState(task, signal); + if (signal == Signal.STOP || signal == Signal.TRAP) { + task.initializeAttachedState(); + // Mark this LinuxPtraceTask as just started. See + // Running.handleTrapped for more explanation. + task.justStartedXXX = true; + if (task.notifyForkedOffspring() > 0) { + return StartMainTask.attachContinueBlocked; + } else { + // Discard the stop signal. + return Attached + .transitionToRunningState(task, Signal.NONE); + } + } else { + throw unhandled(task, "handleStoppedEvent " + signal); } } - - // Adding or removing observers doesn't impact this state. + // Adding or removing observers doesn't impact this + // state. LinuxPtraceTaskState handleAddObservation(LinuxPtraceTask task, TaskObservation to) { logger.log(Level.FINE, "{0} handleAddObservation\n", task); @@ -605,7 +630,9 @@ class LinuxPtraceTaskState extends State { task.blockers.remove(observer); if (task.blockers.size() > 0) return StartMainTask.attachContinueBlocked; - return Attached.transitionToRunningState(task, Signal.NONE); + else + return Attached.transitionToRunningState(task, + Signal.NONE); } }; } @@ -618,20 +645,22 @@ class LinuxPtraceTaskState extends State { StartClonedTask(String name) { super("StartClonedTask." + name); } - LinuxPtraceTaskState handleAddObservation(LinuxPtraceTask task, TaskObservation observation) { + LinuxPtraceTaskState handleAddObservation(LinuxPtraceTask task, + TaskObservation observation) { logger.log(Level.FINE, "{0} handleAddObservation\n", task); - // XXX most likely need to check needsSuspendedAction + // XXX: Need to check needsSuspendedAction; the task isn't + // stopped. observation.add(); return this; } LinuxPtraceTaskState handleDeleteObservation(LinuxPtraceTask task, TaskObservation observation) { logger.log(Level.FINE, "{0} handleDeleteObservation\n", task); - // XXX most likely need to check needsSuspendedAction + // XXX: Need to check needsSuspendedAction; the task isn't + // stopped. observation.delete(); return this; } - static final LinuxPtraceTaskState waitForStop = new StartClonedTask("waitForStop") { LinuxPtraceTaskState handleUnblock(LinuxPtraceTask task, @@ -645,7 +674,7 @@ class LinuxPtraceTaskState extends State { Signal signal) { if (signal == Signal.STOP || signal == Signal.TRAP) { // Attempt an attached continue. - task.sendSetOptions (); + task.initializeAttachedState(); if(task.notifyClonedOffspring() > 0) return StartClonedTask.blockedOffspring; // XXX: Really notify attached here? @@ -657,7 +686,6 @@ class LinuxPtraceTaskState extends State { } } }; - private static final LinuxPtraceTaskState blockedOffspring = new StartClonedTask("blockedOffspring") { LinuxPtraceTaskState handleUnblock(LinuxPtraceTask task, @@ -667,9 +695,8 @@ class LinuxPtraceTaskState extends State { if (task.blockers.size() > 0) return StartClonedTask.blockedOffspring; // XXX: Really notify attached here? - if (task.notifyAttached() > 0) { + if (task.notifyAttached() > 0) return blockedContinue; - } return running.sendContinue(task, Signal.NONE); } }; @@ -876,7 +903,8 @@ class LinuxPtraceTaskState extends State { if (shouldRemoveObservers) task.removeObservers(); - // XXX: Otherwise check if there are still observers and panic? + // XXX: Otherwise check if there are still observers and + // panic? // Can't detach a running task, first need to stop it. task.sendStop(); diff --git a/frysk-core/frysk/proc/live/TestRuntimeIsa.java b/frysk-core/frysk/proc/live/TestRuntimeIsa.java index 81fb7a1..b0e9601 100644 --- a/frysk-core/frysk/proc/live/TestRuntimeIsa.java +++ b/frysk-core/frysk/proc/live/TestRuntimeIsa.java @@ -54,10 +54,14 @@ import frysk.proc.Manager; public class TestRuntimeIsa extends TestLib { - private static void assertHasIsaEquals(String reason, Task task, - boolean hasIsa) { - assertEquals("Has ISA (" + reason + ")", hasIsa, hooks/post-receive -- frysk system monitor/debugger