WeakDepDict.st
author Claus Gittinger <cg@exept.de>
Fri, 24 Jan 1997 23:11:36 +0100
changeset 2262 4c4d810f006f
parent 2261 61096f935f76
child 2279 ef0f7f5216c4
permissions -rw-r--r--
semaphore names
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1997 by Claus Gittinger
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
WeakIdentityDictionary subclass:#WeakDependencyDictionary
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:''
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'Collections-Unordered'
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!WeakDependencyDictionary class methodsFor:'documentation'!
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
copyright
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 COPYRIGHT (c) 1997 by Claus Gittinger
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
              All Rights Reserved
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
 This software is furnished under a license and may be used
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 only in accordance with the terms of that license and with the
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 be provided or otherwise made available to, or used by, any
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 other person.  No title to or ownership of the software is
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 hereby transferred.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
!
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
documentation
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    A specialized WeakIdentityDictionary, which 'knowns' how
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    to get rid of obsolete entries. This is only used with the
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    dependency mechanism.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    [author:]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
        Claus Gittinger
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    [See also:]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        WeakArray WeakIdentityDictionary WeakValueDictionary WeakIdentitySet
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
"
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
! !
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
!WeakDependencyDictionary methodsFor:'special dependency support'!
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
removeEmptyDependencyValues
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    "special entry for dependency management:
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
     remove any empty (due to finalization) value WeakArray elements."
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    58
    |index t wasBlocked deps o|
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    "/ careful: this is sent by the finalizer at low prio.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    "/ be prepared for the receiver to change while we walk over
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    "/ the value array here ...
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    index := 1.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    [index <= keyArray size] whileTrue:[
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        "/ get the size again - it could have changed
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        wasBlocked := OperatingSystem blockInterrupts.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        index <= keyArray size ifTrue:[
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    70
            deps := valueArray basicAt:index.
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    71
            deps notNil ifTrue:[
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
                "/ is it an empty WeakArray ?
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    74
                (deps isMemberOf:WeakArray) ifTrue:[
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    75
                    t := deps findFirst:[:el | el notNil and:[el ~~ 0]].
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
                    t == 0 ifTrue:[
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
                        "/ yes - nil it
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
                        valueArray basicAt:index put:nil.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
                        (keyArray basicAt:index) notNil ifTrue:[
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
                            keyArray basicAt:index put:DeletedEntry.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
                            tally := tally - 1.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
                        ]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
                    ]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
                ] ifFalse:[
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
                   "/ is it an empty WeakIdSet ?
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    87
                   (deps isMemberOf:WeakIdentitySet) ifTrue:[
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    88
                        (t := deps size) == 0 ifTrue:[
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
                            "/ yes - nil it
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
                            valueArray basicAt:index put:nil.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
                            (keyArray basicAt:index) notNil ifTrue:[
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
                                keyArray basicAt:index put:DeletedEntry.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
                                tally := tally - 1.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
                            ]
2101
516fedf50916 make 1-entry sets into an array
Claus Gittinger <cg@exept.de>
parents: 2093
diff changeset
    95
                        ] ifFalse:[
516fedf50916 make 1-entry sets into an array
Claus Gittinger <cg@exept.de>
parents: 2093
diff changeset
    96
                            t == 1 ifTrue:[
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    97
                                "/ careful - it could actually be empty
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    98
                                o := deps firstIfEmpty:nil.
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
    99
                                o notNil ifTrue:[
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   100
                                    "/ the set lost an object, and shrunk to size 1
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   101
                                    "/ can now use a WeakArray
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   102
                                    valueArray basicAt:index put:(WeakArray with:o)
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   103
                                ]
2101
516fedf50916 make 1-entry sets into an array
Claus Gittinger <cg@exept.de>
parents: 2093
diff changeset
   104
                            ]
516fedf50916 make 1-entry sets into an array
Claus Gittinger <cg@exept.de>
parents: 2093
diff changeset
   105
                        ]
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
                    ]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
                ]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
            ]
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
        ].
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
        wasBlocked ifTrue:[OperatingSystem unblockInterrupts].
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
        index := index + 1.
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    ].
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    "
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
     Dependencies removeEmptyDependencyValues
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    "
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    "Created: 9.1.1997 / 00:00:28 / cg"
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   120
    "Modified: 24.1.1997 / 21:57:31 / cg"
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
! !
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
!WeakDependencyDictionary class methodsFor:'documentation'!
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
version
2261
61096f935f76 care for empty WeakSet which says its not
Claus Gittinger <cg@exept.de>
parents: 2101
diff changeset
   126
    ^ '$Header: /cvs/stx/stx/libbasic/Attic/WeakDepDict.st,v 1.3 1997-01-24 20:58:45 cg Exp $'
2093
3a849047dc90 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
! !