I've experienced the VW7.4 debugger freeze twice this week, usually
after forking another debugger from the current one using "debug it" or when editing a method within the debugger. Unfortunately, I have not been able to reproduce this. From the stack trace it seems that this may be related to the RBCodeHighlighter? We use a slightly modified version of the RBCodeHighlighter that redraws only the portion of the text view where there emphasis has actually changed. To compute this, we compare the highlighted copied text to the original to find spans with changed emphasis. We then find and invalidate the view coordinates including those characters. Except for a few helper methods, the main change to HighlightingTextEditorController>>startHighlighting is as follows: Instead of [localText string = self text string ifTrue: [self text setString: self text string setRuns: localText runs. self view resetSelections. self view invalidateRectangle: self view bounds repairNow: true]]. we use [localText string = self text string ifTrue: [| oldText | oldText := self text copy. self text setString: self text string setRuns: localText runs. self view resetSelections. self redrawChangedEmphasisFrom: oldText to: self text]]. The helpers are implemented in terms of Text>>emphasisAt:, Text>>sameEmphasisAs:, self view invalidateRectangle:repairNow:true, and self view characterBlockForIndex:. Any chances that this could be causing the lockups? Anyway, here's the stack trace [gdb, dumpAllProcesses(1)]. Maybe there is something obvious I don't see: [Platform: Ubuntu Linux, kernel 2.6.15-12-686, glibc 2.3.6, X11 Xorg 6.8.2] Any hints would be appreciated. - Wolfgang process 0x81dfb28 frame 0xbfdc9750 a(n) Semaphore waitIfCurtailedSignal frame 0xbfdc9768 a(n) Semaphore critical: frame 0xbfdc9784 a(n) RecursionLock critical: frame 0xbfdc97a8 a(n) EphemeronDictionary at:ifAbsent: frame 0xbfdc97bc a(n) ByteString myEventTable frame 0xbfdc97e4 a(n) ByteString become: frame 0xbfdc9800 a(n) ByteString changeSizeTo: frame 0xbfdc9818 a(n) ByteString growToAtLeast: frame 0xbfdc9830 a(n) WriteStream pastEndPut: frame 0xbfdc9848 a(n) WriteStream nextPut: frame 0xbfdc985c a(n) CodeHighlightingScanner step frame 0xbfdc9870 a(n) CodeHighlightingScanner scanForToken frame 0xbfdc9884 a(n) CodeHighlightingScanner next frame 0xbfdc9898 a(n) CodeHighlightingParser getNextToken frame 0xbfdc98b0 a(n) CodeHighlightingParser performParsingLoop frame 0xbfdc98c4 a(n) CodeHighlightingParser parse frame 0xbfdc98dc a(n) BlockClosure [] in CodeHighlightingParser class>>formatMethod:forClass:namespace: frame 0xbfdc98f8 a(n) BlockClosure on:do: frame 0xbfdc9918 a Class (CodeHighlightingParser) formatMethod:forClass:namespace: frame 0xbfdc9954 a(n) BlockClosure [] in HighlightingTextEditorController>>startHighlighting: frame 0xbfdc9970 a(n) BlockClosure on:do: frame 0xbfdc9988 a(n) BlockClosure [] in Process class>>forBlock:priority: process 0x8cde7a4 suspendedContext is nil process 0x8de8940 frame 0xbfdcd974 a(n) Semaphore wait frame 0xbfdcd988 a(n) BlockClosure [] in Delay class>>initializeTimingProcess context 0x08df9e54 BlockClosure>>on:do: context 0x08df9434 [] in Process class>>forBlock:priority: process 0x95a19d8 context 0xb79b82dc Process>>resume context 0xb79c6370 BlockClosure>>forkAt: context 0x097a3590 Process>>suspendResumable:do: context 0xb79b7b98 DebuggerService class>>openOn:exception:interrupted: context 0xb79c6358 DebuggerService class>>openOnException: context 0x097a31a0 DebuggerService class>>openException: context 0x097a3188 Notifier class>>openException: context 0x097a3170 UnhandledException>>defaultAction context 0x097a3158 UnhandledException(GenericException)>>performHandler: context 0x097a30b0 UnhandledException(GenericException)>>propagatePrivateFrom: context 0xb79b7b68 UnhandledException(GenericException)>>propagateFrom: context 0xb79c6340 UnhandledException(GenericException)>>propagate context 0xb79b7b5c UnhandledException(GenericException)>>raiseSignal context 0xb79c6328 BreakInterrupt(GenericException)>>noHandler context 0x097a32f0 BreakInterrupt(GenericException)>>defaultAction context 0x097a32d8 BreakInterrupt(GenericException)>>performHandler: context 0x097a3278 BreakInterrupt(GenericException)>>propagatePrivateFrom: context 0xb79b7b50 BreakInterrupt(GenericException)>>propagateFrom: context 0xb79c6310 BreakInterrupt(GenericException)>>propagate context 0xb79b7b44 BreakInterrupt(GenericException)>>raiseSignal context 0xb79b7a6c BreakInterrupt class(GenericException class)>>raiseRequestWith:errorString: context 0xb79b7b74 CodeProbe(Object)>>breakOn:label: context 0x095a772c CodeProbe>>actOn: context 0xb79b821c IndexTreeMutator>>unboundMethod ... context 0xb79b0374 BlockClosure>>ensure: context 0xb79b0368 Cursor>>showWhile: context 0xb79b035c LoggingDebugger>>debugAndPrintEvents context 0xb79b0350 [] in LoggingDebugger>>debug context 0xb79b0344 LoggingDebugger>>runAndMeasureTime: context 0xb79b0338 LoggingDebugger>>debug // <- entry point of my application context 0xb79b032c UndefinedObject>>unboundMethod context 0xb79b0320 UndefinedObject(Object)>>performMethod:arguments: context 0xb79b0314 UndefinedObject(Object)>>performMethod: context 0xb79b0308 HighlightingTextEditorController(ParagraphEditor)>>evaluateCompiled: context 0xb79b02fc [] in ParagraphEditor>>evaluateSelection context 0xb79c9a60 BlockClosure>>ensure: context 0xb79b02f0 Cursor>>showWhile: context 0xb79b02e4 HighlightingTextEditorController(ParagraphEditor)>>evaluateSelection context 0xb79b02d8 [] in ParagraphEditor>>doIt context 0xb79d8970 BlockClosure>>on:do: context 0xb79b02cc HighlightingTextEditorController(ParagraphEditor)>>doIt context 0xb79b02c0 HighlightingTextEditorController(TextEditorController)>>dispatchMenuSymbol: context 0xb79b02b4 HighlightingTextEditorController(TextEditorController)>>dispatchMenuSelection: context 0xb79b02a8 HighlightingTextEditorController(ControllerWithMenu)>>processMenu:at:centered: context 0xb79b029c HighlightingTextEditorController(ControllerWithMenu)>>processMenuAt:centered: context 0xb79b0290 HighlightingTextEditorController(ControllerWithMenu)>>yellowButtonPressedEvent: context 0xb79b0284 HighlightingTextEditorController(ParagraphEditor)>>yellowButtonPressedEvent: context 0xb79b0278 HighlightingTextEditorController(TextEditorController)>>yellowButtonPressedEvent: context 0xb79b026c YellowButtonPressedEvent>>dispatchTo: context 0xb79b0260 HighlightingTextEditorController(ControllerWithMenu)>>handleEvent: context 0xb79b0254 EventDispatcher>>dispatch:to: context 0xb79b023c EventDispatcher>>dispatchEvent: context 0xb79b0230 YellowButtonPressedEvent(Event)>>dispatch context 0xb79b0218 YellowButtonPressedEvent(Event)>>dispatchForWindowManager: context 0xb79b020c [] in WindowManager>>safelyDispatchForWindowManager: context 0xb79d891c BlockClosure>>on:do: context 0xb79b0200 WindowManager>>safelyDispatchForWindowManager: context 0xb79b01f4 WindowManager>>processNextEvent context 0x095e5478 [] in WindowManager>>newProcess context 0x095e53e8 BlockClosure>>on:do: context 0x095e53c4 [] in WindowManager>>newProcess context 0x095e5340 BlockClosure>>on:do: context 0x095a1708 [] in Process class>>forBlock:priority: process 0x95a2440 context 0x095ae5d8 Semaphore>>wait context 0x095ab260 EventQueue>>next context 0x095ab248 WindowManager>>processNextEvent context 0xb79dc1bc [] in WindowManager>>newProcess context 0xb79db6e8 BlockClosure>>on:do: context 0xb79c04f0 [] in WindowManager>>newProcess context 0x097a8234 BlockClosure>>on:do: context 0x095a78c4 [] in Process class>>forBlock:priority: process 0x95b9474 context 0xb79dfc18 Semaphore>>wait context 0xb79b34b8 EventQueue>>next context 0xb79b63a4 WindowManager>>processNextEvent context 0xb79d057c [] in WindowManager>>newProcess context 0x095d4438 BlockClosure>>on:do: context 0x095b2694 [] in WindowManager>>newProcess context 0x095d4444 BlockClosure>>on:do: context 0x095b585c [] in Process class>>forBlock:priority: process 0x95c8360 suspendedContext is nil process 0x95cc5f0 suspendedContext is nil process 0x95da0e4 context 0x095ab698 Semaphore>>wait context 0x095a9a54 EventQueue>>next context 0x095a9a3c WindowManager>>processNextEvent context 0xb79d02d0 [] in WindowManager>>newProcess context 0x095d7e40 BlockClosure>>on:do: context 0xb79cfe8c [] in WindowManager>>newProcess context 0x095d7e34 BlockClosure>>on:do: context 0x095da0cc [] in Process class>>forBlock:priority: process 0x95e1938 suspendedContext is nil process 0x967753c suspendedContext is nil process 0x96dfab0 context 0x095ab680 Semaphore>>wait context 0x095a9b80 EventQueue>>next context 0x095a9b5c WindowManager>>processNextEvent context 0x097795e4 [] in WindowManager>>newProcess context 0x0977ae44 BlockClosure>>on:do: context 0x09779e60 [] in WindowManager>>newProcess context 0x0977ae50 BlockClosure>>on:do: context 0x096dff18 [] in Process class>>forBlock:priority: process 0x96e248c suspendedContext is nil process 0x96ea238 frame 0xbfdc86d8 a(n) Semaphore waitIfCurtailedSignal frame 0xbfdc86f0 a(n) Semaphore critical: frame 0xbfdc870c a(n) RecursionLock critical: frame 0xbfdc8730 a(n) EphemeronDictionary at:ifAbsent: frame 0xbfdc8744 a(n) OrderedCollection myEventTable frame 0xbfdc876c a(n) OrderedCollection become: frame 0xbfdc8790 a(n) OrderedCollection changeCapacityTo: frame 0xbfdc87a4 a(n) OrderedCollection increaseCapacity frame 0xbfdc87cc a(n) OrderedCollection makeRoomAtLast frame 0xbfdc87e4 a(n) OrderedCollection addLast: frame 0xbfdc8808 a(n) BlockClosure [] in EventQueue>>nextPut:collapse: frame 0xbfdc8824 a(n) BlockClosure ensure: frame 0xbfdc883c a(n) Semaphore critical: frame 0xbfdc8860 a(n) BlockClosure [] in EventQueue>>nextPut:collapse: frame 0xbfdc887c a(n) BlockClosure ensure: frame 0xbfdc8894 a(n) Semaphore critical: frame 0xbfdc88ac a(n) Process uninterruptablyDo: frame 0xbfdc88c0 a(n) BlockClosure valueUninterruptably frame 0xbfdc88e0 a(n) EventQueue nextPut:collapse: frame 0xbfdc88fc a(n) WindowManager addEvent:collapse: frame 0xbfdc8914 a(n) EventSensor addCollapsedMetaInput: frame 0xbfdc892c a(n) EventSensor eventMouseMoved: frame 0xbfdc894c a(n) InputState send:eventMouseMoved: frame 0xbfdc8970 a(n) InputState process: frame 0xbfdc8988 a(n) InputState 0x0 no selector context 0x096f7ed0 [] in InputState class>>install context 0x096f2de8 BlockClosure>>on:do: context 0x096ea070 [] in Process class>>forBlock:priority: process 0x9755944 frame 0xbfdca974 a(n) Semaphore wait frame 0xbfdca988 a Class (ObjectMemory) 0x0 no selector context 0x0977a2c8 [] in ObjectMemory class>>installIdleLoopProcess context 0x09777868 BlockClosure>>on:do: context 0x09707e24 [] in Process class>>forBlock:priority: process 0x97559bc context 0x081c0c7c Semaphore>>wait context 0x096e9fd4 ObjectMemory class>>lowSpaceLoop context 0x097ba114 [] in ObjectMemory class>>installLowSpaceProcess context 0x097bb8a8 BlockClosure>>on:do: context 0x09707f08 [] in Process class>>forBlock:priority: process 0x9755a28 context 0x096ea1c0 Semaphore>>wait context 0x097be77c [] in ExternalProcess class>>startReaper context 0x0979fd38 BlockClosure>>on:do: context 0x09707ed8 [] in Process class>>forBlock:priority: process 0x9755a34 frame 0xbfdd096c a(n) Semaphore wait frame 0xbfdd0988 a(n) BlockClosure [] in ObjectMemory class>>installScavengeNotification context 0x097915a8 BlockClosure>>on:do: context 0x09707e6c [] in Process class>>forBlock:priority: process 0x9793d2c context 0x081c0c58 Semaphore>>wait context 0x09799e64 WeakArray class>>outerFinalizationLoop context 0x09799e58 [] in WeakArray class>>installFinalizationMechanism context 0x09799744 BlockClosure>>on:do: context 0x097b898c [] in Process class>>forBlock:priority: process 0x97ab69c context 0xb79def70 Semaphore>>wait context 0xb79dd914 EventQueue>>next context 0xb79b0128 WindowManager>>processNextEvent context 0x096f81d0 [] in WindowManager>>newProcess context 0x096f81dc BlockClosure>>on:do: context 0x096f8200 [] in WindowManager>>newProcess context 0x096f8218 BlockClosure>>on:do: context 0x09799ea0 [] in Process class>>forBlock:priority: process 0x97b5c2c context 0x096ea130 Semaphore>>wait context 0x0978eb24 [] in CCallback class>>installForeignCallbackProcess context 0x0978eb0c BlockClosure>>on:do: context 0x097b5c38 [] in Process class>>forBlock:priority: process 0x97b5ca4 context 0x096ea13c Semaphore>>wait context 0x0975be24 [] in CCallback class>>installCallbackProcess context 0x0975be78 BlockClosure>>on:do: context 0x0975beb4 [] in CCallback class>>installCallbackProcess context 0x0975bed8 BlockClosure>>on:do: context 0x0975bf20 [] in CCallback class>>installCallbackProcess context 0x0975bf74 BlockClosure>>on:do: context 0x097b5cb0 [] in Process class>>forBlock:priority: process 0xb79af78c frame 0xbfdc7534 a(n) Semaphore waitIfCurtailedSignal frame 0xbfdc754c a(n) Semaphore critical: frame 0xbfdc7568 a(n) RecursionLock critical: frame 0xbfdc758c a(n) EphemeronDictionary at:ifAbsent: frame 0xbfdc75a0 a(n) Set myEventTable frame 0xbfdc75c8 a(n) Set become: frame 0xbfdc75e4 a(n) Set changeCapacityTo: frame 0xbfdc75f8 a(n) Set grow frame 0xbfdc7614 a(n) Set fullCheck frame 0xbfdc7630 a(n) Set atNewIndex:put: frame 0xbfdc764c a(n) Set add: frame 0xbfdc7668 a(n) BlockClosure [] in CompiledCode>>allSymbolLiterals frame 0xbfdc768c a(n) BlockClosure [] in CompiledCode>>allSymbolLiteralsDo: frame 0xbfdc76b0 a(n) InstructionStream scanFor: frame 0xbfdc76dc a(n) ProbedCompiledMethod allSymbolLiteralsDo: frame 0xbfdc76f4 a(n) ProbedCompiledMethod allSymbolLiterals frame 0xbfdc7720 a(n) DebuggerClient querySubmenuSending: frame 0xbfdc7738 a(n) BlockClosure [] in DebuggerClient>>setQuerySubmenuBlocksIn: frame 0xbfdc774c a(n) MenuItemAdornment submenu frame 0xbfdc7760 a(n) MenuItem submenu frame 0xbfdc7788 a(n) BlockClosure [] in BlockClosure>>unboundMethod frame 0xbfdc77a8 a(n) Array do: frame 0xbfdc77c4 a(n) MotifMenuView menuItemForShortcutKey:inMenu: frame 0xbfdc77dc a(n) MotifMenuView menuItemForShortcutKey: frame 0xbfdc7804 a(n) MotifMenuBarButtonView processShortcutKeyEventAsMenuItemAccessor: frame 0xbfdc7820 a(n) BlockClosure [] in BlockClosure>>unboundMethod frame 0xbfdc7840 a(n) OrderedCollection do: frame 0xbfdc7858 a(n) MotifMenuBar processShortcutKeyEventInMenuBar: frame 0xbfdc7880 a(n) KeyboardProcessor processShortcutKeyEvent: frame 0xbfdc789c a(n) KeyboardProcessor processKeyboardEvent: frame 0xbfdc78bc a(n) KeyboardProcessor processKeyboardEvent:for: frame 0xbfdc78dc a(n) EventDispatcher dispatchEvent: frame 0xbfdc78f0 a(n) KeyPressedEvent dispatch frame 0xbfdc7908 a(n) KeyPressedEvent dispatchForWindowManager: frame 0xbfdc7924 a(n) BlockClosure [] in WindowManager>>safelyDispatchForWindowManager: frame 0xbfdc7940 a(n) BlockClosure on:do: frame 0xbfdc7958 a(n) WindowManager safelyDispatchForWindowManager: frame 0xbfdc7970 a(n) WindowManager processNextEvent frame 0xbfdc7988 a(n) BlockClosure [] in WindowManager>>newProcess context 0xb79e1b08 BlockClosure>>on:do: context 0xb79b69ec [] in WindowManager>>newProcess context 0xb79e1afc BlockClosure>>on:do: context 0x095d17ec [] in Process class>>forBlock:priority: process 0xb79b84a4 suspendedContext is nil process 0xb79b9800 context 0xb79e1b80 Semaphore>>wait context 0xb79da830 EventQueue>>next context 0xb79da68c WindowManager>>processNextEvent context 0xb79c4924 [] in WindowManager>>newProcess context 0xb79e1700 BlockClosure>>on:do: context 0xb79e1664 [] in WindowManager>>newProcess context 0xb79e1628 BlockClosure>>on:do: context 0xb79b97f4 [] in Process class>>forBlock:priority: process 0xb79bd76c context 0xb79e1970 Semaphore>>wait context 0x096ecd28 EventQueue>>next context 0xb79ccb14 WindowManager>>processNextEvent context 0xb79e1a84 [] in WindowManager>>newProcess context 0xb79e1a78 BlockClosure>>on:do: context 0xb79d93fc [] in WindowManager>>newProcess context 0xb79c5044 BlockClosure>>on:do: context 0xb79b6c20 [] in Process class>>forBlock:priority: process 0xb79c5974 context 0xb79e0e24 Semaphore>>signal context 0xb79e0e18 [] in ProcessHandle>>performDebugOperation: process 0xb79d120c suspendedContext is nil process 0xb79d6a80 suspendedContext is nil process 0xb79dc018 suspendedContext is nil process 0xb79dc300 suspendedContext is nil process 0xb79dc54c suspendedContext is nil process 0xb79e1a0c suspendedContext is nil --- Last modified: <06/01/31 16:37:53 [hidden email]> --- |
Wolfgang Mayer wrote:
> I've experienced the VW7.4 debugger freeze twice this week, usually > after forking another debugger from the current one using "debug it" > or when editing a method within the debugger. Unfortunately, I have > not been able to reproduce this. > > From the stack trace it seems that this may be related to the > RBCodeHighlighter? Not really, the RBCodeHighlighter process is trying to grow a write stream. During this process it become:'s one string to a larger one. #become: then tries to swap the event tables for the two strings. However, the EventTable's recursion lock is locked, so it waits. Looking at the various processes, I see two others that are waiting on the same recursion lock, but I didn't see anyone that is in the middle of the critical: block for the event table. John Brant |
This might be another manifestion of the general problem that if a process is terminated while an unwind block is in the process of running, then that unwind block does not finish running. This is a known issue, but also a good reason to be very careful using #terminate. If that's the problem, it may be because some of the modifications that people made to the RBCodeHighlighter or some other code that's accessing the event table is terminating processes.
At 11:07 AM 1/31/2006, John Brant wrote: >Wolfgang Mayer wrote: >> I've experienced the VW7.4 debugger freeze twice this week, usually >> after forking another debugger from the current one using "debug it" >> or when editing a method within the debugger. Unfortunately, I have >> not been able to reproduce this. >> >> From the stack trace it seems that this may be related to the >> RBCodeHighlighter? > >Not really, the RBCodeHighlighter process is trying to grow a write >stream. During this process it become:'s one string to a larger one. >#become: then tries to swap the event tables for the two strings. >However, the EventTable's recursion lock is locked, so it waits. Looking >at the various processes, I see two others that are waiting on the same >recursion lock, but I didn't see anyone that is in the middle of the >critical: block for the event table. > > >John Brant -- Alan Knight [|], Cincom Smalltalk Development [hidden email] [hidden email] http://www.cincom.com/smalltalk "The Static Typing Philosophy: Make it fast. Make it right. Make it run." - Niall Ross |
Alan Knight wrote:
> This might be another manifestion of the general problem that if a > process is terminated while an unwind block is in the process of > running, then that unwind block does not finish running. This is a > known issue, but also a good reason to be very careful using > #terminate. Do you have a way to be sufficiently careful using #terminate to avoid this problem in the general case? I haven't been able to determine any way to safely terminate any process that uses unwind blocks. And essentially all processes use unwind blocks. I'd really like to see this bug fixed. Is the AR scheduled for work anytime soon? We do a lot of multi-process work, and we've been running into this lately. For a particularly nasty example, see my mail on "Single-process deadlock" of Jan 25. In looking at the existing code, I find it simple and elegant. However, it does not behave correctly. Inability to safely terminate a process leaves major hole in the Process model. I don't see an obvious way to fix this without complicating the unwind code, but I think this is serious enough to warrant being tackled soon. -Martin |
The best way to terminate a process is to carefully design the process so you
can end it via mechanisms *other* than #terminate. The best techniques are those that cause the process to terminate itself. Some examples: 1. The process reads "requests" from a SharedQueue. To stop the process, put a special request on the SharedQueue that the process recognizes and ends itself. 2. Assume some object creates the process and holds a reference to it in an instance variable. The process stays alive as long as that instance variable refers to itself. When the reference changes, the process stops itself. To stop the process simply change the instance variable to nil (or anything else). 3. The process begins with a top-level exception handler that handles a specially defined exception. To stop the process, send #interruptWith: aBlock to it, where the block does something like: "SpecialException raiseSignal". HOWEVER, this will cause a walkback if the process was already terminated. There are some application-specific ways around this. Chris Martin McClure wrote: > Alan Knight wrote: > >> This might be another manifestion of the general problem that if a >> process is terminated while an unwind block is in the process of >> running, then that unwind block does not finish running. This is a >> known issue, but also a good reason to be very careful using >> #terminate. > > > Do you have a way to be sufficiently careful using #terminate to avoid > this problem in the general case? > > I haven't been able to determine any way to safely terminate any process > that uses unwind blocks. And essentially all processes use unwind blocks. > > I'd really like to see this bug fixed. Is the AR scheduled for work > anytime soon? > > We do a lot of multi-process work, and we've been running into this > lately. For a particularly nasty example, see my mail on "Single-process > deadlock" of Jan 25. > > In looking at the existing code, I find it simple and elegant. However, > it does not behave correctly. Inability to safely terminate a process > leaves major hole in the Process model. I don't see an obvious way to > fix this without complicating the unwind code, but I think this is > serious enough to warrant being tackled soon. > > -Martin > > > |
Chris Winemiller wrote:
> The best way to terminate a process is to carefully design the process > so you can end it via mechanisms *other* than #terminate. The best > techniques are those that cause the process to terminate itself. Some > examples: > > 1. The process reads "requests" from a SharedQueue. To stop the > process, put a special request on the SharedQueue that the process > recognizes and ends itself. > > 2. Assume some object creates the process and holds a reference to it in > an instance variable. The process stays alive as long as that instance > variable refers to itself. When the reference changes, the process > stops itself. To stop the process simply change the instance variable > to nil (or anything else). > > 3. The process begins with a top-level exception handler that handles a > specially defined exception. To stop the process, send #interruptWith: > aBlock to it, where the block does something like: "SpecialException > raiseSignal". HOWEVER, this will cause a walkback if the process was > already terminated. There are some application-specific ways around this. > Chris, I agree that these are valid techniques (except for number 3, which has the same problems as #terminate, since it's almost exactly the way #terminate is implemented), but avoiding #terminate is not always desirable or possible. I don't immediately see why carefully designing a process to shut itself down is significantly better than carefully designing it so that it can be terminated safely at any point, though it is sometimes easier. Sometimes #terminate or #interruptWith: are the only relatively easy way to go. For instance, if you have a process that you want to stop that may or may not be in a Delay. Or one that is waiting for an event that just isn't going to happen in a reasonable amount of time. It's really hard to avoid #terminate during debugging, which is where my recent problems have been. I often need to terminate a process during debugging, either through the Process Monitor or through the debugger. Because stack unwinding does not take #terminate or #interruptWith: into account, even processes with properly coded unwind blocks do not reliably clean up after themselves. As it is, I'm tempted to rename #ensure: to #usually: :-) -Martin |
Martin McClure wrote:
> Chris, > > I agree that these are valid techniques (except for number 3, which has > the same problems as #terminate, since it's almost exactly the way > #terminate is implemented), but avoiding #terminate is not always > desirable or possible. I don't immediately see why carefully designing a > process to shut itself down is significantly better than carefully > designing it so that it can be terminated safely at any point, though it > is sometimes easier. Because the behavior of #terminate does not allow the process to gracefully terminate its application-specific behavior. Think of a process, for example, that listens on a SocketAccessor for client connections. If you send #terminate to the process the SocketAccessor remains open. And if the only access to the SocketAccessor is solely within the BlockClosure of the process, you will lose all reference to the SocketAccessor so you can't close it. If your application dynamically spawns and terminate processes you must design clean ways for those processes to terminate. Believe me: we've tried #terminate in the past and we now avoid it like the plague. And we try to avoid #interruptWith: for the reasons you stated. Your application *must* be robust, and #terminate is the "dirtiest" (and least robust) way to end a process. > Sometimes #terminate or #interruptWith: are the only relatively easy way > to go. For instance, if you have a process that you want to stop that > may or may not be in a Delay. Or one that is waiting for an event that > just isn't going to happen in a reasonable amount of time. For these specific examples you can make the process wait on a Semaphore which is either the delaySemaphore of the Delay you're waiting on, or a "free-standing" Semaphore. Such solutions are not difficult to implement. > It's really hard to avoid #terminate during debugging, which is where my > recent problems have been. I often need to terminate a process during > debugging, either through the Process Monitor or through the debugger. > Because stack unwinding does not take #terminate or #interruptWith: into > account, even processes with properly coded unwind blocks do not > reliably clean up after themselves. Hard to comment here. When I'm in a similar situation, I make whatever code changes I think I need, then shut down the image without saving, then start it back up and Recover Last Changes. I realize your particular application may not be suitable to such a technique. > > As it is, I'm tempted to rename #ensure: to #usually: :-) <chuckle> Well, even if #ensure: is fixed so that it really does work as you wish, you'll still need to design your application to clean up properly when its processes terminate. Regards, Chris |
In reply to this post by Alan Knight-2
Alan Knight wrote:
> This might be another manifestion of the general problem that if a process > is terminated while an unwind block is in the process of running, then that > unwind block does not finish running. This is a known issue, but also a good > reason to be very careful using #terminate. If that's the problem, it may be > because some of the modifications that people made to the RBCodeHighlighter > or some other code that's accessing the event table is terminating > processes. I've played around a bit more and I can now reproduce the deadlock in a fresh visualnc.im [VW7.3.1, VW7.4]: "doit in a workspace" [Object new myEventTable] repeat. If this code is interrupted by pressing Ctrl-Y, the deadlock occurs. (If not at the first time, proceed and try again. For me, it always locks at the first or second attempt.) I suspect that a similar scenario happens with my application (I don't use processes at all). Is there any way to avoid this? While it should be feasible to avoid #terminate and cleanup gracefully for "regular" use of processes, I cannot see how this can be done safely for User Interrupts while debugging. (Maybe this is trivial, my understanding of processes and concurrency in VW is not very deep.) Also, is it possible to #signal the locked semaphore from within an attached gdb session to revive the image? Apologies if this is in the documentation, I couldn't find the relevant section. Regards, - Wolfgang process 0x8dd8b5c suspendedContext is nil process 0x8e5de4c suspendedContext is nil process 0x8ee2cf8 context 0xb7a940d0 Semaphore>>wait context 0x08ef4218 [] in Delay class>>initializeTimingProcess context 0x08ef420c BlockClosure>>on:do: context 0x08ef37ec [] in Process class>>forBlock:priority: process 0x8f0ed44 frame 0xbf81aa0c a(n) Semaphore wait frame 0xbf81aa28 a(n) EventQueue next frame 0xbf81aa40 a(n) WindowManager processNextEvent frame 0xbf81aa58 a(n) BlockClosure [] in WindowManager>>newProcess context 0x08f1b02c BlockClosure>>on:do: context 0x08c8de84 [] in WindowManager>>newProcess context 0x08f1b044 BlockClosure>>on:do: context 0x08f1b05c [] in Process class>>forBlock:priority: process 0x8f36f50 suspendedContext is nil process 0x8f38da4 suspendedContext is nil process 0x8f46250 suspendedContext is nil process 0x8fcca40 suspendedContext is nil process 0x8fccbc0 suspendedContext is nil process 0x8fcccc8 suspendedContext is nil process 0x8fd14d4 context 0x08fd625c Semaphore>>wait context 0x08fdf9a0 [] in CCallback class>>installForeignCallbackProcess context 0x08fdfcf4 BlockClosure>>on:do: context 0x08fd1ce4 [] in Process class>>forBlock:priority: process 0x8fd1504 suspendedContext is nil process 0x8fd6688 suspendedContext is nil process 0x8fdf508 suspendedContext is nil process 0x90ff254 context 0x090ff11c Semaphore>>wait context 0x0910124c [] in CCallback class>>installCallbackProcess context 0x091013d8 BlockClosure>>on:do: context 0x0910142c [] in CCallback class>>installCallbackProcess context 0x09101744 BlockClosure>>on:do: context 0x09101aa4 [] in CCallback class>>installCallbackProcess context 0x09101b94 BlockClosure>>on:do: context 0x090ff188 [] in Process class>>forBlock:priority: process 0x90ff260 context 0x090ff0d4 Semaphore>>wait context 0x091013f0 [] in CCallback class>>installForeignCallbackProcess context 0x09101444 BlockClosure>>on:do: context 0x090ff104 [] in Process class>>forBlock:priority: process 0x90ff5a8 frame 0xbf8197a0 a(n) Semaphore waitIfCurtailedSignal frame 0xbf8197b8 a(n) Semaphore critical: frame 0xbf8197d4 a(n) RecursionLock critical: frame 0xbf8197f8 a(n) EphemeronDictionary at:ifAbsent: frame 0xbf81980c a(n) OrderedCollection myEventTable frame 0xbf819834 a(n) OrderedCollection become: frame 0xbf819858 a(n) OrderedCollection changeCapacityTo: frame 0xbf81986c a(n) OrderedCollection increaseCapacity frame 0xbf819894 a(n) OrderedCollection makeRoomAtLast frame 0xbf8198ac a(n) OrderedCollection addLast: frame 0xbf8198c8 a(n) BlockClosure [] in EventQueue>>nextPut: frame 0xbf8198e4 a(n) BlockClosure ensure: frame 0xbf8198fc a(n) Semaphore critical: frame 0xbf819918 a(n) BlockClosure [] in EventQueue>>nextPut: frame 0xbf819934 a(n) BlockClosure ensure: frame 0xbf81994c a(n) Semaphore critical: frame 0xbf819964 a(n) Process uninterruptablyDo: frame 0xbf819978 a(n) BlockClosure valueUninterruptably frame 0xbf819990 a(n) EventQueue nextPut: frame 0xbf8199a8 a(n) WindowManager addEvent: frame 0xbf8199c0 a(n) ApplicationWindow addEvent: frame 0xbf8199d8 a(n) EventSensor addMetaInput: frame 0xbf819a00 a(n) EventSensor eventResize: frame 0xbf819a1c a(n) InputState send:eventResize: frame 0xbf819a40 a(n) InputState process: frame 0xbf819a58 a(n) InputState 0x0 no selector context 0xb7a94a30 [] in InputState class>>install context 0xb7a910f4 BlockClosure>>on:do: context 0x090ff0bc [] in Process class>>forBlock:priority: process 0x91011f8 context 0xb7a8fec4 Semaphore>>wait context 0x09106250 WeakArray class>>outerFinalizationLoop context 0x09106268 [] in WeakArray class>>installFinalizationMechanism context 0x09106f34 BlockClosure>>on:do: context 0x09107594 [] in Process class>>forBlock:priority: process 0x9106688 frame 0xbf8159a0 a(n) Semaphore waitIfCurtailedSignal frame 0xbf8159b8 a(n) Semaphore critical: frame 0xbf8159d4 a(n) RecursionLock critical: frame 0xbf8159f8 a(n) EphemeronDictionary at:ifAbsent: frame 0xbf815a0c a(n) OrderedCollection myEventTable frame 0xbf815a34 a(n) OrderedCollection become: frame 0xbf815a58 a(n) OrderedCollection changeCapacityTo: frame 0xbf81d374 a(n) OrderedCollection increaseCapacity frame 0xbf81d39c a(n) OrderedCollection makeRoomAtLast frame 0xbf81d3b4 a(n) OrderedCollection addLast: frame 0xbf81d3cc a(n) OrderedCollection add: frame 0xbf81d3f4 a Class (UnixFilename) components: frame 0xbf81d420 a Class (UnixFilename) canonicalize: frame 0xbf81d43c a Class (UnixFilename) createInstanceNamed: frame 0xbf81d454 a Class (Filename) named: frame 0xbf81d468 a(n) ByteString asFilename frame 0xbf81d47c a(n) PortableFilename asFilename frame 0xbf81d490 a(n) FileConnection name frame 0xbf81d4a4 a(n) ExternalReadStream name frame 0xbf81d4b8 a(n) EncodedStream name frame 0xbf81d4d8 a(n) XMLParser wrapDataSource: frame 0xbf81d4f0 a(n) XMLParser on: frame 0xbf81d508 a(n) XMLParser parseElement: frame 0xbf81d538 a(n) BlockClosure [] in XMLSourceFileFormat>>methodSourceAt:in: frame 0xbf81d554 a(n) BlockClosure on:do: frame 0xbf81d574 a(n) XMLSourceFileFormat methodSourceAt:in: frame 0xbf81d5a4 a(n) BlockClosure [] in SourceFileManager>>retrieveMethodSourceAt:using:ifAbsent: frame 0xbf81d5c0 a(n) BlockClosure on:do: frame 0xbf81d5e4 a(n) SourceFileManager retrieveMethodSourceAt:using:ifAbsent: frame 0xbf81d608 a(n) SourceFileManager methodSourceAt:ifAbsent: frame 0xbf81d61c a(n) CompiledMethod methodSources frame 0xbf81d634 a(n) CompiledMethod getSource frame 0xbf81d648 a(n) CompiledBlock getSource frame 0xbf81d668 a(n) CompiledBlock getSourceForUserIfNone: frame 0xbf81d680 a(n) BlockClosure [] in BlockClosure>>unboundMethod frame 0xbf81d69c a(n) BlockClosure on:do: frame 0xbf81d6b0 <Hybrid Block Context> sourceCode frame 0xbf81d6d0 <Hybrid Block Context> selector frame 0xbf81d6ec a(n) DebuggerService context: frame 0xbf81d704 a(n) DebuggerService selectContext: frame 0xbf81d71c a(n) DebuggerService selectContextAt: frame 0xbf81d734 a(n) DebuggerService onHandle: frame 0xbf81d750 a(n) DebuggerService process:context:interrupted: frame 0xbf81d778 a Class (DebuggerService) context:proceedable:interrupted: frame 0xbf81d7a0 a Class (DebuggerService) openOn:exception:interrupted: frame 0xbf81d7c0 a Class (DebuggerService) openOnException: frame 0xbf81d7d8 a Class (DebuggerService) openException: frame 0xbf81d7f0 a Class (Notifier) openException: frame 0xbf81d808 a(n) UnhandledException defaultAction frame 0xbf81d828 a(n) UnhandledException performHandler: frame 0xbf81d844 a(n) UnhandledException propagatePrivateFrom: frame 0xbf81d85c a(n) UnhandledException propagateFrom: frame 0xbf81d870 a(n) UnhandledException propagate frame 0xbf81d884 a(n) UnhandledException raiseSignal frame 0xbf81d898 a(n) UserInterrupt noHandler frame 0xbf81d8ac a(n) UserInterrupt defaultAction frame 0xbf81d8cc a(n) UserInterrupt performHandler: frame 0xbf81d8e8 a(n) UserInterrupt propagatePrivateFrom: frame 0xbf81d900 a(n) UserInterrupt propagateFrom: frame 0xbf81d914 a(n) UserInterrupt propagate frame 0xbf81d928 a(n) UserInterrupt raiseSignal frame 0xbf81d944 a Class (UserInterrupt) interruptWith:errorString: frame 0xbf81d958 a(n) BlockClosure [] in DebuggerService class>>interruptActiveUserProcess frame 0xbf81d978 a(n) BlockClosure [] in Process>>interruptWith: frame 0xbf81d98c a(n) BlockClosure [] in RecursionLock>>critical: frame 0xbf81d9a8 a(n) BlockClosure ensure: frame 0xbf81d9c0 a(n) Semaphore critical: frame 0xbf81d9dc a(n) RecursionLock critical: frame 0xbf81da00 a(n) EphemeronDictionary at:ifAbsent: frame 0xbf81da14 a(n) Object myEventTable frame 0xbf81da2c a(n) Object actionForEvent: frame 0xbf81da44 a(n) Object triggerEvent: frame 0xbf81da58 <nil> 0x0 no selector context 0xb7a93eb4 UndefinedObject(Object)>>performMethod:arguments: context 0xb7a93ea8 UndefinedObject(Object)>>performMethod: context 0xb7a93e9c TextEditorController(ParagraphEditor)>>evaluateCompiled: context 0xb7a93e84 [] in ParagraphEditor>>evaluateSelection context 0xb7a93e6c BlockClosure>>ensure: context 0xb7a93e60 Cursor>>showWhile: context 0xb7a93e54 TextEditorController(ParagraphEditor)>>evaluateSelection context 0xb7a93e48 [] in ParagraphEditor>>doIt context 0xb7a94880 BlockClosure>>on:do: context 0xb7a93e3c TextEditorController(ParagraphEditor)>>doIt context 0xb7a93e30 TextEditorController>>dispatchMenuSymbol: context 0xb7a93e24 TextEditorController>>dispatchMenuSelection: context 0xb7a93e18 TextEditorController(ControllerWithMenu)>>processMenu:at:centered: context 0xb7a93e0c TextEditorController(ControllerWithMenu)>>processMenuAt:centered: context 0xb7a93e00 TextEditorController(ControllerWithMenu)>>yellowButtonPressedEvent: context 0xb7a93df4 TextEditorController(ParagraphEditor)>>yellowButtonPressedEvent: context 0xb7a93de8 TextEditorController>>yellowButtonPressedEvent: context 0xb7a93ddc YellowButtonPressedEvent>>dispatchTo: context 0xb7a93dd0 TextEditorController(ControllerWithMenu)>>handleEvent: context 0xb7a93dc4 EventDispatcher>>dispatch:to: context 0xb7a93db8 EventDispatcher>>dispatchEvent: context 0xb7a93dac YellowButtonPressedEvent(Event)>>dispatch context 0xb7a93da0 YellowButtonPressedEvent(Event)>>dispatchForWindowManager: context 0xb7a93d94 [] in WindowManager>>safelyDispatchForWindowManager: context 0xb7a94874 BlockClosure>>on:do: context 0xb7a93d88 WindowManager>>safelyDispatchForWindowManager: context 0xb7a93d7c WindowManager>>processNextEvent context 0xb7a94a54 [] in WindowManager>>newProcess context 0xb7a94a48 BlockClosure>>on:do: context 0xb7a909a4 [] in WindowManager>>newProcess context 0xb7a8f3b4 BlockClosure>>on:do: context 0xb7a8f3a8 [] in Process class>>forBlock:priority: process 0xb7905550 frame 0xbf81ea3c a(n) Semaphore wait frame 0xbf81ea58 a(n) BlockClosure [] in ObjectMemory class>>installScavengeNotification context 0xb7a94a00 BlockClosure>>on:do: context 0xb7908580 [] in Process class>>forBlock:priority: process 0xb790555c frame 0xbf818a44 a(n) Semaphore wait frame 0xbf818a58 a Class (ObjectMemory) 0x0 no selector context 0xb7a94a18 [] in ObjectMemory class>>installIdleLoopProcess context 0xb7a94754 BlockClosure>>on:do: context 0xb7908598 [] in Process class>>forBlock:priority: process 0xb79085c8 frame 0xbf81ba44 a(n) Semaphore wait frame 0xbf81ba58 a Class (ObjectMemory) 0x0 no selector context 0x090ff578 [] in ObjectMemory class>>installLowSpaceProcess context 0x090ff590 BlockClosure>>on:do: context 0xb79085d4 [] in Process class>>forBlock:priority: process 0xb79085ec context 0x090ff194 Semaphore>>wait context 0x09101234 [] in ExternalProcess class>>startReaper context 0x091013b4 BlockClosure>>on:do: context 0xb79085f8 [] in Process class>>forBlock:priority: process 0xb7a8cb34 frame 0xbf81c9a4 a(n) Semaphore wait frame 0xbf81c9c0 a(n) EventQueue next frame 0xbf81c9d8 a(n) WindowManager processNextEvent frame 0xbf81c9f0 a(n) BlockClosure [] in WindowManager>>newProcess frame 0xbf81ca0c a(n) BlockClosure on:do: frame 0xbf81ca24 a(n) BlockClosure [] in WindowManager>>newProcess frame 0xbf81ca40 a(n) BlockClosure on:do: frame 0xbf81ca58 a(n) BlockClosure [] in Process class>>forBlock:priority: process 0xb7a8e4c0 frame 0xbf817668 a(n) Semaphore waitIfCurtailedSignal frame 0xbf817680 a(n) Semaphore critical: frame 0xbf81769c a(n) RecursionLock critical: frame 0xbf8176c0 a(n) EphemeronDictionary at:ifAbsent: frame 0xbf8176d4 a(n) OrderedCollection myEventTable frame 0xbf8176fc a(n) OrderedCollection become: frame 0xbf817720 a(n) OrderedCollection changeCapacityTo: frame 0xbf817734 a(n) OrderedCollection increaseCapacity frame 0xbf81775c a(n) OrderedCollection makeRoomAtLast frame 0xbf817774 a(n) OrderedCollection addLast: frame 0xbf81778c a(n) OrderedCollection add: frame 0xbf8177c8 a(n) TabControlBarView displayOn: frame 0xbf8177e0 a(n) BoundedWrapper displayOn: frame 0xbf817808 a(n) TabControlComposite displayOn: frame 0xbf817820 a(n) BoundedWrapper displayOn: frame 0xbf817838 a(n) SpecWrapper displayOn: frame 0xbf817854 a(n) SpecWrapper displayOn: frame 0xbf81787c a(n) CompositePart displayOn: frame 0xbf817894 a(n) BoundedWrapper displayOn: frame 0xbf8178bc a(n) ReComposingComposite displayOn: frame 0xbf8178f0 a(n) WindowDisplayPolicy displayDamageList:in: frame 0xbf817908 a(n) ApplicationWindow displayDamageEvent: frame 0xbf817920 a(n) ApplicationWindow checkForEvents frame 0xbf81793c a(n) BlockClosure [] in WindowManager>>repairDamagesExcept: frame 0xbf81795c a(n) OrderedCollection do: frame 0xbf817978 a(n) BlockClosure [] in WindowManager>>repairDamagesExcept: frame 0xbf817994 a(n) BlockClosure on:do: frame 0xbf8179ac a(n) WindowManager repairDamagesExcept: frame 0xbf8179c0 a(n) WindowManager repairDamages frame 0xbf8179d8 a(n) WindowManager processNextEvent frame 0xbf8179f0 a(n) BlockClosure [] in WindowManager>>newProcess frame 0xbf817a0c a(n) BlockClosure on:do: frame 0xbf817a24 a(n) BlockClosure [] in WindowManager>>newProcess frame 0xbf817a40 a(n) BlockClosure on:do: frame 0xbf817a58 a(n) BlockClosure [] in Process class>>forBlock:priority: process 0x8dd8b5c suspendedContext is nil process 0x8e5de4c suspendedContext is nil process 0x8ee2cf8 frame 0xbface084 a(n) Semaphore wait frame 0xbface098 a(n) BlockClosure [] in Delay class>>initializeTimingProcess context 0x08ef420c BlockClosure>>on:do: context 0x08ef37ec [] in Process class>>forBlock:priority: process 0x8f0ed44 frame 0xbfad504c a(n) Semaphore wait frame 0xbfad5068 a(n) EventQueue next frame 0xbfad5080 a(n) WindowManager processNextEvent frame 0xbfad5098 a(n) BlockClosure [] in WindowManager>>newProcess context 0x08f1b02c BlockClosure>>on:do: context 0x08c8de84 [] in WindowManager>>newProcess context 0x08f1b044 BlockClosure>>on:do: context 0x08f1b05c [] in Process class>>forBlock:priority: process 0x8f36f50 suspendedContext is nil process 0x8f38da4 suspendedContext is nil process 0x8f46250 suspendedContext is nil process 0x8fcca40 suspendedContext is nil process 0x8fccbc0 suspendedContext is nil process 0x8fcccc8 suspendedContext is nil process 0x8fd14d4 context 0x08fd625c Semaphore>>wait context 0x08fdf9a0 [] in CCallback class>>installForeignCallbackProcess context 0x08fdfcf4 BlockClosure>>on:do: context 0x08fd1ce4 [] in Process class>>forBlock:priority: process 0x8fd1504 suspendedContext is nil process 0x8fd6688 suspendedContext is nil process 0x8fdf508 suspendedContext is nil process 0x916575c context 0x091715ac Semaphore>>wait context 0x081c2bf8 [] in CCallback class>>installCallbackProcess context 0x081c5f4c BlockClosure>>on:do: context 0x081c8028 [] in CCallback class>>installCallbackProcess context 0x081c93e8 BlockClosure>>on:do: context 0x081c9adc [] in CCallback class>>installCallbackProcess context 0x081d8efc BlockClosure>>on:do: context 0x09171540 [] in Process class>>forBlock:priority: process 0x91657b0 context 0x0916620c Semaphore>>wait context 0x091992e4 [] in CCallback class>>installForeignCallbackProcess context 0xb79b6810 BlockClosure>>on:do: context 0x091715c4 [] in Process class>>forBlock:priority: process 0x916bed0 (activeProcess) frame 0xbfad0d6c a(n) RecursionLock critical: frame 0xbfad0d90 a(n) EphemeronDictionary at:ifAbsent: frame 0xbfad0da4 a(n) Object myEventTable frame 0xbfad0db8 <nil> 0x0 no selector frame 0xbfad0dd4 <nil> performMethod:arguments: frame 0xbfad0dec <nil> performMethod: frame 0xbfad0e08 a(n) TextEditorController evaluateCompiled: frame 0xbfad0e24 a(n) BlockClosure [] in ParagraphEditor>>evaluateSelection frame 0xbfad0e40 a(n) BlockClosure ensure: frame 0xbfad0e5c a(n) Cursor showWhile: frame 0xbfad0e78 a(n) TextEditorController evaluateSelection frame 0xbfad0e90 a(n) BlockClosure [] in ParagraphEditor>>doIt frame 0xbfad0eac a(n) BlockClosure on:do: frame 0xbfad0ec0 a(n) TextEditorController doIt frame 0xbfad0ed8 a(n) TextEditorController dispatchMenuSymbol: frame 0xbfad0ef0 a(n) TextEditorController dispatchMenuSelection: frame 0xbfad0f10 a(n) TextEditorController processMenu:at:centered: frame 0xbfad0f34 a(n) TextEditorController processMenuAt:centered: frame 0xbfad0f4c a(n) TextEditorController yellowButtonPressedEvent: frame 0xbfad0f64 a(n) TextEditorController yellowButtonPressedEvent: frame 0xbfad0f7c a(n) TextEditorController yellowButtonPressedEvent: frame 0xbfad0f94 a(n) YellowButtonPressedEvent dispatchTo: frame 0xbfad0fac a(n) TextEditorController handleEvent: frame 0xbfad0fcc a(n) EventDispatcher dispatch:to: frame 0xbfad0fec a(n) EventDispatcher dispatchEvent: frame 0xbfad1000 a(n) YellowButtonPressedEvent dispatch frame 0xbfad1018 a(n) YellowButtonPressedEvent dispatchForWindowManager: frame 0xbfad1034 a(n) BlockClosure [] in WindowManager>>safelyDispatchForWindowManager: frame 0xbfad1050 a(n) BlockClosure on:do: frame 0xbfad1068 a(n) WindowManager safelyDispatchForWindowManager: frame 0xbfad1080 a(n) WindowManager processNextEvent frame 0xbfad1098 a(n) BlockClosure [] in WindowManager>>newProcess context 0xb79b28ec BlockClosure>>on:do: context 0xb79b2910 [] in WindowManager>>newProcess context 0xb79b2934 BlockClosure>>on:do: context 0xb79b2958 [] in Process class>>forBlock:priority: process 0xb79b29d0 frame 0xbfad2084 a(n) Semaphore wait frame 0xbfad2098 a Class (ObjectMemory) 0x0 no selector context 0xb7b4aae4 [] in ObjectMemory class>>installIdleLoopProcess context 0xb7b4a9ac BlockClosure>>on:do: context 0xb79b67ec [] in Process class>>forBlock:priority: process 0xb79b2b98 frame 0xbfad407c a(n) Semaphore wait frame 0xbfad4098 a(n) BlockClosure [] in ObjectMemory class>>installScavengeNotification context 0xb79bb6a0 BlockClosure>>on:do: context 0xb79b67bc [] in Process class>>forBlock:priority: process 0xb79b2ba4 context 0x091714e0 Semaphore>>wait context 0x081c221c [] in ExternalProcess class>>startReaper context 0x081c535c BlockClosure>>on:do: context 0xb79b67a4 [] in Process class>>forBlock:priority: process 0xb79b6750 frame 0xbfad3084 a(n) Semaphore wait frame 0xbfad3098 a Class (ObjectMemory) 0x0 no selector context 0xb79e5a24 [] in ObjectMemory class>>installLowSpaceProcess context 0x09165a8c BlockClosure>>on:do: context 0xb79b675c [] in Process class>>forBlock:priority: process 0xb79e47d0 frame 0xbfacd080 a(n) Semaphore wait frame 0xbfacd098 a(n) InputState 0x0 no selector context 0xb7b4ab08 [] in InputState class>>install context 0xb7b4a928 BlockClosure>>on:do: context 0xb79e4794 [] in Process class>>forBlock:priority: |
In reply to this post by Wolfgang Mayer
Wolfgang
I can't say for sure what the problem is, however, the EphemeronDictionary recursion lock looks rather suspicious. Even if it is not the problem I question why we are checking the event table when we do a become on these collections. Terry =========================================================== Terry Raymond Smalltalk Professional Debug Package Crafted Smalltalk 80 Lazywood Ln. Tiverton, RI 02878 (401) 624-4517 [hidden email] <http://www.craftedsmalltalk.com> =========================================================== > -----Original Message----- > From: Wolfgang Mayer [mailto:[hidden email]] > Sent: Tuesday, January 31, 2006 1:12 AM > To: VWNC List > Subject: Debugger/Highlighter Freezes Image > > I've experienced the VW7.4 debugger freeze twice this week, usually > after forking another debugger from the current one using "debug it" > or when editing a method within the debugger. Unfortunately, I have > not been able to reproduce this. > > From the stack trace it seems that this may be related to the > RBCodeHighlighter? > > We use a slightly modified version of the RBCodeHighlighter that > redraws only the portion of the text view where there emphasis has > actually changed. To compute this, we compare the highlighted copied > text to the original to find spans with changed emphasis. We then find > and invalidate the view coordinates including those characters. Except > for a few helper methods, the main change to > HighlightingTextEditorController>>startHighlighting is as follows: > > Instead of > > [localText string = self text string > ifTrue: > [self text setString: self text string > localText runs. > self view resetSelections. > self view invalidateRectangle: self view bounds > repairNow: true]]. > > we use > > [localText string = self text string > ifTrue: > [| oldText | > oldText := self text copy. > self text setString: self text string setRuns: > localText runs. > self view resetSelections. > self redrawChangedEmphasisFrom: oldText to: self > text]]. > > The helpers are implemented in terms of Text>>emphasisAt:, > Text>>sameEmphasisAs:, > self view invalidateRectangle:repairNow:true, and self view > characterBlockForIndex:. > > > Any chances that this could be causing the lockups? > > > Anyway, here's the stack trace [gdb, dumpAllProcesses(1)]. Maybe there is > something obvious I don't see: > [Platform: Ubuntu Linux, kernel 2.6.15-12-686, glibc 2.3.6, X11 Xorg > 6.8.2] > > > Any hints would be appreciated. > > > - Wolfgang > > > > process 0x81dfb28 > > frame 0xbfdc9750 a(n) Semaphore waitIfCurtailedSignal > frame 0xbfdc9768 a(n) Semaphore critical: > frame 0xbfdc9784 a(n) RecursionLock critical: > frame 0xbfdc97a8 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbfdc97bc a(n) ByteString myEventTable > frame 0xbfdc97e4 a(n) ByteString become: > frame 0xbfdc9800 a(n) ByteString changeSizeTo: > frame 0xbfdc9818 a(n) ByteString growToAtLeast: > frame 0xbfdc9830 a(n) WriteStream pastEndPut: > frame 0xbfdc9848 a(n) WriteStream nextPut: > frame 0xbfdc985c a(n) CodeHighlightingScanner step > frame 0xbfdc9870 a(n) CodeHighlightingScanner scanForToken > frame 0xbfdc9884 a(n) CodeHighlightingScanner next > frame 0xbfdc9898 a(n) CodeHighlightingParser getNextToken > frame 0xbfdc98b0 a(n) CodeHighlightingParser performParsingLoop > frame 0xbfdc98c4 a(n) CodeHighlightingParser parse > frame 0xbfdc98dc a(n) BlockClosure [] in CodeHighlightingParser > class>>formatMethod:forClass:namespace: > frame 0xbfdc98f8 a(n) BlockClosure on:do: > frame 0xbfdc9918 a Class (CodeHighlightingParser) > formatMethod:forClass:namespace: > frame 0xbfdc9954 a(n) BlockClosure [] in > HighlightingTextEditorController>>startHighlighting: > frame 0xbfdc9970 a(n) BlockClosure on:do: > frame 0xbfdc9988 a(n) BlockClosure [] in Process class>>forBlock:priority: > > process 0x8cde7a4 > suspendedContext is nil > > process 0x8de8940 > > frame 0xbfdcd974 a(n) Semaphore wait > frame 0xbfdcd988 a(n) BlockClosure [] in Delay > class>>initializeTimingProcess > context 0x08df9e54 BlockClosure>>on:do: > context 0x08df9434 [] in Process class>>forBlock:priority: > > process 0x95a19d8 > > context 0xb79b82dc Process>>resume > context 0xb79c6370 BlockClosure>>forkAt: > context 0x097a3590 Process>>suspendResumable:do: > context 0xb79b7b98 DebuggerService class>>openOn:exception:interrupted: > context 0xb79c6358 DebuggerService class>>openOnException: > context 0x097a31a0 DebuggerService class>>openException: > context 0x097a3188 Notifier class>>openException: > context 0x097a3170 UnhandledException>>defaultAction > context 0x097a3158 UnhandledException(GenericException)>>performHandler: > context 0x097a30b0 > UnhandledException(GenericException)>>propagatePrivateFrom: > context 0xb79b7b68 UnhandledException(GenericException)>>propagateFrom: > context 0xb79c6340 UnhandledException(GenericException)>>propagate > context 0xb79b7b5c UnhandledException(GenericException)>>raiseSignal > context 0xb79c6328 BreakInterrupt(GenericException)>>noHandler > context 0x097a32f0 BreakInterrupt(GenericException)>>defaultAction > context 0x097a32d8 BreakInterrupt(GenericException)>>performHandler: > context 0x097a3278 BreakInterrupt(GenericException)>>propagatePrivateFrom: > context 0xb79b7b50 BreakInterrupt(GenericException)>>propagateFrom: > context 0xb79c6310 BreakInterrupt(GenericException)>>propagate > context 0xb79b7b44 BreakInterrupt(GenericException)>>raiseSignal > context 0xb79b7a6c BreakInterrupt class(GenericException > class)>>raiseRequestWith:errorString: > context 0xb79b7b74 CodeProbe(Object)>>breakOn:label: > context 0x095a772c CodeProbe>>actOn: > context 0xb79b821c IndexTreeMutator>>unboundMethod > ... > context 0xb79b0374 BlockClosure>>ensure: > context 0xb79b0368 Cursor>>showWhile: > context 0xb79b035c LoggingDebugger>>debugAndPrintEvents > context 0xb79b0350 [] in LoggingDebugger>>debug > context 0xb79b0344 LoggingDebugger>>runAndMeasureTime: > context 0xb79b0338 LoggingDebugger>>debug // <- > entry > point of my application > context 0xb79b032c UndefinedObject>>unboundMethod > context 0xb79b0320 UndefinedObject(Object)>>performMethod:arguments: > context 0xb79b0314 UndefinedObject(Object)>>performMethod: > context 0xb79b0308 > HighlightingTextEditorController(ParagraphEditor)>>evaluateCompiled: > context 0xb79b02fc [] in ParagraphEditor>>evaluateSelection > context 0xb79c9a60 BlockClosure>>ensure: > context 0xb79b02f0 Cursor>>showWhile: > context 0xb79b02e4 > HighlightingTextEditorController(ParagraphEditor)>>evaluateSelection > context 0xb79b02d8 [] in ParagraphEditor>>doIt > context 0xb79d8970 BlockClosure>>on:do: > context 0xb79b02cc HighlightingTextEditorController(ParagraphEditor)>>doIt > context 0xb79b02c0 > HighlightingTextEditorController(TextEditorController)>>dispatchMenuSymbol > : > context 0xb79b02b4 > HighlightingTextEditorController(TextEditorController)>>dispatchMenuSelect > ion: > context 0xb79b02a8 > HighlightingTextEditorController(ControllerWithMenu)>>processMenu:at:cente > red: > context 0xb79b029c > HighlightingTextEditorController(ControllerWithMenu)>>processMenuAt:center > ed: > context 0xb79b0290 > HighlightingTextEditorController(ControllerWithMenu)>>yellowButtonPressedE > vent: > context 0xb79b0284 > HighlightingTextEditorController(ParagraphEditor)>>yellowButtonPressedEven > t: > context 0xb79b0278 > HighlightingTextEditorController(TextEditorController)>>yellowButtonPresse > dEvent: > context 0xb79b026c YellowButtonPressedEvent>>dispatchTo: > context 0xb79b0260 > HighlightingTextEditorController(ControllerWithMenu)>>handleEvent: > context 0xb79b0254 EventDispatcher>>dispatch:to: > context 0xb79b023c EventDispatcher>>dispatchEvent: > context 0xb79b0230 YellowButtonPressedEvent(Event)>>dispatch > context 0xb79b0218 > YellowButtonPressedEvent(Event)>>dispatchForWindowManager: > context 0xb79b020c [] in WindowManager>>safelyDispatchForWindowManager: > context 0xb79d891c BlockClosure>>on:do: > context 0xb79b0200 WindowManager>>safelyDispatchForWindowManager: > context 0xb79b01f4 WindowManager>>processNextEvent > context 0x095e5478 [] in WindowManager>>newProcess > context 0x095e53e8 BlockClosure>>on:do: > context 0x095e53c4 [] in WindowManager>>newProcess > context 0x095e5340 BlockClosure>>on:do: > context 0x095a1708 [] in Process class>>forBlock:priority: > > process 0x95a2440 > > context 0x095ae5d8 Semaphore>>wait > context 0x095ab260 EventQueue>>next > context 0x095ab248 WindowManager>>processNextEvent > context 0xb79dc1bc [] in WindowManager>>newProcess > context 0xb79db6e8 BlockClosure>>on:do: > context 0xb79c04f0 [] in WindowManager>>newProcess > context 0x097a8234 BlockClosure>>on:do: > context 0x095a78c4 [] in Process class>>forBlock:priority: > > process 0x95b9474 > > context 0xb79dfc18 Semaphore>>wait > context 0xb79b34b8 EventQueue>>next > context 0xb79b63a4 WindowManager>>processNextEvent > context 0xb79d057c [] in WindowManager>>newProcess > context 0x095d4438 BlockClosure>>on:do: > context 0x095b2694 [] in WindowManager>>newProcess > context 0x095d4444 BlockClosure>>on:do: > context 0x095b585c [] in Process class>>forBlock:priority: > > process 0x95c8360 > suspendedContext is nil > > process 0x95cc5f0 > suspendedContext is nil > > process 0x95da0e4 > > context 0x095ab698 Semaphore>>wait > context 0x095a9a54 EventQueue>>next > context 0x095a9a3c WindowManager>>processNextEvent > context 0xb79d02d0 [] in WindowManager>>newProcess > context 0x095d7e40 BlockClosure>>on:do: > context 0xb79cfe8c [] in WindowManager>>newProcess > context 0x095d7e34 BlockClosure>>on:do: > context 0x095da0cc [] in Process class>>forBlock:priority: > > process 0x95e1938 > suspendedContext is nil > > process 0x967753c > suspendedContext is nil > > process 0x96dfab0 > > context 0x095ab680 Semaphore>>wait > context 0x095a9b80 EventQueue>>next > context 0x095a9b5c WindowManager>>processNextEvent > context 0x097795e4 [] in WindowManager>>newProcess > context 0x0977ae44 BlockClosure>>on:do: > context 0x09779e60 [] in WindowManager>>newProcess > context 0x0977ae50 BlockClosure>>on:do: > context 0x096dff18 [] in Process class>>forBlock:priority: > > process 0x96e248c > suspendedContext is nil > > process 0x96ea238 > > frame 0xbfdc86d8 a(n) Semaphore waitIfCurtailedSignal > frame 0xbfdc86f0 a(n) Semaphore critical: > frame 0xbfdc870c a(n) RecursionLock critical: > frame 0xbfdc8730 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbfdc8744 a(n) OrderedCollection myEventTable > frame 0xbfdc876c a(n) OrderedCollection become: > frame 0xbfdc8790 a(n) OrderedCollection changeCapacityTo: > frame 0xbfdc87a4 a(n) OrderedCollection increaseCapacity > frame 0xbfdc87cc a(n) OrderedCollection makeRoomAtLast > frame 0xbfdc87e4 a(n) OrderedCollection addLast: > frame 0xbfdc8808 a(n) BlockClosure [] in EventQueue>>nextPut:collapse: > frame 0xbfdc8824 a(n) BlockClosure ensure: > frame 0xbfdc883c a(n) Semaphore critical: > frame 0xbfdc8860 a(n) BlockClosure [] in EventQueue>>nextPut:collapse: > frame 0xbfdc887c a(n) BlockClosure ensure: > frame 0xbfdc8894 a(n) Semaphore critical: > frame 0xbfdc88ac a(n) Process uninterruptablyDo: > frame 0xbfdc88c0 a(n) BlockClosure valueUninterruptably > frame 0xbfdc88e0 a(n) EventQueue nextPut:collapse: > frame 0xbfdc88fc a(n) WindowManager addEvent:collapse: > frame 0xbfdc8914 a(n) EventSensor addCollapsedMetaInput: > frame 0xbfdc892c a(n) EventSensor eventMouseMoved: > frame 0xbfdc894c a(n) InputState send:eventMouseMoved: > frame 0xbfdc8970 a(n) InputState process: > frame 0xbfdc8988 a(n) InputState 0x0 no selector > context 0x096f7ed0 [] in InputState class>>install > context 0x096f2de8 BlockClosure>>on:do: > context 0x096ea070 [] in Process class>>forBlock:priority: > > process 0x9755944 > > frame 0xbfdca974 a(n) Semaphore wait > frame 0xbfdca988 a Class (ObjectMemory) 0x0 no selector > context 0x0977a2c8 [] in ObjectMemory class>>installIdleLoopProcess > context 0x09777868 BlockClosure>>on:do: > context 0x09707e24 [] in Process class>>forBlock:priority: > > process 0x97559bc > > context 0x081c0c7c Semaphore>>wait > context 0x096e9fd4 ObjectMemory class>>lowSpaceLoop > context 0x097ba114 [] in ObjectMemory class>>installLowSpaceProcess > context 0x097bb8a8 BlockClosure>>on:do: > context 0x09707f08 [] in Process class>>forBlock:priority: > > process 0x9755a28 > > context 0x096ea1c0 Semaphore>>wait > context 0x097be77c [] in ExternalProcess class>>startReaper > context 0x0979fd38 BlockClosure>>on:do: > context 0x09707ed8 [] in Process class>>forBlock:priority: > > process 0x9755a34 > > frame 0xbfdd096c a(n) Semaphore wait > frame 0xbfdd0988 a(n) BlockClosure [] in ObjectMemory > class>>installScavengeNotification > context 0x097915a8 BlockClosure>>on:do: > context 0x09707e6c [] in Process class>>forBlock:priority: > > process 0x9793d2c > > context 0x081c0c58 Semaphore>>wait > context 0x09799e64 WeakArray class>>outerFinalizationLoop > context 0x09799e58 [] in WeakArray class>>installFinalizationMechanism > context 0x09799744 BlockClosure>>on:do: > context 0x097b898c [] in Process class>>forBlock:priority: > > process 0x97ab69c > > context 0xb79def70 Semaphore>>wait > context 0xb79dd914 EventQueue>>next > context 0xb79b0128 WindowManager>>processNextEvent > context 0x096f81d0 [] in WindowManager>>newProcess > context 0x096f81dc BlockClosure>>on:do: > context 0x096f8200 [] in WindowManager>>newProcess > context 0x096f8218 BlockClosure>>on:do: > context 0x09799ea0 [] in Process class>>forBlock:priority: > > process 0x97b5c2c > > context 0x096ea130 Semaphore>>wait > context 0x0978eb24 [] in CCallback class>>installForeignCallbackProcess > context 0x0978eb0c BlockClosure>>on:do: > context 0x097b5c38 [] in Process class>>forBlock:priority: > > process 0x97b5ca4 > > context 0x096ea13c Semaphore>>wait > context 0x0975be24 [] in CCallback class>>installCallbackProcess > context 0x0975be78 BlockClosure>>on:do: > context 0x0975beb4 [] in CCallback class>>installCallbackProcess > context 0x0975bed8 BlockClosure>>on:do: > context 0x0975bf20 [] in CCallback class>>installCallbackProcess > context 0x0975bf74 BlockClosure>>on:do: > context 0x097b5cb0 [] in Process class>>forBlock:priority: > > process 0xb79af78c > > frame 0xbfdc7534 a(n) Semaphore waitIfCurtailedSignal > frame 0xbfdc754c a(n) Semaphore critical: > frame 0xbfdc7568 a(n) RecursionLock critical: > frame 0xbfdc758c a(n) EphemeronDictionary at:ifAbsent: > frame 0xbfdc75a0 a(n) Set myEventTable > frame 0xbfdc75c8 a(n) Set become: > frame 0xbfdc75e4 a(n) Set changeCapacityTo: > frame 0xbfdc75f8 a(n) Set grow > frame 0xbfdc7614 a(n) Set fullCheck > frame 0xbfdc7630 a(n) Set atNewIndex:put: > frame 0xbfdc764c a(n) Set add: > frame 0xbfdc7668 a(n) BlockClosure [] in CompiledCode>>allSymbolLiterals > frame 0xbfdc768c a(n) BlockClosure [] in > CompiledCode>>allSymbolLiteralsDo: > frame 0xbfdc76b0 a(n) InstructionStream scanFor: > frame 0xbfdc76dc a(n) ProbedCompiledMethod allSymbolLiteralsDo: > frame 0xbfdc76f4 a(n) ProbedCompiledMethod allSymbolLiterals > frame 0xbfdc7720 a(n) DebuggerClient querySubmenuSending: > frame 0xbfdc7738 a(n) BlockClosure [] in > DebuggerClient>>setQuerySubmenuBlocksIn: > frame 0xbfdc774c a(n) MenuItemAdornment submenu > frame 0xbfdc7760 a(n) MenuItem submenu > frame 0xbfdc7788 a(n) BlockClosure [] in BlockClosure>>unboundMethod > frame 0xbfdc77a8 a(n) Array do: > frame 0xbfdc77c4 a(n) MotifMenuView menuItemForShortcutKey:inMenu: > frame 0xbfdc77dc a(n) MotifMenuView menuItemForShortcutKey: > frame 0xbfdc7804 a(n) MotifMenuBarButtonView > processShortcutKeyEventAsMenuItemAccessor: > frame 0xbfdc7820 a(n) BlockClosure [] in BlockClosure>>unboundMethod > frame 0xbfdc7840 a(n) OrderedCollection do: > frame 0xbfdc7858 a(n) MotifMenuBar processShortcutKeyEventInMenuBar: > frame 0xbfdc7880 a(n) KeyboardProcessor processShortcutKeyEvent: > frame 0xbfdc789c a(n) KeyboardProcessor processKeyboardEvent: > frame 0xbfdc78bc a(n) KeyboardProcessor processKeyboardEvent:for: > frame 0xbfdc78dc a(n) EventDispatcher dispatchEvent: > frame 0xbfdc78f0 a(n) KeyPressedEvent dispatch > frame 0xbfdc7908 a(n) KeyPressedEvent dispatchForWindowManager: > frame 0xbfdc7924 a(n) BlockClosure [] in > WindowManager>>safelyDispatchForWindowManager: > frame 0xbfdc7940 a(n) BlockClosure on:do: > frame 0xbfdc7958 a(n) WindowManager safelyDispatchForWindowManager: > frame 0xbfdc7970 a(n) WindowManager processNextEvent > frame 0xbfdc7988 a(n) BlockClosure [] in WindowManager>>newProcess > context 0xb79e1b08 BlockClosure>>on:do: > context 0xb79b69ec [] in WindowManager>>newProcess > context 0xb79e1afc BlockClosure>>on:do: > context 0x095d17ec [] in Process class>>forBlock:priority: > > process 0xb79b84a4 > suspendedContext is nil > > process 0xb79b9800 > > context 0xb79e1b80 Semaphore>>wait > context 0xb79da830 EventQueue>>next > context 0xb79da68c WindowManager>>processNextEvent > context 0xb79c4924 [] in WindowManager>>newProcess > context 0xb79e1700 BlockClosure>>on:do: > context 0xb79e1664 [] in WindowManager>>newProcess > context 0xb79e1628 BlockClosure>>on:do: > context 0xb79b97f4 [] in Process class>>forBlock:priority: > > process 0xb79bd76c > > context 0xb79e1970 Semaphore>>wait > context 0x096ecd28 EventQueue>>next > context 0xb79ccb14 WindowManager>>processNextEvent > context 0xb79e1a84 [] in WindowManager>>newProcess > context 0xb79e1a78 BlockClosure>>on:do: > context 0xb79d93fc [] in WindowManager>>newProcess > context 0xb79c5044 BlockClosure>>on:do: > context 0xb79b6c20 [] in Process class>>forBlock:priority: > > process 0xb79c5974 > > context 0xb79e0e24 Semaphore>>signal > context 0xb79e0e18 [] in ProcessHandle>>performDebugOperation: > > process 0xb79d120c > suspendedContext is nil > > process 0xb79d6a80 > suspendedContext is nil > > process 0xb79dc018 > suspendedContext is nil > > process 0xb79dc300 > suspendedContext is nil > > process 0xb79dc54c > suspendedContext is nil > > process 0xb79e1a0c > suspendedContext is nil > > --- Last modified: <06/01/31 16:37:53 > [hidden email]> --- |
In reply to this post by Wolfgang Mayer
I've never had this problem. (That I know of).
But it sounds to me that it implies that pressing ^Y has the possibility of destroying your image. This is not acceptable! VisualWorks is supposed to be the robust, industrial-strength Smalltalk, and the average developer is not going to know enough about the ins and outs of exception handling to know when this could happen. I imagine that the problem is that an unwind block might not terminate, so #terminate can't wait for it forever. Therefore, the implementors of #terminate decided to just close down the process if an unwind block is in progress and not even try to look for it. Perhaps #terminate should check the stack to see whether an unwind block is being executed. If so, it should let the block execute for a little bit and then try again. If the block is still executing, it should pop up a notifier with the message "unwind block still executing. Wait for another 5 seconds? Terminate immediately? (might corrupt image) Debug?" with the three options given. -Ralph Johnson |
Ralph Johnson wrote:
> > Perhaps #terminate should check the stack to see whether > an unwind block is being executed. If so, it should let > the block execute for a little bit and then try again. > If the block is still executing, it should pop up a notifier > with the message "unwind block still executing. Wait for > another 5 seconds? Terminate immediately? (might corrupt > image) Debug?" with the three options given. But I would like to be able to use #terminate in deployed apps, above scheme would make that impossible. I guess we need something like #terminate to wait for unwind block to finish (so we have a 'clean' terminator) and some other selector that exhibits the current 'dirty' behavior (so we can terminate code that happens to be blocking on something in an unwind block). R - |
In reply to this post by Martin McClure
>From: Chris Winemiller <[hidden email]>
>Because the behavior of #terminate does not allow the process to gracefully >terminate its application-specific behavior. Think of a process, for example, >that listens on a SocketAccessor for client connections. If you send >#terminate to the process the SocketAccessor remains open. And if the only >access to the SocketAccessor is solely within the BlockClosure of the process, >you will lose all reference to the SocketAccessor so you can't close it. If #terminate worked correctly then this would not be a problem. It runs the unwind block, so you just have to use #ensure to close the SocketAccessor. The problem is that #terminate does not work correctly if the process is in the middle of an unwind block, which is just a bug. Someone should fix the bug, then #terminate would be safe, like it should be. -Ralph |
In reply to this post by Wolfgang Mayer
>But I would like to be able to use #terminate in deployed apps, above
>scheme would make that impossible. I was thinking of the behavior of choosing "terminate" after getting a notifier using ^Y. You are right that #terminate shouldn't popup a notifier. An exception handler package shouldn't depend on the GUI. Perhaps $terminate should raise an exception if the process is in an unwind block, and then you could try again. Then there should be a #terminateRightAwayAndDoNotCheck for unsafe termination. Closing a debugger or a notifier could have the behavior I mentioned earlier. -Ralph |
In reply to this post by Wolfgang Mayer
It seems to me that this illustrates the need to remove
the global event table and dependents dictionaries. These global objects are a possible source of deadlock and priority inversion. Most model objects that support the GUI contain their own event tables or dependents collection so I don't think much code will be impacted by removing them. Also it seems to me that Object>>become: is overkill for growing most collections. Terry =========================================================== Terry Raymond Smalltalk Professional Debug Package Crafted Smalltalk 80 Lazywood Ln. Tiverton, RI 02878 (401) 624-4517 [hidden email] <http://www.craftedsmalltalk.com> =========================================================== > -----Original Message----- > From: Wolfgang Mayer [mailto:[hidden email]] > Sent: Tuesday, January 31, 2006 7:59 PM > To: VWNC List > Subject: Re: Debugger/Highlighter Freezes Image > > Alan Knight wrote: > > This might be another manifestion of the general problem that if a > process > > is terminated while an unwind block is in the process of running, then > that > > unwind block does not finish running. This is a known issue, but also a > good > > reason to be very careful using #terminate. If that's the problem, it > may be > > because some of the modifications that people made to the > RBCodeHighlighter > > or some other code that's accessing the event table is terminating > > processes. > > I've played around a bit more and I can now reproduce the deadlock in a > fresh > visualnc.im [VW7.3.1, VW7.4]: > > "doit in a workspace" > [Object new myEventTable] repeat. > > If this code is interrupted by pressing Ctrl-Y, the deadlock occurs. (If > not at > the first time, proceed and try again. For me, it always locks at the > first or > second attempt.) I suspect that a similar scenario happens with my > application > (I don't use processes at all). > > > Is there any way to avoid this? While it should be feasible to avoid > #terminate > and cleanup gracefully for "regular" use of processes, I cannot see how > this > can be done safely for User Interrupts while debugging. (Maybe this is > trivial, > my understanding of processes and concurrency in VW is not very deep.) > > Also, is it possible to #signal the locked semaphore from within an > attached > gdb session to revive the image? Apologies if this is in the > documentation, I > couldn't find the relevant section. > > > Regards, > > - Wolfgang > > > > process 0x8dd8b5c > suspendedContext is nil > > process 0x8e5de4c > suspendedContext is nil > > process 0x8ee2cf8 > > context 0xb7a940d0 Semaphore>>wait > context 0x08ef4218 [] in Delay class>>initializeTimingProcess > context 0x08ef420c BlockClosure>>on:do: > context 0x08ef37ec [] in Process class>>forBlock:priority: > > process 0x8f0ed44 > > frame 0xbf81aa0c a(n) Semaphore wait > frame 0xbf81aa28 a(n) EventQueue next > frame 0xbf81aa40 a(n) WindowManager processNextEvent > frame 0xbf81aa58 a(n) BlockClosure [] in WindowManager>>newProcess > context 0x08f1b02c BlockClosure>>on:do: > context 0x08c8de84 [] in WindowManager>>newProcess > context 0x08f1b044 BlockClosure>>on:do: > context 0x08f1b05c [] in Process class>>forBlock:priority: > > process 0x8f36f50 > suspendedContext is nil > > process 0x8f38da4 > suspendedContext is nil > > process 0x8f46250 > suspendedContext is nil > > process 0x8fcca40 > suspendedContext is nil > > process 0x8fccbc0 > suspendedContext is nil > > process 0x8fcccc8 > suspendedContext is nil > > process 0x8fd14d4 > > context 0x08fd625c Semaphore>>wait > context 0x08fdf9a0 [] in CCallback class>>installForeignCallbackProcess > context 0x08fdfcf4 BlockClosure>>on:do: > context 0x08fd1ce4 [] in Process class>>forBlock:priority: > > process 0x8fd1504 > suspendedContext is nil > > process 0x8fd6688 > suspendedContext is nil > > process 0x8fdf508 > suspendedContext is nil > > process 0x90ff254 > > context 0x090ff11c Semaphore>>wait > context 0x0910124c [] in CCallback class>>installCallbackProcess > context 0x091013d8 BlockClosure>>on:do: > context 0x0910142c [] in CCallback class>>installCallbackProcess > context 0x09101744 BlockClosure>>on:do: > context 0x09101aa4 [] in CCallback class>>installCallbackProcess > context 0x09101b94 BlockClosure>>on:do: > context 0x090ff188 [] in Process class>>forBlock:priority: > > process 0x90ff260 > > context 0x090ff0d4 Semaphore>>wait > context 0x091013f0 [] in CCallback class>>installForeignCallbackProcess > context 0x09101444 BlockClosure>>on:do: > context 0x090ff104 [] in Process class>>forBlock:priority: > > process 0x90ff5a8 > > frame 0xbf8197a0 a(n) Semaphore waitIfCurtailedSignal > frame 0xbf8197b8 a(n) Semaphore critical: > frame 0xbf8197d4 a(n) RecursionLock critical: > frame 0xbf8197f8 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbf81980c a(n) OrderedCollection myEventTable > frame 0xbf819834 a(n) OrderedCollection become: > frame 0xbf819858 a(n) OrderedCollection changeCapacityTo: > frame 0xbf81986c a(n) OrderedCollection increaseCapacity > frame 0xbf819894 a(n) OrderedCollection makeRoomAtLast > frame 0xbf8198ac a(n) OrderedCollection addLast: > frame 0xbf8198c8 a(n) BlockClosure [] in EventQueue>>nextPut: > frame 0xbf8198e4 a(n) BlockClosure ensure: > frame 0xbf8198fc a(n) Semaphore critical: > frame 0xbf819918 a(n) BlockClosure [] in EventQueue>>nextPut: > frame 0xbf819934 a(n) BlockClosure ensure: > frame 0xbf81994c a(n) Semaphore critical: > frame 0xbf819964 a(n) Process uninterruptablyDo: > frame 0xbf819978 a(n) BlockClosure valueUninterruptably > frame 0xbf819990 a(n) EventQueue nextPut: > frame 0xbf8199a8 a(n) WindowManager addEvent: > frame 0xbf8199c0 a(n) ApplicationWindow addEvent: > frame 0xbf8199d8 a(n) EventSensor addMetaInput: > frame 0xbf819a00 a(n) EventSensor eventResize: > frame 0xbf819a1c a(n) InputState send:eventResize: > frame 0xbf819a40 a(n) InputState process: > frame 0xbf819a58 a(n) InputState 0x0 no selector > context 0xb7a94a30 [] in InputState class>>install > context 0xb7a910f4 BlockClosure>>on:do: > context 0x090ff0bc [] in Process class>>forBlock:priority: > > process 0x91011f8 > > context 0xb7a8fec4 Semaphore>>wait > context 0x09106250 WeakArray class>>outerFinalizationLoop > context 0x09106268 [] in WeakArray class>>installFinalizationMechanism > context 0x09106f34 BlockClosure>>on:do: > context 0x09107594 [] in Process class>>forBlock:priority: > > process 0x9106688 > > frame 0xbf8159a0 a(n) Semaphore waitIfCurtailedSignal > frame 0xbf8159b8 a(n) Semaphore critical: > frame 0xbf8159d4 a(n) RecursionLock critical: > frame 0xbf8159f8 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbf815a0c a(n) OrderedCollection myEventTable > frame 0xbf815a34 a(n) OrderedCollection become: > frame 0xbf815a58 a(n) OrderedCollection changeCapacityTo: > frame 0xbf81d374 a(n) OrderedCollection increaseCapacity > frame 0xbf81d39c a(n) OrderedCollection makeRoomAtLast > frame 0xbf81d3b4 a(n) OrderedCollection addLast: > frame 0xbf81d3cc a(n) OrderedCollection add: > frame 0xbf81d3f4 a Class (UnixFilename) components: > frame 0xbf81d420 a Class (UnixFilename) canonicalize: > frame 0xbf81d43c a Class (UnixFilename) createInstanceNamed: > frame 0xbf81d454 a Class (Filename) named: > frame 0xbf81d468 a(n) ByteString asFilename > frame 0xbf81d47c a(n) PortableFilename asFilename > frame 0xbf81d490 a(n) FileConnection name > frame 0xbf81d4a4 a(n) ExternalReadStream name > frame 0xbf81d4b8 a(n) EncodedStream name > frame 0xbf81d4d8 a(n) XMLParser wrapDataSource: > frame 0xbf81d4f0 a(n) XMLParser on: > frame 0xbf81d508 a(n) XMLParser parseElement: > frame 0xbf81d538 a(n) BlockClosure [] in > XMLSourceFileFormat>>methodSourceAt:in: > frame 0xbf81d554 a(n) BlockClosure on:do: > frame 0xbf81d574 a(n) XMLSourceFileFormat methodSourceAt:in: > frame 0xbf81d5a4 a(n) BlockClosure [] in > SourceFileManager>>retrieveMethodSourceAt:using:ifAbsent: > frame 0xbf81d5c0 a(n) BlockClosure on:do: > frame 0xbf81d5e4 a(n) SourceFileManager > retrieveMethodSourceAt:using:ifAbsent: > frame 0xbf81d608 a(n) SourceFileManager methodSourceAt:ifAbsent: > frame 0xbf81d61c a(n) CompiledMethod methodSources > frame 0xbf81d634 a(n) CompiledMethod getSource > frame 0xbf81d648 a(n) CompiledBlock getSource > frame 0xbf81d668 a(n) CompiledBlock getSourceForUserIfNone: > frame 0xbf81d680 a(n) BlockClosure [] in BlockClosure>>unboundMethod > frame 0xbf81d69c a(n) BlockClosure on:do: > frame 0xbf81d6b0 <Hybrid Block Context> sourceCode > frame 0xbf81d6d0 <Hybrid Block Context> selector > frame 0xbf81d6ec a(n) DebuggerService context: > frame 0xbf81d704 a(n) DebuggerService selectContext: > frame 0xbf81d71c a(n) DebuggerService selectContextAt: > frame 0xbf81d734 a(n) DebuggerService onHandle: > frame 0xbf81d750 a(n) DebuggerService process:context:interrupted: > frame 0xbf81d778 a Class (DebuggerService) > context:proceedable:interrupted: > frame 0xbf81d7a0 a Class (DebuggerService) openOn:exception:interrupted: > frame 0xbf81d7c0 a Class (DebuggerService) openOnException: > frame 0xbf81d7d8 a Class (DebuggerService) openException: > frame 0xbf81d7f0 a Class (Notifier) openException: > frame 0xbf81d808 a(n) UnhandledException defaultAction > frame 0xbf81d828 a(n) UnhandledException performHandler: > frame 0xbf81d844 a(n) UnhandledException propagatePrivateFrom: > frame 0xbf81d85c a(n) UnhandledException propagateFrom: > frame 0xbf81d870 a(n) UnhandledException propagate > frame 0xbf81d884 a(n) UnhandledException raiseSignal > frame 0xbf81d898 a(n) UserInterrupt noHandler > frame 0xbf81d8ac a(n) UserInterrupt defaultAction > frame 0xbf81d8cc a(n) UserInterrupt performHandler: > frame 0xbf81d8e8 a(n) UserInterrupt propagatePrivateFrom: > frame 0xbf81d900 a(n) UserInterrupt propagateFrom: > frame 0xbf81d914 a(n) UserInterrupt propagate > frame 0xbf81d928 a(n) UserInterrupt raiseSignal > frame 0xbf81d944 a Class (UserInterrupt) interruptWith:errorString: > frame 0xbf81d958 a(n) BlockClosure [] in DebuggerService > class>>interruptActiveUserProcess > frame 0xbf81d978 a(n) BlockClosure [] in Process>>interruptWith: > frame 0xbf81d98c a(n) BlockClosure [] in RecursionLock>>critical: > frame 0xbf81d9a8 a(n) BlockClosure ensure: > frame 0xbf81d9c0 a(n) Semaphore critical: > frame 0xbf81d9dc a(n) RecursionLock critical: > frame 0xbf81da00 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbf81da14 a(n) Object myEventTable > frame 0xbf81da2c a(n) Object actionForEvent: > frame 0xbf81da44 a(n) Object triggerEvent: > frame 0xbf81da58 <nil> 0x0 no selector > context 0xb7a93eb4 UndefinedObject(Object)>>performMethod:arguments: > context 0xb7a93ea8 UndefinedObject(Object)>>performMethod: > context 0xb7a93e9c > TextEditorController(ParagraphEditor)>>evaluateCompiled: > context 0xb7a93e84 [] in ParagraphEditor>>evaluateSelection > context 0xb7a93e6c BlockClosure>>ensure: > context 0xb7a93e60 Cursor>>showWhile: > context 0xb7a93e54 > TextEditorController(ParagraphEditor)>>evaluateSelection > context 0xb7a93e48 [] in ParagraphEditor>>doIt > context 0xb7a94880 BlockClosure>>on:do: > context 0xb7a93e3c TextEditorController(ParagraphEditor)>>doIt > context 0xb7a93e30 TextEditorController>>dispatchMenuSymbol: > context 0xb7a93e24 TextEditorController>>dispatchMenuSelection: > context 0xb7a93e18 > TextEditorController(ControllerWithMenu)>>processMenu:at:centered: > context 0xb7a93e0c > TextEditorController(ControllerWithMenu)>>processMenuAt:centered: > context 0xb7a93e00 > TextEditorController(ControllerWithMenu)>>yellowButtonPressedEvent: > context 0xb7a93df4 > TextEditorController(ParagraphEditor)>>yellowButtonPressedEvent: > context 0xb7a93de8 TextEditorController>>yellowButtonPressedEvent: > context 0xb7a93ddc YellowButtonPressedEvent>>dispatchTo: > context 0xb7a93dd0 TextEditorController(ControllerWithMenu)>>handleEvent: > context 0xb7a93dc4 EventDispatcher>>dispatch:to: > context 0xb7a93db8 EventDispatcher>>dispatchEvent: > context 0xb7a93dac YellowButtonPressedEvent(Event)>>dispatch > context 0xb7a93da0 > YellowButtonPressedEvent(Event)>>dispatchForWindowManager: > context 0xb7a93d94 [] in WindowManager>>safelyDispatchForWindowManager: > context 0xb7a94874 BlockClosure>>on:do: > context 0xb7a93d88 WindowManager>>safelyDispatchForWindowManager: > context 0xb7a93d7c WindowManager>>processNextEvent > context 0xb7a94a54 [] in WindowManager>>newProcess > context 0xb7a94a48 BlockClosure>>on:do: > context 0xb7a909a4 [] in WindowManager>>newProcess > context 0xb7a8f3b4 BlockClosure>>on:do: > context 0xb7a8f3a8 [] in Process class>>forBlock:priority: > > process 0xb7905550 > > frame 0xbf81ea3c a(n) Semaphore wait > frame 0xbf81ea58 a(n) BlockClosure [] in ObjectMemory > class>>installScavengeNotification > context 0xb7a94a00 BlockClosure>>on:do: > context 0xb7908580 [] in Process class>>forBlock:priority: > > process 0xb790555c > > frame 0xbf818a44 a(n) Semaphore wait > frame 0xbf818a58 a Class (ObjectMemory) 0x0 no selector > context 0xb7a94a18 [] in ObjectMemory class>>installIdleLoopProcess > context 0xb7a94754 BlockClosure>>on:do: > context 0xb7908598 [] in Process class>>forBlock:priority: > > process 0xb79085c8 > > frame 0xbf81ba44 a(n) Semaphore wait > frame 0xbf81ba58 a Class (ObjectMemory) 0x0 no selector > context 0x090ff578 [] in ObjectMemory class>>installLowSpaceProcess > context 0x090ff590 BlockClosure>>on:do: > context 0xb79085d4 [] in Process class>>forBlock:priority: > > process 0xb79085ec > > context 0x090ff194 Semaphore>>wait > context 0x09101234 [] in ExternalProcess class>>startReaper > context 0x091013b4 BlockClosure>>on:do: > context 0xb79085f8 [] in Process class>>forBlock:priority: > > process 0xb7a8cb34 > > frame 0xbf81c9a4 a(n) Semaphore wait > frame 0xbf81c9c0 a(n) EventQueue next > frame 0xbf81c9d8 a(n) WindowManager processNextEvent > frame 0xbf81c9f0 a(n) BlockClosure [] in WindowManager>>newProcess > frame 0xbf81ca0c a(n) BlockClosure on:do: > frame 0xbf81ca24 a(n) BlockClosure [] in WindowManager>>newProcess > frame 0xbf81ca40 a(n) BlockClosure on:do: > frame 0xbf81ca58 a(n) BlockClosure [] in Process class>>forBlock:priority: > > process 0xb7a8e4c0 > > frame 0xbf817668 a(n) Semaphore waitIfCurtailedSignal > frame 0xbf817680 a(n) Semaphore critical: > frame 0xbf81769c a(n) RecursionLock critical: > frame 0xbf8176c0 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbf8176d4 a(n) OrderedCollection myEventTable > frame 0xbf8176fc a(n) OrderedCollection become: > frame 0xbf817720 a(n) OrderedCollection changeCapacityTo: > frame 0xbf817734 a(n) OrderedCollection increaseCapacity > frame 0xbf81775c a(n) OrderedCollection makeRoomAtLast > frame 0xbf817774 a(n) OrderedCollection addLast: > frame 0xbf81778c a(n) OrderedCollection add: > frame 0xbf8177c8 a(n) TabControlBarView displayOn: > frame 0xbf8177e0 a(n) BoundedWrapper displayOn: > frame 0xbf817808 a(n) TabControlComposite displayOn: > frame 0xbf817820 a(n) BoundedWrapper displayOn: > frame 0xbf817838 a(n) SpecWrapper displayOn: > frame 0xbf817854 a(n) SpecWrapper displayOn: > frame 0xbf81787c a(n) CompositePart displayOn: > frame 0xbf817894 a(n) BoundedWrapper displayOn: > frame 0xbf8178bc a(n) ReComposingComposite displayOn: > frame 0xbf8178f0 a(n) WindowDisplayPolicy displayDamageList:in: > frame 0xbf817908 a(n) ApplicationWindow displayDamageEvent: > frame 0xbf817920 a(n) ApplicationWindow checkForEvents > frame 0xbf81793c a(n) BlockClosure [] in > WindowManager>>repairDamagesExcept: > frame 0xbf81795c a(n) OrderedCollection do: > frame 0xbf817978 a(n) BlockClosure [] in > WindowManager>>repairDamagesExcept: > frame 0xbf817994 a(n) BlockClosure on:do: > frame 0xbf8179ac a(n) WindowManager repairDamagesExcept: > frame 0xbf8179c0 a(n) WindowManager repairDamages > frame 0xbf8179d8 a(n) WindowManager processNextEvent > frame 0xbf8179f0 a(n) BlockClosure [] in WindowManager>>newProcess > frame 0xbf817a0c a(n) BlockClosure on:do: > frame 0xbf817a24 a(n) BlockClosure [] in WindowManager>>newProcess > frame 0xbf817a40 a(n) BlockClosure on:do: > frame 0xbf817a58 a(n) BlockClosure [] in Process class>>forBlock:priority: > > process 0x8dd8b5c > suspendedContext is nil > > process 0x8e5de4c > suspendedContext is nil > > process 0x8ee2cf8 > > frame 0xbface084 a(n) Semaphore wait > frame 0xbface098 a(n) BlockClosure [] in Delay > class>>initializeTimingProcess > context 0x08ef420c BlockClosure>>on:do: > context 0x08ef37ec [] in Process class>>forBlock:priority: > > process 0x8f0ed44 > > frame 0xbfad504c a(n) Semaphore wait > frame 0xbfad5068 a(n) EventQueue next > frame 0xbfad5080 a(n) WindowManager processNextEvent > frame 0xbfad5098 a(n) BlockClosure [] in WindowManager>>newProcess > context 0x08f1b02c BlockClosure>>on:do: > context 0x08c8de84 [] in WindowManager>>newProcess > context 0x08f1b044 BlockClosure>>on:do: > context 0x08f1b05c [] in Process class>>forBlock:priority: > > process 0x8f36f50 > suspendedContext is nil > > process 0x8f38da4 > suspendedContext is nil > > process 0x8f46250 > suspendedContext is nil > > process 0x8fcca40 > suspendedContext is nil > > process 0x8fccbc0 > suspendedContext is nil > > process 0x8fcccc8 > suspendedContext is nil > > process 0x8fd14d4 > > context 0x08fd625c Semaphore>>wait > context 0x08fdf9a0 [] in CCallback class>>installForeignCallbackProcess > context 0x08fdfcf4 BlockClosure>>on:do: > context 0x08fd1ce4 [] in Process class>>forBlock:priority: > > process 0x8fd1504 > suspendedContext is nil > > process 0x8fd6688 > suspendedContext is nil > > process 0x8fdf508 > suspendedContext is nil > > process 0x916575c > > context 0x091715ac Semaphore>>wait > context 0x081c2bf8 [] in CCallback class>>installCallbackProcess > context 0x081c5f4c BlockClosure>>on:do: > context 0x081c8028 [] in CCallback class>>installCallbackProcess > context 0x081c93e8 BlockClosure>>on:do: > context 0x081c9adc [] in CCallback class>>installCallbackProcess > context 0x081d8efc BlockClosure>>on:do: > context 0x09171540 [] in Process class>>forBlock:priority: > > process 0x91657b0 > > context 0x0916620c Semaphore>>wait > context 0x091992e4 [] in CCallback class>>installForeignCallbackProcess > context 0xb79b6810 BlockClosure>>on:do: > context 0x091715c4 [] in Process class>>forBlock:priority: > > process 0x916bed0 (activeProcess) > > frame 0xbfad0d6c a(n) RecursionLock critical: > frame 0xbfad0d90 a(n) EphemeronDictionary at:ifAbsent: > frame 0xbfad0da4 a(n) Object myEventTable > frame 0xbfad0db8 <nil> 0x0 no selector > frame 0xbfad0dd4 <nil> performMethod:arguments: > frame 0xbfad0dec <nil> performMethod: > frame 0xbfad0e08 a(n) TextEditorController evaluateCompiled: > frame 0xbfad0e24 a(n) BlockClosure [] in > ParagraphEditor>>evaluateSelection > frame 0xbfad0e40 a(n) BlockClosure ensure: > frame 0xbfad0e5c a(n) Cursor showWhile: > frame 0xbfad0e78 a(n) TextEditorController evaluateSelection > frame 0xbfad0e90 a(n) BlockClosure [] in ParagraphEditor>>doIt > frame 0xbfad0eac a(n) BlockClosure on:do: > frame 0xbfad0ec0 a(n) TextEditorController doIt > frame 0xbfad0ed8 a(n) TextEditorController dispatchMenuSymbol: > frame 0xbfad0ef0 a(n) TextEditorController dispatchMenuSelection: > frame 0xbfad0f10 a(n) TextEditorController processMenu:at:centered: > frame 0xbfad0f34 a(n) TextEditorController processMenuAt:centered: > frame 0xbfad0f4c a(n) TextEditorController yellowButtonPressedEvent: > frame 0xbfad0f64 a(n) TextEditorController yellowButtonPressedEvent: > frame 0xbfad0f7c a(n) TextEditorController yellowButtonPressedEvent: > frame 0xbfad0f94 a(n) YellowButtonPressedEvent dispatchTo: > frame 0xbfad0fac a(n) TextEditorController handleEvent: > frame 0xbfad0fcc a(n) EventDispatcher dispatch:to: > frame 0xbfad0fec a(n) EventDispatcher dispatchEvent: > frame 0xbfad1000 a(n) YellowButtonPressedEvent dispatch > frame 0xbfad1018 a(n) YellowButtonPressedEvent dispatchForWindowManager: > frame 0xbfad1034 a(n) BlockClosure [] in > WindowManager>>safelyDispatchForWindowManager: > frame 0xbfad1050 a(n) BlockClosure on:do: > frame 0xbfad1068 a(n) WindowManager safelyDispatchForWindowManager: > frame 0xbfad1080 a(n) WindowManager processNextEvent > frame 0xbfad1098 a(n) BlockClosure [] in WindowManager>>newProcess > context 0xb79b28ec BlockClosure>>on:do: > context 0xb79b2910 [] in WindowManager>>newProcess > context 0xb79b2934 BlockClosure>>on:do: > context 0xb79b2958 [] in Process class>>forBlock:priority: > > process 0xb79b29d0 > > frame 0xbfad2084 a(n) Semaphore wait > frame 0xbfad2098 a Class (ObjectMemory) 0x0 no selector > context 0xb7b4aae4 [] in ObjectMemory class>>installIdleLoopProcess > context 0xb7b4a9ac BlockClosure>>on:do: > context 0xb79b67ec [] in Process class>>forBlock:priority: > > process 0xb79b2b98 > > frame 0xbfad407c a(n) Semaphore wait > frame 0xbfad4098 a(n) BlockClosure [] in ObjectMemory > class>>installScavengeNotification > context 0xb79bb6a0 BlockClosure>>on:do: > context 0xb79b67bc [] in Process class>>forBlock:priority: > > process 0xb79b2ba4 > > context 0x091714e0 Semaphore>>wait > context 0x081c221c [] in ExternalProcess class>>startReaper > context 0x081c535c BlockClosure>>on:do: > context 0xb79b67a4 [] in Process class>>forBlock:priority: > > process 0xb79b6750 > > frame 0xbfad3084 a(n) Semaphore wait > frame 0xbfad3098 a Class (ObjectMemory) 0x0 no selector > context 0xb79e5a24 [] in ObjectMemory class>>installLowSpaceProcess > context 0x09165a8c BlockClosure>>on:do: > context 0xb79b675c [] in Process class>>forBlock:priority: > > process 0xb79e47d0 > > frame 0xbfacd080 a(n) Semaphore wait > frame 0xbfacd098 a(n) InputState 0x0 no selector > context 0xb7b4ab08 [] in InputState class>>install > context 0xb7b4a928 BlockClosure>>on:do: > context 0xb79e4794 [] in Process class>>forBlock:priority: |
Free forum by Nabble | Edit this page |