diff -r 213d590bcf54 -r 11e4a5ca80a5 SemaphoreMonitor.st --- a/SemaphoreMonitor.st Mon Jan 16 19:58:08 2017 +0000 +++ b/SemaphoreMonitor.st Tue Jan 17 11:18:31 2017 +0000 @@ -71,7 +71,7 @@ !SemaphoreMonitor methodsFor:'drawing'! titleLine - ^ ' Id Name Count Owner Waiting Process(es) '. + ^ 'Id Name Count Owner Waiting Process(es)'. " SemaphoreMonitor open @@ -86,21 +86,18 @@ |newList| shown ifTrue:[ - newList := Semaphore allSubInstances. + newList := Semaphore allSubInstances. - "sort by hashKey - will not always generate unique numbers, - but most of the time, this works ... for now" - - newList sort:[:s1 :s2 | s1 identityHash < s2 identityHash]. + "sort by hashKey - will not always generate unique numbers, + but most of the time, this works ... for now" - newList ~= semaphores ifTrue:[ - self updateStatus:newList - ]. + newList sort:[:s1 :s2 | s1 identityHash < s2 identityHash]. + + newList ~= semaphores ifTrue:[ + self updateStatus:newList + ]. ]. - updateBlock notNil ifTrue:[ - Processor removeTimedBlock:listUpdateBlock. - Processor addTimedBlock:listUpdateBlock afterSeconds:listUpdateDelay - ]. + self installDelayedUpdate. "Modified: / 3.7.1996 / 13:37:29 / stefan" "Created: / 23.1.1997 / 02:44:48 / cg" @@ -165,10 +162,12 @@ id := aSemaphore identityHash bitShift:-12. owner := aSemaphore lastOwnerId. owner isNil ifTrue:[ - owner := ' ' + owner := '' ] ifFalse:[ - owner := owner printStringLeftPaddedTo:5 + owner := owner printString ]. + owner := owner leftPaddedTo:6. + line := (id printStringPaddedTo:6) , ' ' , ((nm contractTo:25) paddedTo:25) @@ -223,10 +222,7 @@ ]. listView flush ]. - updateBlock notNil ifTrue:[ - Processor removeTimedBlock:updateBlock. - Processor addTimedBlock:updateBlock afterSeconds:updateDelay - ] + self installDelayedUpdate. "Modified: / 3.7.1996 / 13:56:01 / stefan" "Created: / 14.12.1999 / 20:52:29 / cg" @@ -235,13 +231,25 @@ !SemaphoreMonitor methodsFor:'menu'! -debugWaiters - "open a debugger on the selected semaphores waiting processes" +debugLastOwningProcess + "open a debugger on the selected semaphores' (last) owning processes" self selectedSemaphoresDo:[:aSema | - aSema waitingProcesses do:[:aProcess | - DebugView openOn:aProcess - ] + |p| + + (p := aSema lastOwner) notNil ifTrue:[ + DebugView openOn:p + ] + ] +! + +debugWaiters + "open a debugger on the selected semaphores' waiting processes" + + self selectedSemaphoresDo:[:aSema | + aSema waitingProcesses do:[:aProcess | + DebugView openOn:aProcess + ] ] "Modified: / 23.1.1997 / 03:12:06 / cg" @@ -249,7 +257,7 @@ ! inspectSemaphore - "open an inspector on the selected semaphores" + "open an inspector on the selected semaphore(s)" self selectedSemaphoresDo:[:aSema | aSema inspect] @@ -258,12 +266,12 @@ ! inspectWaiters - "open an inspector on the selected semaphores waiting processes" + "open an inspector on the selected semaphores' waiting processes" self selectedSemaphoresDo:[:aSema | - aSema waitingProcesses do:[:aProcess | - aProcess inspect - ] + aSema waitingProcesses do:[:aProcess | + aProcess inspect + ] ] "Modified: / 23.1.1997 / 03:12:06 / cg" @@ -271,27 +279,12 @@ ! selectedSemaphoresDo:aBlock - "evaluate aBlock on all selected semaphores" - - |p nr sel| - - sel := listView selection. - sel isNil ifTrue:[^ self]. + "evaluate aBlock on all selected semaphore(s)" - (sel isKindOf:Collection) ifTrue:[ - sel do:[:n | - nr := n - self numberOfHeadlines. - nr notNil ifTrue:[ - nr > 0 ifTrue:[ - p := semaphores at:nr. - (p notNil and:[p ~~ 0]) ifTrue:[ - aBlock value:p - ] - ] - ] - ] - ] ifFalse:[ - nr := sel - self numberOfHeadlines. + self selectionIndicesDo:[:n | + |nr p| + + nr := n - self numberOfHeadlines. nr notNil ifTrue:[ nr > 0 ifTrue:[ p := semaphores at:nr. @@ -301,8 +294,6 @@ ] ] ]. - - "Created: 23.1.1997 / 03:11:24 / cg" ! signalSemaphore @@ -321,34 +312,39 @@ |labels selectors m| labels := resources array:#( - 'Inspect' - 'Inspect Waiters' - 'Debug Waiters' - '-' - 'Signal' - ). + 'Inspect' + 'Inspect Waiters' + 'Debug Waiters' + 'Debug Last Owning Process' + '-' + 'Signal' + ). selectors := #( - inspectSemaphore - inspectWaiters - debugWaiters - nil - signalSemaphore - ). + inspectSemaphore + inspectWaiters + debugWaiters + debugLastOwningProcess + nil + signalSemaphore + ). updateProcess isNil ifTrue:[ - labels := (resources array:#('Update' '-')) , labels. - selectors := #(updateView nil) , selectors + labels := (resources array:#('Update' '-')) , labels. + selectors := #(updateView nil) , selectors ]. m := PopUpMenu labels:labels - selectors:selectors. + selectors:selectors. listView hasSelection ifFalse:[ - m disableAll:#( - inspectSemaphore - signalSemaphore - ) + m disableAll:#( + inspectSemaphore + inspectWaiters + debugWaiters + debugLastOwningProcess + signalSemaphore + ) ]. ^ m