SemaphoreMonitor.st
branchjv
changeset 17277 11e4a5ca80a5
parent 17215 4a42de8e888a
parent 17226 66b523a67429
--- 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