Hi, This solves a long standing bug (#5234) where a TaskObserver.Code was triggered by a breakpoint being hit on a Task that it didn't originally register with. The problem was that the BreakpointAddresses didn't have the original Task against which the TaskObserver.Code was registered. And originally it was thought to not be such a big deal if a TaskObserver.Code interface saw all breakpoint events in a Proc. It could check that it was given the right Task in its updateHit() anyway. But this required some ugly workarounds in some cases which are now not necessary anymore. We now have a little static final helper class CodeObserver that records the original Task and TaskObserver.Code so that notifyCodeObserver() can check whether the Task (and observer) were registered for this address. Note that it still must report zero, and not -1 if there are any breakpoints installed, even if it wasn't for this particular Task because the ptrace state machine depends on that to know whether or not to go past an installed breakpoint on the current address. The patch also marks the BreakpointAddresses class and (helper) methods as package private. frysk-core/frysk/proc/live/ChangeLog 2008-04-21 Mark Wielaard * BreakpointAddresses.java: Mark class and methods package private. (CodeObserver): New final static helper class. (addBreakpoint): Take CodeObserver as argument, not TaskObserver.Code. (removeBreakpoint): Likewise. (getCodeObservers): Return collection of CodeObservers, not TaskObserver.Code. * LinuxPtraceProc.java (BreakpointAction.run): Install or remove BreakpointAddresses.CodeObserver instead of bare TaskObserver.Code. * LinuxPtraceTask.java (notifyCodeBreakpoint): Check Task against BreakpointAddresses.CodeObserver. * TestTaskObserverCode.java (testMultiTaskUpdateCalledSeveralTimes): Resolved bug #5234. The testcase testMultiTaskUpdateCalledSeveralTimes now PASSes. No regressions. Committed and pushed, Mark