[squeak-dev] The Trunk: Collections-ul.586.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Oct 27 20:52:32 UTC 2014


Levente Uzonyi uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ul.586.mcz

==================== Summary ====================

Name: Collections-ul.586
Author: ul
Time: 27 October 2014, 12:52:51.886 am
UUID: 4c460675-3065-4b48-aa30-52ad67e15076
Ancestors: Collections-cmm.585

Symbol table changes:
- ensure that enumerations stay consistent
- avoid read-write and write-write race conditions
- added a safe #condenseNewSymbols method, which is a replacement for former unsafe methods (#shutDown: and #compactSymbolTable). It's also automatically triggered whenever there are more than 1000 NewSymbols.
- deprecated #compactSymbolTable
- updated some comments

Note that interning many symbols is a bit slower, but thread safety is more important.

=============== Diff against Collections-cmm.585 ===============

Item was changed:
  ----- Method: Symbol class>>allSymbolTablesDo: (in category 'class initialization') -----
  allSymbolTablesDo: aBlock
+ 	
+ 	| originalNewSymbols originalSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
+ 	originalNewSymbols do: aBlock.
+ 	originalSymbolTable do: aBlock.!
- 
- 	NewSymbols do: aBlock.
- 	SymbolTable do: aBlock.!

Item was changed:
  ----- Method: Symbol class>>allSymbolTablesDo:after: (in category 'class initialization') -----
  allSymbolTablesDo: aBlock after: aSymbol
  
+ 	| originalNewSymbols originalSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
+ 	(originalNewSymbols includes: aSymbol) 
- 	(NewSymbols includes: aSymbol) 
  		ifTrue: [
+ 			originalNewSymbols do: aBlock after: aSymbol.
+ 			originalSymbolTable do: aBlock after: aSymbol ]
- 			NewSymbols do: aBlock after: aSymbol.
- 			SymbolTable do: aBlock after: aSymbol ]
  		ifFalse: [
+ 			originalSymbolTable do: aBlock after: aSymbol.
+ 			originalNewSymbols do: aBlock after: aSymbol ]
- 			SymbolTable do: aBlock after: aSymbol.
- 			NewSymbols do: aBlock after: aSymbol ]
  	!

Item was changed:
  ----- Method: Symbol class>>allSymbols (in category 'access') -----
  allSymbols
  	"Answer all interned symbols"
  	
+ 	| originalNewSymbols originalSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
  	^Array
+ 		new: originalNewSymbols slowSize + originalSymbolTable slowSize
- 		new: NewSymbols slowSize + SymbolTable slowSize
  		streamContents:[ :stream |
  			stream
+ 				nextPutAll: originalNewSymbols;
+ 				nextPutAll: originalSymbolTable ]
- 				nextPutAll: NewSymbols;
- 				nextPutAll: SymbolTable ]
  !

Item was changed:
  ----- Method: Symbol class>>cleanUp (in category 'class initialization') -----
  cleanUp
  	"Flush caches"
  
+ 	self condenseNewSymbols!
- 	self compactSymbolTable.!

Item was changed:
  ----- Method: Symbol class>>compactSymbolTable (in category 'class initialization') -----
  compactSymbolTable
  	"Reduce the size of the symbol table so that it holds all existing symbols with 25% free space."
  
+ 	self deprecated: 'Use #condenseNewSymbols instead'.
+ 	self condenseNewSymbols!
- 	| oldSize |
- 	Smalltalk garbageCollect.
- 	oldSize := SymbolTable capacity.
- 	SymbolTable compact.
- 	^(oldSize - SymbolTable capacity) printString, ' slot(s) reclaimed'!

Item was added:
+ ----- Method: Symbol class>>condenseNewSymbols (in category 'private') -----
+ condenseNewSymbols
+ 	"Move all symbols from NewSymbols to SymbolTable, and compact SymbolTable."
+ 
+ 	| originalNewSymbols originalSymbolTable newNewSymbols newSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
+ 	newNewSymbols := WeakSet new.
+ 	newSymbolTable := originalSymbolTable copy
+ 		addAll: originalNewSymbols;
+ 		compact;
+ 		yourself.
+ 	originalNewSymbols == NewSymbols ifFalse: [
+ 		"Some other process has modified the symbols. Try again."
+ 		^self condenseNewSymbols ].
+ 	NewSymbols := newNewSymbols.
+ 	SymbolTable := newSymbolTable!

Item was changed:
  ----- Method: Symbol class>>intern: (in category 'instance creation') -----
  intern: aStringOrSymbol 
  
+ 	| originalNewSymbols |
+ 	originalNewSymbols := NewSymbols.
  	^(self lookup: aStringOrSymbol) ifNil:[
+ 		| aClass aSymbol newNewSymbols |
- 		| aClass aSymbol |
  		aStringOrSymbol isSymbol ifTrue:[
  			aSymbol := aStringOrSymbol.
  		] ifFalse:[
  			aClass := aStringOrSymbol isOctetString ifTrue:[ByteSymbol] ifFalse:[WideSymbol].
  			aSymbol := aClass new: aStringOrSymbol size.
  			aSymbol string: aStringOrSymbol.
  		].
+ 		newNewSymbols := originalNewSymbols copyWith: aSymbol.
+ 		originalNewSymbols == NewSymbols
+ 			ifTrue: [
+ 				NewSymbols := newNewSymbols.
+ 				newNewSymbols size > 1000 ifTrue: [ self condenseNewSymbols ].
+ 				aSymbol ]
+ 			ifFalse: [
+ 				"Some other process has modified the symbols. Try again."
+ 				self intern: aStringOrSymbol ] ]!
- 		NewSymbols add: aSymbol.
- 		aSymbol].!

Item was changed:
  ----- Method: Symbol class>>lookup: (in category 'instance creation') -----
  lookup: aStringOrSymbol
  
+ 	| originalNewSymbols originalSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
+ 	^(originalNewSymbols like: aStringOrSymbol) ifNil: [
+ 		originalSymbolTable like: aStringOrSymbol ]!
- 	^(SymbolTable like: aStringOrSymbol) ifNil: [
- 		NewSymbols like: aStringOrSymbol
- 	]!

Item was changed:
  ----- Method: Symbol class>>rehash (in category 'private') -----
+ rehash
+ 	"Rebuild the hash table, reclaiming unreferenced Symbols. This method will intern all symbols. You're probably looking for #condenseNewSymbols instead."
- rehash		"Symbol rehash"
- 	"Rebuild the hash table, reclaiming unreferenced Symbols."
  
+ 	| originalNewSymbols originalSymbolTable newNewSymbols newSymbolTable |
+ 	originalNewSymbols := NewSymbols.
+ 	originalSymbolTable := SymbolTable.
+ 	newNewSymbols := WeakSet new.
+ 	newSymbolTable := WeakSet withAll: self allSubInstances.
+ 	originalNewSymbols == NewSymbols ifFalse: [
+ 		"Some other process has modified the symbols. Try again."
+ 		^self rehash ].
+ 	NewSymbols := newNewSymbols.
+ 	SymbolTable := newSymbolTable!
- 	SymbolTable := WeakSet withAll: self allSubInstances.
- 	NewSymbols := WeakSet new.!

Item was changed:
  ----- Method: Symbol class>>shutDown: (in category 'private') -----
  shutDown: aboutToQuit
  
+ 	self condenseNewSymbols!
- 	SymbolTable addAll: NewSymbols.
- 	NewSymbols := WeakSet new.!



More information about the Squeak-dev mailing list