WeakValueIdentityDictionary.st
author Stefan Vogel <sv@exept.de>
Mon, 22 Jun 2015 11:24:02 +0200
changeset 18494 41f8a86105f0
parent 9242 19e873fe5e21
child 17711 39faaaf888b4
child 19086 7d8bd3e1d3ae
permissions -rw-r--r--
class: UnixOperatingSystem changed: #syncFileSystem: disable - defined only in glibc 2.14, but we need to support glibc 2.12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1999 by eXept Software AG
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
6233
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
    13
"{ Package: 'stx:libbasic' }"
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
    14
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
IdentityDictionary subclass:#WeakValueIdentityDictionary
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	instanceVariableNames:''
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	classVariableNames:''
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	poolDictionaries:''
4350
5aa2a3b9fd5b category change
Claus Gittinger <cg@exept.de>
parents: 4347
diff changeset
    19
	category:'Collections-Weak'
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
!WeakValueIdentityDictionary class methodsFor:'documentation'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
copyright
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
 COPYRIGHT (c) 1999 by eXept Software AG
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
              All Rights Reserved
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 This software is furnished under a license and may be used
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 only in accordance with the terms of that license and with the
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 inclusion of the above copyright notice.   This software may not
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 be provided or otherwise made available to, or used by, any
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 other person.  No title to or ownership of the software is
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 hereby transferred.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
documentation
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    WeakValueIdentityDictionaries behave like IdentityDictionaries, 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    as long as the values are still referenced by some 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    other (non-weak) object.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    However, once the last non-weak reference ceases to exist,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    the Dictionary will return nil for the value at position key.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    (with some delay: it will be removed after the next garbage collect).
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    [Warning:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
      If you use this, be very careful since the collections size changes
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
      'magically' - for example, testing for being nonEmpty and then
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
      removing the first element may fail, since the element may vanish inbetween.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
      In general, never trust the value as returned by the size/isEmpty messages.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    [author:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        Claus (stolen from Stefans WeakValueDictionary)
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    [See also:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        WeakArray WeakIdentityDictionary WeakIdentitySet WeakValueDictionary
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
!WeakValueIdentityDictionary methodsFor:'adding & removing'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
at:key put:anObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    "add the argument anObject under key, aKey to the receiver.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
     Return anObject (sigh).
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
     Redefined to block interrupts, to avoid trouble when dependencies
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
     are added within interrupting high prio processes."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    (OperatingSystem blockInterrupts) ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
	"/ already blocked
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
	^ super at:key put:anObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    [
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
	ret := super at:key put:anObject.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    ] valueNowOrOnUnwindDo:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
	OperatingSystem unblockInterrupts
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    ^ ret
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    "Modified: 20.10.1996 / 14:05:04 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
removeKey:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    "remove the association under aKey from the collection,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
     return the value previously stored there.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
     If it was not in the collection return the result 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
     from evaluating aBlock.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    Redefined to avoid synchronization problems, in case
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    of interrupts (otherwise, there could be some other operation 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    on the receiver done by another process, which garbles my contents)."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    (OperatingSystem blockInterrupts) ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
	"/ already blocked
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
	^ super removeKey:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    [
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
	ret := super removeKey:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    ] valueNowOrOnUnwindDo:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
	OperatingSystem unblockInterrupts
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    ^ ret
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    "Modified: 6.5.1996 / 12:44:07 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
removeValue:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    "remove the association under aValue from the collection,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
     return the key previously stored there.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
     If it was not in the collection return the result 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
     from evaluating aBlock.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    Redefined to avoid synchronization problems, in case
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    of interrupts (otherwise, there could be some other operation 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    on the receiver done by another process, which garbles my contents)."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    (OperatingSystem blockInterrupts) ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
	"/ already blocked
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
	^ super removeValue:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    [
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
	ret := super removeValue:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    ] valueNowOrOnUnwindDo:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
	OperatingSystem unblockInterrupts
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ^ ret.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "Modified: 8.5.1996 / 14:54:09 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!WeakValueIdentityDictionary methodsFor:'element disposal'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
update:something with:aParameter from:changedObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    "an element (either key or value) died - clear out slots for
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
     disposed keys."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    |wasBlocked|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    something == #ElementExpired ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
        "
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
         have to block here - dispose may be done at a low priority
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
         from the background finalizer. If new items are added by a 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
         higher prio process, the dictionary might get corrupted otherwise
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
        "
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
        wasBlocked := OperatingSystem blockInterrupts.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
        keyArray 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
            forAllDeadIndicesDo:[:idx | 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
                                    valueArray basicAt:idx put:nil.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
                                    tally := tally - 1.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
                                ]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
            replacingCorpsesWith:DeletedEntry.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    ]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    "Created: 7.1.1997 / 16:59:30 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
!WeakValueIdentityDictionary methodsFor:'private'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
6233
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
   180
slotIsEmpty:probe
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
   181
    ^ probe isNil or:[probe == 0 "collected"]
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
   182
!
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
   183
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
valueContainerOfSize:n
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    "return a container for values of size n.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
     use WeakArrays here."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    |a|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    a := WeakArray new:n.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    a addDependent:self.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    ^ a
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
!WeakValueIdentityDictionary methodsFor:'testing'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
includes:anObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    "redefined to block interrupts 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
     (avoid change of the dictionary while accessing)"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    |val|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    (OperatingSystem blockInterrupts) ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
	"/ already blocked
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
	^ super includes:anObject.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    [
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
	val := super includes:anObject.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
    ] valueNowOrOnUnwindDo:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
	OperatingSystem unblockInterrupts.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ^ val
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    "Modified: 1.7.1997 / 10:45:52 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    "Created: 1.7.1997 / 15:41:14 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
includesKey:key
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    "redefined to block interrupts 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
     (avoid change of the dictionary while accessing)"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    |val|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    (OperatingSystem blockInterrupts) ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
	"/ already blocked
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
	^ super includesKey:key.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    [
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
	val := super includesKey:key.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    ] valueNowOrOnUnwindDo:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
	OperatingSystem unblockInterrupts.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    ^ val
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    "Modified: 1.7.1997 / 10:45:52 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    "Created: 1.7.1997 / 15:41:32 / cg"
9242
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   243
!
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   244
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   245
isWeakCollection
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   246
    "return true, if the receiver has weak references to its elements."
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   247
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   248
    ^ true
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
!WeakValueIdentityDictionary class methodsFor:'documentation'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
version
9242
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   254
    ^ '$Header: /cvs/stx/stx/libbasic/WeakValueIdentityDictionary.st,v 1.4 2006-03-06 10:04:38 cg Exp $'
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
! !