"
COPYRIGHT (c) 1997 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
SystemStatusMonitor subclass:#SemaphoreMonitor
instanceVariableNames:'semaphores'
classVariableNames:''
poolDictionaries:''
category:'Interface-Tools'
!
!SemaphoreMonitor class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1997 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
!
documentation
"
This view shows smalltalks semaphores - a debugging tool.
[see also:]
Semaphore SemaphoreSet
Process ProcessorScheduler
WindowGroup
ProcessMonitor
[author:]
Claus Gittinger
[start with:]
SemaphoreMonitor open
"
! !
!SemaphoreMonitor class methodsFor:'defaults'!
defaultLabel
^ 'Semaphore Monitor'
"Created: 23.1.1997 / 02:52:53 / cg"
! !
!SemaphoreMonitor methodsFor:'drawing'!
titleLine
^ ' id name count waiting process(es) '.
"
SemaphoreMonitor open
"
"Modified: 23.1.1997 / 04:07:54 / cg"
!
updateList
"update list of semaphores"
|newList|
shown ifTrue:[
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].
newList ~= semaphores ifTrue:[
semaphores := WeakArray withAll:newList.
self updateStatus
].
].
updateBlock notNil ifTrue:[
Processor removeTimedBlock:listUpdateBlock.
Processor addTimedBlock:listUpdateBlock afterSeconds:listUpdateDelay
].
"Modified: 3.7.1996 / 13:37:29 / stefan"
"Created: 23.1.1997 / 02:44:48 / cg"
"Modified: 23.1.1997 / 04:10:22 / cg"
!
updateStatus
"update status display of semaphores"
|oldList list |
shown ifTrue:[
oldList := listView list.
semaphores notNil ifTrue:[
list := OrderedCollection new:(semaphores size + 2).
list add:self titleLine.
list add:(String new:self titleLine size withAll:$-).
semaphores validElementsDo:[:aSemaphore |
|waiters waitersNames nm id str|
waiters := aSemaphore waitingProcesses.
str := '' writeStream.
str writeLimit:80.
waiters notNil ifTrue:[
waiters do:[:aProcess |
str nextPut:$[.
str nextPutAll:aProcess name.
str nextPut:$].
str space.
].
].
waitersNames := str contents.
(aSemaphore respondsTo:#name) ifTrue:[
nm := aSemaphore name.
] ifFalse:[
nm := ''
].
id := aSemaphore identityHash bitShift:-12.
list add:(
(id printStringPaddedTo:6)
, ' '
, ((nm contractTo:10) paddedTo:10)
, ' '
, (aSemaphore count printString paddedTo:3)
, ' '
, (waiters size printStringPaddedTo:3)
, ' '
, waitersNames).
].
].
"avoid flicker"
(oldList notNil and:[oldList size == list size]) ifTrue:[
list keysAndValuesDo:[:idx :entry |
(oldList at:idx) ~= entry ifTrue:[
listView at:idx put:entry
]
]
] ifFalse:[
listView setList:list.
"the first two entries cannot be selected"
listView attributeAt:1 put:#disabled.
listView attributeAt:2 put:#disabled.
].
listView flush
].
updateBlock notNil ifTrue:[
Processor removeTimedBlock:updateBlock.
Processor addTimedBlock:updateBlock afterSeconds:updateDelay
]
"Modified: 3.7.1996 / 13:56:01 / stefan"
"Modified: 23.1.1997 / 04:02:25 / cg"
! !
!SemaphoreMonitor methodsFor:'menu'!
inspectSelection
"open an inspector on the selected semaphores"
self selectedSemaphoresDo:[:aSema | aSema inspect]
"Created: 23.1.1997 / 03:11:46 / cg"
"Modified: 23.1.1997 / 03:12:06 / cg"
!
selectedSemaphoresDo:aBlock
"evaluate aBlock on all selected semaphores"
|p nr sel|
sel := listView selection.
sel isNil ifTrue:[^ self].
(sel isKindOf:Collection) ifTrue:[
sel do:[:n |
nr := n - 2. "for headlines"
nr notNil ifTrue:[
nr > 0 ifTrue:[
p := semaphores at:nr.
(p notNil and:[p ~~ 0]) ifTrue:[
aBlock value:p
]
]
]
]
] ifFalse:[
nr := sel - 2. "for headlines"
nr notNil ifTrue:[
nr > 0 ifTrue:[
p := semaphores at:nr.
(p notNil and:[p ~~ 0]) ifTrue:[
aBlock value:p
]
]
]
].
"Created: 23.1.1997 / 03:11:24 / cg"
!
signalSemaphore
"signal all selected semaphores"
self selectedSemaphoresDo:[:aSema | aSema signal]
"Created: 23.1.1997 / 03:12:30 / cg"
!
statusMenu
"return a popUpMenu"
|labels selectors m sel|
labels := resources array:#(
'inspect'
'-'
'signal'
).
selectors := #(
inspectSemaphore
nil
signalSemaphore
).
updateProcess isNil ifTrue:[
labels := (resources array:#('update' '-')) , labels.
selectors := #(updateView nil) , selectors
].
m := PopUpMenu labels:labels
selectors:selectors.
listView hasSelection ifFalse:[
m disableAll:#(
inspectSemaphore
signalSemaphore
)
].
^ m
"Modified: 23.1.1997 / 03:08:19 / cg"
! !
!SemaphoreMonitor methodsFor:'queries'!
preferredExtent
"return my preferred extent"
^ (font widthOf:self titleLine) + 40 @ 250
"Modified: 23.1.1997 / 02:35:01 / cg"
"Created: 23.1.1997 / 03:04:58 / cg"
! !
!SemaphoreMonitor methodsFor:'user actions'!
doubleClicked
"open an inspector on the selected semaphore"
self inspectSelection
"Created: 23.1.1997 / 03:22:04 / cg"
! !
!SemaphoreMonitor class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libtool/SemaphoreMonitor.st,v 1.3 1997-01-23 03:10:54 cg Exp $'
! !