"
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.
"
WeakIdentityDictionary subclass:#WeakDependencyDictionary
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
category:'Collections-Unordered'
!
!WeakDependencyDictionary 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
"
A specialized WeakIdentityDictionary, which 'knowns' how
to get rid of obsolete entries. This is only used with the
dependency mechanism.
[author:]
Claus Gittinger
[See also:]
WeakArray WeakIdentityDictionary WeakValueDictionary WeakIdentitySet
"
! !
!WeakDependencyDictionary methodsFor:'special dependency support'!
removeEmptyDependencyValues
"special entry for dependency management:
remove any empty (due to finalization) value WeakArray elements."
|index t wasBlocked val|
"/ careful: this is sent by the finalizer at low prio.
"/ be prepared for the receiver to change while we walk over
"/ the value array here ...
index := 1.
[index <= keyArray size] whileTrue:[
"/ get the size again - it could have changed
wasBlocked := OperatingSystem blockInterrupts.
index <= keyArray size ifTrue:[
val := valueArray basicAt:index.
val notNil ifTrue:[
"/ is it an empty WeakArray ?
(val isMemberOf:WeakArray) ifTrue:[
t := val findFirst:[:el | el notNil and:[el ~~ 0]].
t == 0 ifTrue:[
"/ yes - nil it
valueArray basicAt:index put:nil.
(keyArray basicAt:index) notNil ifTrue:[
keyArray basicAt:index put:DeletedEntry.
tally := tally - 1.
]
]
] ifFalse:[
"/ is it an empty WeakIdSet ?
(val isMemberOf:WeakIdentitySet) ifTrue:[
(t := val size) == 0 ifTrue:[
"/ yes - nil it
valueArray basicAt:index put:nil.
(keyArray basicAt:index) notNil ifTrue:[
keyArray basicAt:index put:DeletedEntry.
tally := tally - 1.
]
] ifFalse:[
t == 1 ifTrue:[
"/ the set lost an object, and shrunk to size 1
"/ can now use a WeakArray
valueArray basicAt:index put:(WeakArray with:val first)
]
]
]
]
]
].
wasBlocked ifTrue:[OperatingSystem unblockInterrupts].
index := index + 1.
].
"
Dependencies removeEmptyDependencyValues
"
"Modified: 8.1.1997 / 23:57:56 / cg"
"Created: 9.1.1997 / 00:00:28 / cg"
! !
!WeakDependencyDictionary class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libbasic/WeakDependencyDictionary.st,v 1.2 1997-01-09 00:31:33 cg Exp $'
! !