support/Xtreams__RecyclingCenter.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:37:59 +0000
changeset 98 bd334e72464f
parent 93 cc18004ec5a5
child 109 9587e2df7029
permissions -rw-r--r--
Fix in #read:into:at:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/support' }"
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
Object subclass:#RecyclingCenter
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'recycled mutex'
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
93
cc18004ec5a5 XtreamsPool moved to Xtreams namespace.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 65
diff changeset
     8
	poolDictionaries:'Xtreams::XtreamsPool'
24
f906c95ca2ed added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 6
diff changeset
     9
	category:'Xtreams-Support'
6
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
RecyclingCenter class instanceVariableNames:'objectspace1 fixedspace1 objectspaceN fixedspaceN cacheSize'
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
"
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
 No other class instance variables are inherited by this class.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
"
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
RecyclingCenter comment:'Instance Variables
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
	recycled	<IdentityDictionary key: Class value: (Array of: SequenceableCollection)> caches fixed number of collections (3) per sequenceable collection class
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
	mutex	<Semaphore>
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
Class Instance Variables
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
	objectspace1	<RecyclingCenter> old space collections size 1
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	fixedspace1	<RecyclingCenter> fixed space collections size 1
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	objectspaceN	<RecyclingCenter> old space collections of cacheSize
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
	fixedspaceN	<RecyclingCenter> fixed space collection of cacheSize
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
	cacheSize	<SmallInteger> default collection size
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
'
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
!RecyclingCenter class methodsFor:'class initialization'!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
initialize
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
        | cacheLimit |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
        cacheSize := DefaultBufferSize.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
        cacheLimit := 3.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
        objectspace1 := self new initialize: cacheLimit.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
        fixedspace1 := self new initialize: cacheLimit.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
        objectspaceN := self new initialize: cacheLimit.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
        fixedspaceN := self new initialize: cacheLimit
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
! !
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
!RecyclingCenter class methodsFor:'recycling'!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
new: anInteger class: aClass
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
	anInteger == 1 ifTrue: [^objectspace1 new: anInteger class: aClass].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
	anInteger == cacheSize ifTrue: [^objectspaceN new: anInteger class: aClass].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
	^aClass withSize: anInteger
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
newInFixedSpace: anInteger class: aClass
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
	anInteger == 1 ifTrue: [^fixedspace1 newInFixedSpace: anInteger class: aClass].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
	anInteger == cacheSize ifTrue: [^fixedspaceN newInFixedSpace: anInteger class: aClass].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
	^aClass newInFixedSpace: anInteger
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
recycle: aCollection
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
	aCollection == nil ifTrue: [^nil].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
	aCollection isFixedArgument
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
		ifTrue:
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
			[aCollection size == 1 ifTrue: [fixedspace1 recycle: aCollection].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
			aCollection size == cacheSize ifTrue: [fixedspaceN recycle: aCollection]]
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
		ifFalse:
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
			[aCollection size == 1 ifTrue: [objectspace1 recycle: aCollection].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
			aCollection size == cacheSize ifTrue: [objectspaceN recycle: aCollection]]
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
! !
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
!RecyclingCenter methodsFor:'initialize-release'!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
initialize: aCacheLimit
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
	mutex := Semaphore forMutualExclusion.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
	recycled := IdentityDictionary new.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
	SequenceableCollection allSubclassesDo: [:aClass | recycled at: aClass put: (Array new: aCacheLimit)].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	recycled at: InterpretedBytes put: (Array new: aCacheLimit)
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
! !
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
!RecyclingCenter methodsFor:'recycling'!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
existing: aClass
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
        | queue collection |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
        queue := recycled at: aClass.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
        mutex critical: [
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
        1 to: queue size do: [:index |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
                collection := queue at: index.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
                collection == nil ifFalse:
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
                        [queue at: index put: nil.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
                        mutex signal.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
                        ^collection]]].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
        ^nil
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
new: anInteger class: aClass
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
	| collection |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
	(collection := self existing: aClass) == nil ifTrue: [collection := aClass withSize: anInteger].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
	^collection
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
newInFixedSpace: anInteger class: aClass
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
	| collection |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
	(collection := self existing: aClass) == nil ifTrue: [collection := aClass newInFixedSpace: anInteger].
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	^collection
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
recycle: aCollection
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
        | queue |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
        queue := recycled at: aCollection class.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
        mutex critical: [
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
        1 to: queue size do: [:index |
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
                (queue at: index) == nil ifTrue:
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
                        [queue at: index put: aCollection.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
                        mutex signal.
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
                        ^self]]]
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
! !
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
!RecyclingCenter class methodsFor:'documentation'!
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
version_SVN
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
    ^ '$Id$'
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
! !
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
5fcffc3d40d2 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
RecyclingCenter initialize!