WeakIdentityDictionary.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18630 a74d669db937
child 19226 470475a1734e
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
     1
"{ Encoding: utf8 }"
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
     2
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
     3
"
62211a9bc04d Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1992 by Claus Gittinger
358
claus
parents: 159
diff changeset
     5
	      All Rights Reserved
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
     6
62211a9bc04d Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
62211a9bc04d Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
62211a9bc04d Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
62211a9bc04d Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
62211a9bc04d Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
62211a9bc04d Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
62211a9bc04d Initial revision
claus
parents:
diff changeset
    13
"
6233
0a79cbd07543 *** empty log message ***
martin
parents: 4530
diff changeset
    14
"{ Package: 'stx:libbasic' }"
0a79cbd07543 *** empty log message ***
martin
parents: 4530
diff changeset
    15
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
    16
"{ NameSpace: Smalltalk }"
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
    17
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
    18
IdentityDictionary subclass:#WeakIdentityDictionary
1054
62ce964f1d2e commentary
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
    19
	instanceVariableNames:''
62ce964f1d2e commentary
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
    20
	classVariableNames:''
62ce964f1d2e commentary
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
    21
	poolDictionaries:''
4350
5aa2a3b9fd5b category change
Claus Gittinger <cg@exept.de>
parents: 2988
diff changeset
    22
	category:'Collections-Weak'
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
    23
!
62211a9bc04d Initial revision
claus
parents:
diff changeset
    24
10
claus
parents: 6
diff changeset
    25
!WeakIdentityDictionary class methodsFor:'documentation'!
claus
parents: 6
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    27
copyright
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    28
"
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    29
 COPYRIGHT (c) 1992 by Claus Gittinger
358
claus
parents: 159
diff changeset
    30
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    31
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    32
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    33
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    35
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    36
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    37
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    38
"
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    39
!
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    40
10
claus
parents: 6
diff changeset
    41
documentation
claus
parents: 6
diff changeset
    42
"
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    43
    WeakIdentityDictionaries behave like IdentityDictionaries,
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    44
    as long as the keys are still referenced by some
1263
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    45
    other (non-weak) object.
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    46
    However, once the last non-weak reference ceases to exist,
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    47
    the object will be automatically removed from the Weakcollection
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    48
    (with some delay: it will be removed after the next garbage collect).
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    49
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    50
    This class was added to support keeping track of dependents without
88
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    51
    keeping the values alive - values simply become nil when no one else
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    52
    references it. The original dependency mechanism used a regular Dictionary,
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    53
    which usually leads to a lot of garbage being kept due to a forgotten
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    54
    release. Using a WeakDictionary may be incompatible to ST-80 but is much
81dacba7a63a *** empty log message ***
claus
parents: 63
diff changeset
    55
    more comfortable, since no manual release of dependents is needed.
1263
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    56
2306
3851fc553893 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2303
diff changeset
    57
    [Warning:]
3851fc553893 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2303
diff changeset
    58
      If you use this, be very careful since the collections size changes
3851fc553893 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2303
diff changeset
    59
      'magically' - for example, testing for being nonEmpty and then
3851fc553893 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2303
diff changeset
    60
      removing the first element may fail, since the element may vanish inbetween.
3851fc553893 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2303
diff changeset
    61
      In general, never trust the value as returned by the size/isEmpty messages.
2260
Claus Gittinger <cg@exept.de>
parents: 2091
diff changeset
    62
Claus Gittinger <cg@exept.de>
parents: 2091
diff changeset
    63
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
    64
    [author:]
2910
1a3e44b10f9b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2741
diff changeset
    65
	Claus Gittinger
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
    66
1263
92c1db6b0776 commentary
Claus Gittinger <cg@exept.de>
parents: 1256
diff changeset
    67
    [See also:]
2910
1a3e44b10f9b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2741
diff changeset
    68
	WeakArray WeakValueDictionary WeakIdentitySet
10
claus
parents: 6
diff changeset
    69
"
claus
parents: 6
diff changeset
    70
! !
claus
parents: 6
diff changeset
    71
359
claus
parents: 358
diff changeset
    72
!WeakIdentityDictionary methodsFor:'adding & removing'!
claus
parents: 358
diff changeset
    73
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    74
at:key ifAbsent:exceptionBlock
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    75
    "redefined to block interrupts
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
    76
     (avoid change of the dictionary while accessing)"
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    77
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
    78
    |val|
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    79
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
    80
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    81
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    82
	^ super at:key ifAbsent:exceptionBlock.
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
    83
    ].
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
    84
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    85
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    86
	val := super at:key ifAbsent:exceptionBlock.
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
    87
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
    88
	OperatingSystem unblockInterrupts.
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    89
    ].
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    90
    ^ val
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    91
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    92
    "Modified: 6.5.1996 / 12:22:26 / stefan"
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
    93
    "Modified: 1.7.1997 / 10:45:47 / cg"
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    94
!
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
    95
1256
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
    96
at:key put:anObject
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
    97
    "add the argument anObject under key, aKey to the receiver.
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
    98
     Return anObject (sigh).
1343
b0ee705c63e0 Correct return value when removing elements.
Stefan Vogel <sv@exept.de>
parents: 1290
diff changeset
    99
     Redefined to block interrupts, to avoid trouble when dependencies
1256
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   100
     are added within interrupting high prio processes."
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   101
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   102
    |val|
359
claus
parents: 358
diff changeset
   103
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   104
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   105
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   106
	^ super at:key put:anObject.
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   107
    ].
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   108
1790
4187e9fc7357 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1780
diff changeset
   109
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   110
	val := super at:key put:anObject.
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   111
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   112
	OperatingSystem unblockInterrupts.
1790
4187e9fc7357 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1780
diff changeset
   113
    ].
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   114
    ^ val
1223
09d16bc18493 at:put: returns its arg
Claus Gittinger <cg@exept.de>
parents: 1054
diff changeset
   115
1343
b0ee705c63e0 Correct return value when removing elements.
Stefan Vogel <sv@exept.de>
parents: 1290
diff changeset
   116
    "Modified: 6.5.1996 / 12:22:26 / stefan"
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   117
    "Modified: 29.1.1997 / 15:08:45 / cg"
359
claus
parents: 358
diff changeset
   118
!
claus
parents: 358
diff changeset
   119
claus
parents: 358
diff changeset
   120
removeKey:aKey ifAbsent:aBlock
1256
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   121
    "remove the association under aKey from the collection,
2910
1a3e44b10f9b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2741
diff changeset
   122
     return the value previously stored there.
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   123
     If it was not in the collection return the result
1256
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   124
     from evaluating aBlock.
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   125
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   126
    Redefined to avoid synchronization problems, in case
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   127
    of interrupts (otherwise, there could be some other operation
1256
249fd57abee5 commentary
Claus Gittinger <cg@exept.de>
parents: 1223
diff changeset
   128
    on the receiver done by another process, which garbles my contents)."
1054
62ce964f1d2e commentary
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
   129
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   130
    |ret|
359
claus
parents: 358
diff changeset
   131
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   132
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   133
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   134
	^ super removeKey:aKey ifAbsent:aBlock.
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   135
    ].
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   136
359
claus
parents: 358
diff changeset
   137
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   138
	ret := super removeKey:aKey ifAbsent:aBlock
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   139
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   140
	OperatingSystem unblockInterrupts
1343
b0ee705c63e0 Correct return value when removing elements.
Stefan Vogel <sv@exept.de>
parents: 1290
diff changeset
   141
    ].
b0ee705c63e0 Correct return value when removing elements.
Stefan Vogel <sv@exept.de>
parents: 1290
diff changeset
   142
    ^ ret
1054
62ce964f1d2e commentary
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
   143
1343
b0ee705c63e0 Correct return value when removing elements.
Stefan Vogel <sv@exept.de>
parents: 1290
diff changeset
   144
    "Modified: 6.5.1996 / 12:44:51 / stefan"
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   145
    "Modified: 29.1.1997 / 15:09:11 / cg"
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   146
!
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   147
16513
Stefan Vogel <sv@exept.de>
parents: 16244
diff changeset
   148
safeRemoveKey:key
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   149
    "redefined to block interrupts
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   150
     (avoid change of the dictionary while accessing)"
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   151
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   152
    |val|
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   153
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   154
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   155
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   156
	^ super safeRemoveKey:key.
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   157
    ].
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   158
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   159
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   160
	val := super safeRemoveKey:key.
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   161
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   162
	OperatingSystem unblockInterrupts.
2738
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   163
    ].
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   164
    ^ val
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   165
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   166
    "Modified: 6.5.1996 / 12:22:26 / stefan"
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   167
    "Modified: 1.7.1997 / 10:45:52 / cg"
2546e06df154 more interrupt blocking (paranoia)
Claus Gittinger <cg@exept.de>
parents: 2329
diff changeset
   168
    "Created: 1.7.1997 / 10:46:34 / cg"
359
claus
parents: 358
diff changeset
   169
! !
claus
parents: 358
diff changeset
   170
10
claus
parents: 6
diff changeset
   171
!WeakIdentityDictionary methodsFor:'element disposal'!
claus
parents: 6
diff changeset
   172
6309
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   173
clearDeadSlots
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   174
    |wasBlocked|
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   175
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   176
    "
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   177
     have to block here - dispose may be done at a low priority
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   178
     from the background finalizer. If new items are added by a
6309
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   179
     higher prio process, the dictionary might get corrupted otherwise
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   180
    "
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   181
    wasBlocked := OperatingSystem blockInterrupts.
6469
b9f198f122a6 Ensure #unblockInterrupts
Stefan Vogel <sv@exept.de>
parents: 6421
diff changeset
   182
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   183
	keyArray
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   184
	    forAllDeadIndicesDo:[:idx |
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   185
				    valueArray basicAt:idx put:nil.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   186
				    tally := tally - 1.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   187
				]
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   188
	    replacingCorpsesWith:DeletedEntry.
6469
b9f198f122a6 Ensure #unblockInterrupts
Stefan Vogel <sv@exept.de>
parents: 6421
diff changeset
   189
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   190
	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
6469
b9f198f122a6 Ensure #unblockInterrupts
Stefan Vogel <sv@exept.de>
parents: 6421
diff changeset
   191
    ].
6309
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   192
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   193
    "Modified: / 13.12.2001 / 14:18:17 / martin"
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   194
!
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   195
2091
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   196
update:something with:aParameter from:changedObject
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   197
    "an element (either key or value) died - clear out slots for
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   198
     disposed keys."
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
   199
2091
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   200
    something == #ElementExpired ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   201
	self clearDeadSlots.
2091
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   202
    ]
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   203
6309
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   204
    "Created: / 7.1.1997 / 16:59:30 / stefan"
9832d6941a4a extracted clearDeadSlots
martin
parents: 6233
diff changeset
   205
    "Modified: / 13.12.2001 / 14:17:58 / martin"
6
62211a9bc04d Initial revision
claus
parents:
diff changeset
   206
! !
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   207
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   208
!WeakIdentityDictionary methodsFor:'private'!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   209
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   210
findKeyOrNil:key
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   211
    "Look for the key in the receiver.
2988
c6550b3e9b3c Fix spelling.
Stefan Vogel <sv@exept.de>
parents: 2910
diff changeset
   212
     If it is found, return the index,
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   213
     otherwise the index of the first unused slot.
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   214
     Grow the receiver, if key was not found, and no unused slots were present.
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   215
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   216
     Warning: an empty slot MUST be filled by the sender - it is only to be sent
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   217
	      by at:put: / add: - like methods."
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   218
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   219
    |index  "{ Class:SmallInteger }"
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   220
     length "{ Class:SmallInteger }"
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   221
     startIndex probe
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   222
     delIndex "{ Class:SmallInteger }"|
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   223
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   224
    (OperatingSystem blockInterrupts) ifFalse:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   225
	"/
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   226
	"/ may never be entered with interrupts enabled
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   227
	"/
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   228
	OperatingSystem unblockInterrupts.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   229
	self error:'unblocked call of findKeyOrNil'.
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   230
    ].
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   231
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   232
    delIndex := 0.
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   233
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   234
    length := keyArray basicSize.
6953
6b3a197638f0 invoke hash/idHash only in one place (initialIndexFor..)
Claus Gittinger <cg@exept.de>
parents: 6469
diff changeset
   235
    startIndex := index := self initialIndexForKey:key.
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   236
16244
584d9f48f6c1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 13747
diff changeset
   237
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   238
	probe := keyArray basicAt:index.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   239
	key == probe ifTrue:[^ index].
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   240
	probe isNil ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   241
	    delIndex == 0 ifTrue:[^ index].
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   242
	    keyArray basicAt:delIndex put:nil.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   243
	    ^ delIndex
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   244
	].
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   245
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   246
	probe class == SmallInteger ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   247
	    probe := DeletedEntry.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   248
	    keyArray basicAt:index put:probe.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   249
	    valueArray basicAt:index put:nil.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   250
	    tally := tally - 1.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   251
	].
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   252
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   253
	delIndex == 0 ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   254
	    probe == DeletedEntry ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   255
		delIndex := index
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   256
	    ]
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   257
	].
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   258
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   259
	index == length ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   260
	    index := 1
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   261
	] ifFalse:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   262
	    index := index + 1
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   263
	].
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   264
	index == startIndex ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   265
	    delIndex ~~ 0 ifTrue:[
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   266
		keyArray basicAt:delIndex put:nil.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   267
		^ delIndex
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   268
	    ].
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   269
	    ^ self grow findKeyOrNil:key
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   270
	].
16244
584d9f48f6c1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 13747
diff changeset
   271
    ] loop.
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   272
2329
937fc97d5544 must always nil empty slots in #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 2315
diff changeset
   273
    "Modified: 30.1.1997 / 15:04:34 / cg"
2988
c6550b3e9b3c Fix spelling.
Stefan Vogel <sv@exept.de>
parents: 2910
diff changeset
   274
    "Modified: 1.10.1997 / 11:25:32 / stefan"
2315
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   275
!
a9ff2fda8bae mhmh - be very careful when searching for some item.
Claus Gittinger <cg@exept.de>
parents: 2306
diff changeset
   276
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   277
grow:newSize
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   278
    "grow the receiver.
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   279
     Redefined to block interrupts, to avoid trouble when dependencies
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   280
     are added within interrupting high prio processes."
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   281
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   282
"/ 'grow:' printCR.
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   283
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   284
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   285
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   286
	^ super grow:newSize.
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   287
    ].
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   288
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   289
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   290
	super grow:newSize
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   291
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   292
	OperatingSystem unblockInterrupts
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   293
    ].
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   294
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   295
    "Created: 28.1.1997 / 23:41:39 / cg"
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   296
    "Modified: 29.1.1997 / 15:10:12 / cg"
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   297
!
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   298
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   299
initializeForCapacity:minSize
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   300
    "reset the receiver's contents.
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   301
     Redefined to block interrupts, to avoid trouble when dependencies
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   302
     are added within interrupting high prio processes."
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   303
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   304
"/ 'setTally:' printCR.
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   305
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   306
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   307
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   308
	super initializeForCapacity:minSize.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   309
	^ self.
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   310
    ].
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   311
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   312
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   313
	super initializeForCapacity:minSize
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   314
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   315
	OperatingSystem unblockInterrupts
18333
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   316
    ].
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   317
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   318
    "Created: 29.1.1997 / 11:40:12 / cg"
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   319
    "Modified: 29.1.1997 / 15:11:11 / cg"
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   320
!
854cf4f00536 class: WeakIdentityDictionary
Claus Gittinger <cg@exept.de>
parents: 16513
diff changeset
   321
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
keyContainerOfSize:n
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   323
    "return a container for keys of size n.
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   324
     use WeakArrays here, but dont make me a depenent of it."
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   325
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   326
    |w|
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   328
    w := WeakArray new:n.
2091
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   329
    w addDependent:self.
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   330
    ^ w
2091
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   331
c11bb3e29a1b Use dependent mechamism of WeakArray instead of #watcher.
Stefan Vogel <sv@exept.de>
parents: 2027
diff changeset
   332
    "Modified: 7.1.1997 / 17:01:15 / stefan"
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   333
    "Modified: 29.1.1997 / 14:18:49 / cg"
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   334
!
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   335
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   336
rehash
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   337
    "grow the receiver.
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   338
     Redefined to block interrupts, to avoid trouble when dependencies
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   339
     are added within interrupting high prio processes."
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   340
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   341
"/ 'rehash' printCR.
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   342
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   343
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   344
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   345
	super rehash.
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   346
	^ self.
2303
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   347
    ].
f19df2d4c238 avoid creation of a blocks if possible - if not, cheap ones are now created
Claus Gittinger <cg@exept.de>
parents: 2298
diff changeset
   348
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   349
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   350
	super rehash
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   351
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   352
	OperatingSystem unblockInterrupts
2298
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   353
    ].
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   354
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   355
    "Created: 29.1.1997 / 11:39:42 / cg"
e75dabb791dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2260
diff changeset
   356
    "Modified: 29.1.1997 / 14:18:52 / cg"
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   357
! !
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   358
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   359
!WeakIdentityDictionary methodsFor:'testing'!
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   360
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   361
includes:anObject
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   362
    "redefined to block interrupts
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   363
     (avoid change of the dictionary while accessing)"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   364
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   365
    |val|
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   366
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   367
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   368
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   369
	^ super includes:anObject.
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   370
    ].
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   371
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   372
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   373
	val := super includes:anObject.
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   374
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   375
	OperatingSystem unblockInterrupts.
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   376
    ].
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   377
    ^ val
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   378
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   379
    "Modified: 6.5.1996 / 12:22:26 / stefan"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   380
    "Modified: 1.7.1997 / 10:45:52 / cg"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   381
    "Created: 1.7.1997 / 10:47:13 / cg"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   382
!
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   383
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   384
includesKey:key
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   385
    "redefined to block interrupts
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   386
     (avoid change of the dictionary while accessing)"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   387
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   388
    |val|
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   389
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   390
    (OperatingSystem blockInterrupts) ifTrue:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   391
	"/ already blocked
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   392
	^ super includesKey:key.
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   393
    ].
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   394
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   395
    [
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   396
	val := super includesKey:key.
6421
58dca33cf0fc #valueNowOrOnUnwindDo: -> #ensure:
Claus Gittinger <cg@exept.de>
parents: 6309
diff changeset
   397
    ] ensure:[
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   398
	OperatingSystem unblockInterrupts.
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   399
    ].
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   400
    ^ val
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   401
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   402
    "Modified: 6.5.1996 / 12:22:26 / stefan"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   403
    "Created: 1.7.1997 / 10:45:14 / cg"
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   404
    "Modified: 1.7.1997 / 10:45:52 / cg"
9243
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   405
!
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   406
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   407
isWeakCollection
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   408
    "return true, if the receiver has weak references to its elements."
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   409
a4ea5c29fe53 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 8493
diff changeset
   410
    ^ true
2741
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   411
! !
7af858fd7296 category changes
Claus Gittinger <cg@exept.de>
parents: 2738
diff changeset
   412
635
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
   413
!WeakIdentityDictionary class methodsFor:'documentation'!
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
   414
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
   415
version
18620
b4e9f25d6ce6 preparations for lined index list in WeakArray
Claus Gittinger <cg@exept.de>
parents: 18333
diff changeset
   416
    ^ '$Header$'
635
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
   417
! !
16244
584d9f48f6c1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 13747
diff changeset
   418