CachingRegistry.st
author Stefan Vogel <sv@exept.de>
Fri, 23 Sep 2016 17:16:38 +0200
changeset 20435 54505346a337
parent 20401 fb5b39df9894
child 20578 39641ba8d6e0
child 20630 0bb11d4c8772
permissions -rw-r--r--
#OTHER by stefan class: CachingRegistry changed: #detect:ifNone:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
     1
"{ Encoding: utf8 }"
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
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
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    [author:]
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    56
        Claus Gittinger (cg@exept)
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    [see also:]
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    [instance variables:]
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    61
        keptObjects             Collection      hard referenced objects
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
    62
        cacheSize               Integer         number of hard references
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    [class variables:]
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
"
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
20393
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    68
!CachingRegistry class methodsFor:'instance creation'!
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
new:cacheSize
20394
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
    71
    ^ (super new:cacheSize) cacheSize:cacheSize
20393
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    72
! !
4d74f02d1a9f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20388
diff changeset
    73
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    74
!CachingRegistry methodsFor:'enumerating'!
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    75
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    76
detect:aBlock ifNone:exceptionValue
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    77
    "... additionaly move it to the front of the LRU chain"
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    78
20401
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    79
    |cnt|
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
    "first a quick lookup 
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    82
     (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
    83
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    84
    cnt := 1.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    85
    keptReferences reverseDo:[:obj|
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    86
        (aBlock value:obj) ifTrue:[
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    87
            "if not at the end, put it to the end.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    88
             but avoid to much remove/add actions"
20435
54505346a337 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 20401
diff changeset
    89
            cnt > (cacheSize // 4) ifTrue:[
20401
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    90
                keptReferences removeIdentical:obj ifAbsent:[].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    91
                keptReferences addLast:obj.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    92
            ].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    93
            ^ obj
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
        cnt := cnt + 1.
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    96
    ].
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    97
fb5b39df9894 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 20395
diff changeset
    98
    "check the whole registry..."
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
    99
    keyArray validElementsDo:[:obj |
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   100
        (obj ~~ DeletedEntry and:[aBlock value:obj]) ifTrue:[
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   101
            keptReferences size >= cacheSize ifTrue:[
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   102
                keptReferences removeFirst.
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   103
            ].
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   104
            keptReferences addLast:obj.
20388
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   105
            ^ obj
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   106
        ].
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   107
    ].
db4b243d97ce #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20043
diff changeset
   108
    ^ exceptionValue value
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
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
!CachingRegistry methodsFor:'private'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
cacheSize:aNumber
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    keptReferences := OrderedCollection new:aNumber.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    cacheSize := aNumber.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!CachingRegistry methodsFor:'registering objects'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
register:anObject as:aHandle
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    keptReferences removeIdentical:anObject ifAbsent:nil.
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   122
    aHandle notNil ifTrue:[
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   123
        keptReferences size >= cacheSize ifTrue:[
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   124
            keptReferences removeFirst.
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   125
        ].
20395
50417882857e #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 20394
diff changeset
   126
        keptReferences addLast:anObject.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    ].
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    super register:anObject as:aHandle.
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   131
removeKey:anObject ifAbsent:absentBlock
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   132
    keptReferences removeIdentical:anObject ifAbsent:nil.
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   133
    super removeKey:anObject ifAbsent:absentBlock.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   136
safeRemoveKey:anObject
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    keptReferences removeIdentical:anObject ifAbsent:nil.
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   138
    super safeRemoveKey:anObject.
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
! !
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
!CachingRegistry class methodsFor:'documentation'!
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
version
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   144
    ^ '$Header$'
20394
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   145
!
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   146
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   147
version_CVS
b76075273e88 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20393
diff changeset
   148
    ^ '$Header$'
4434
887b60637a1c initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
! !
20043
0be0ccf00b36 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 18249
diff changeset
   150