[squeak-dev] The Trunk: Morphic-cmm.1333.mcz
Eliot Miranda
eliot.miranda at gmail.com
Tue Apr 11 18:26:04 UTC 2017
Hi Chris,
this won't work as written. Suspending the active process within a
critical: block prevents the critical: block from completing and releasing
the lock. So with the changes as written another debugger won't open when
one is already open.
One should never do this:
aMutexOrSemaphore critical:
[self doStuff.
Processor activeProcess suspend]
I'm revising these cases to pull the suspend out of the critical block.
On Tue, Apr 4, 2017 at 1:52 PM, <commits at source.squeak.org> wrote:
> Chris Muller uploaded a new version of Morphic to project The Trunk:
> http://source.squeak.org/trunk/Morphic-cmm.1333.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-cmm.1333
> Author: cmm
> Time: 4 April 2017, 3:52:04.9926 pm
> UUID: 64767f0b-c6c4-4c32-97a9-d122c30222d5
> Ancestors: Morphic-eem.1332
>
> Fix the race condition introduced with Debugger>>'ErrorRecursion' which
> resulted in the Emergency Evaluator being opened too eagerly (and unable to
> be closed!) -- even when there was no recursion.
>
> =============== Diff against Morphic-eem.1332 ===============
>
> Item was changed:
> ----- Method: Debugger class>>morphicOpenContext:label:contents: (in
> category '*Morphic-opening') -----
> + morphicOpenContext: aContext label: aString contents: contentsStringOrNil
> - morphicOpenContext: aContext label: aString contents: contentsStringOrNil
> "Open a notifier in response to an error, halt, or notify. A
> notifier view just shows a short view of the sender stack and provides a
> menu that lets the user open a full debugger."
> + "Simulation guard"
> + <primitive: 19>
> + ErrorRecursionGuard critical:
> + [ ErrorRecursion not & Preferences logDebuggerStackToFile
> ifTrue:
> + [ Smalltalk
> + logSqueakError: aString
> + inContext: aContext ].
> + ErrorRecursion ifTrue:
> + [ ErrorRecursion := false.
> + self primitiveError: aString ].
> + ErrorRecursion := true.
> + self
> + informExistingDebugger: aContext
> + label: aString.
> + (Debugger morphicContext: aContext)
> + openNotifierContents: contentsStringOrNil
> + label: aString.
> - <primitive: 19> "Simulation guard"
> - ErrorRecursion not & Preferences logDebuggerStackToFile ifTrue:
> - [Smalltalk logSqueakError: aString inContext: aContext].
> - ErrorRecursion ifTrue:[
> ErrorRecursion := false.
> + Processor activeProcess suspend ]!
> - self primitiveError: aString].
> - ErrorRecursion := true.
> - self informExistingDebugger: aContext label: aString.
> - (Debugger morphicContext: aContext)
> - openNotifierContents: contentsStringOrNil
> - label: aString.
> - ErrorRecursion := false.
> - Processor activeProcess suspend.!
>
> Item was changed:
> ----- Method: Debugger class>>morphicOpenOn:context:label:contents:fullView:
> (in category '*Morphic-opening') -----
> + morphicOpenOn: process context: context label: title contents:
> contentsStringOrNil fullView: full
> - morphicOpenOn: process context: context label: title contents:
> contentsStringOrNil fullView: full
> "Open a notifier in response to an error, halt, or notify. A
> notifier view just shows a short view of the sender stack and provides a
> menu that lets the user open a full debugger."
> + ErrorRecursionGuard critical:
> + [ | errorWasInUIProcess debugger |
> + ErrorRecursion ifTrue:
> + [ "self assert: process == Project current
> uiProcess -- DOCUMENTATION ONLY"
> + ErrorRecursion := false.
> + ^ Project current handleFatalDrawingError: title ].
> + [ ErrorRecursion not & Preferences logDebuggerStackToFile
> ifTrue:
> + [ Smalltalk
> + logSqueakError: title
> + inContext: context ] ]
> + on: Error
> + do: [ : ex | ex return: nil ].
> + ErrorRecursion := true.
> + errorWasInUIProcess := Project current
> spawnNewProcessIfThisIsUI: process.
> + "Schedule debugging in deferred UI message because
> -
> - | errorWasInUIProcess debugger |
> - ErrorRecursion ifTrue: [
> - "self assert: process == Project current uiProcess --
> DOCUMENTATION ONLY"
> - ErrorRecursion := false.
> - ^ Project current handleFatalDrawingError: title].
> -
> - [ErrorRecursion not & Preferences logDebuggerStackToFile
> - ifTrue: [Smalltalk logSqueakError: title inContext:
> context]] on: Error do: [:ex | ex return: nil].
> -
> - ErrorRecursion := true.
> -
> - errorWasInUIProcess := Project current spawnNewProcessIfThisIsUI:
> process.
> -
> - "Schedule debugging in deferred UI message because
> 1) If process is the current UI process, it is already
> broken.
> 2) If process is some other process, it must not execute
> UI code"
> + Project current addDeferredUIMessage:
> + [ debugger := self new
> + process: process
> + controller: nil
> + context: context.
> + full
> + ifTrue: [ debugger openFullNoSuspendLabel:
> title ]
> + ifFalse:
> + [ debugger
> + openNotifierContents:
> contentsStringOrNil
> + label: title ].
> + debugger errorWasInUIProcess: errorWasInUIProcess.
> + "Try drawing the debugger tool at least once to
> avoid freeze."
> + Project current world displayWorldSafely.
> + ErrorRecursion := false ].
> + process suspend ]!
> - Project current addDeferredUIMessage: [
> - debugger := self new process: process controller: nil
> context: context.
> - full
> - ifTrue: [debugger openFullNoSuspendLabel: title]
> - ifFalse: [debugger openNotifierContents:
> contentsStringOrNil label: title].
> - debugger errorWasInUIProcess: errorWasInUIProcess.
> -
> - "Try drawing the debugger tool at least once to avoid
> freeze."
> - Project current world displayWorldSafely.
> -
> - ErrorRecursion := false.
> - ].
> - process suspend.
> - !
>
>
>
--
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170411/162803c0/attachment.html>
More information about the Squeak-dev
mailing list
|