CachingRegistry.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 20994 a210e2fb2993
child 21026 81e280fc1b93
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20994
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
     1
"{ Encoding: utf8 }"
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
     2
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 1999 by eXept Software AG
18249
7d686f203624 oops package def was missing
Claus Gittinger <cg@exept.de>
parents: 4434
diff changeset
     5
	      All Rights Reserved
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    14
"{ Package: 'stx:libbasic' }"
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    16
"{ NameSpace: Smalltalk }"
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
Registry subclass:#CachingRegistry
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:'keptReferences cacheSize'
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'System-Support'
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!CachingRegistry class methodsFor:'documentation'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
copyright
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 1999 by eXept Software AG
18249
7d686f203624 oops package def was missing
Claus Gittinger <cg@exept.de>
parents: 4434
diff changeset
    30
	      All Rights Reserved
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 hereby transferred.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
documentation
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    A CachingRegistry behaves generally like a registry;
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    However, it keeps hard references to the last n registered objects,
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    preventing them from being garbage collected (and finalized).
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    This is useful for resources, which do not cost too much memory,
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    48
    but are expensive to allocate - a special candidate of this kind are
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    XFonts. With a CachingRegistry, fonts are kept a bit longer alive
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    and can therefore often be reused - even if temporarily unreferenced.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    This is kind of experimental.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    [author:]
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    55
        Claus Gittinger (cg@exept)
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    [see also:]
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    [instance variables:]
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    60
        keptObjects             Collection      hard referenced objects
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    61
        cacheSize               Integer         number of hard references
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
20393
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    65
!CachingRegistry class methodsFor:'instance creation'!
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    66
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    67
new:cacheSize
20394
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
    68
    ^ (super new:cacheSize) cacheSize:cacheSize
20393
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    69
! !
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    70
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    71
!CachingRegistry methodsFor:'enumerating'!
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    72
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    73
detect:aBlock ifNone:exceptionValue
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    74
    "... additionaly move it to the front of the LRU chain"
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    75
20401
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    76
    |cnt|
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    77
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    78
    "first a quick lookup 
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    79
     (most recent entry is at the end, because #removeIdentical makes room at the end)..."
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    80
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    81
    cnt := 1.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    82
    keptReferences reverseDo:[:obj|
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    83
        (aBlock value:obj) ifTrue:[
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    84
            "if not at the end, put it to the end.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    85
             but avoid to much remove/add actions"
20435
54505346a337 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 20401
diff changeset
    86
            cnt > (cacheSize // 4) ifTrue:[
20401
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    87
                keptReferences removeIdentical:obj ifAbsent:[].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    88
                keptReferences addLast:obj.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    89
            ].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    90
            ^ obj
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    91
        ].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    92
        cnt := cnt + 1.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    93
    ].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    94
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    95
    "check the whole registry..."
20994
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
    96
    keyArray validElementsDo:[:eachElement |
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
    97
        eachElement ~~ DeletedEntry ifTrue:[
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
    98
            |realObject|
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
    99
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   100
            realObject := eachElement.
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   101
            eachElement == NilEntry ifTrue:[realObject := nil].
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   102
            (aBlock value:realObject) ifTrue:[
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   103
                keptReferences size >= cacheSize ifTrue:[
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   104
                    keptReferences removeFirst.
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   105
                ].
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   106
                keptReferences addLast:realObject.
a210e2fb2993 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 20630
diff changeset
   107
                ^ realObject
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   108
            ].
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   109
        ].
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   110
    ].
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   111
    ^ exceptionValue value
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   112
! !
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   113
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
!CachingRegistry methodsFor:'private'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
cacheSize:aNumber
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    keptReferences := OrderedCollection new:aNumber.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    cacheSize := aNumber.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
!CachingRegistry methodsFor:'registering objects'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
register:anObject as:aHandle
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    keptReferences removeIdentical:anObject ifAbsent:nil.
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   125
    aHandle notNil ifTrue:[
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   126
        keptReferences size >= cacheSize ifTrue:[
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   127
            keptReferences removeFirst.
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   128
        ].
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   129
        keptReferences addLast:anObject.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    ].
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    super register:anObject as:aHandle.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   134
removeKey:anObject ifAbsent:absentBlock
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   135
    keptReferences removeIdentical:anObject ifAbsent:nil.
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   136
    super removeKey:anObject ifAbsent:absentBlock.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   139
safeRemoveKey:anObject
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    keptReferences removeIdentical:anObject ifAbsent:nil.
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   141
    super safeRemoveKey:anObject.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
!CachingRegistry class methodsFor:'documentation'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
version
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   147
    ^ '$Header$'
20394
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   148
!
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   149
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   150
version_CVS
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   151
    ^ '$Header$'
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
! !
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   153