The Trunk: Tests-eem.520.mcz

[email protected] Mon, 6 Jul 2026 04:32:52 0000
Newsgroups gmane.comp.lang.smalltalk.squeak.general
Message-ID <[email protected]>
Eliot Miranda uploaded a new version of Tests to project The Trunk:
http://source.squeak.org/trunk/Tests-eem.520.mcz

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

Name: Tests-eem.520
Author: eem
Time: 5 July 2026, 9:32:50.856182 pm
UUID: 80ef7e36-81bd-4f5b-8d8f-7118e19510f5
Ancestors: Tests-ct.519

Add tests to check if multiple ephemerons on teh same key are finalized, and if ephemerons in both new space and old space with new space keys are correctly finalized.

=============== Diff against Tests-ct.519 ===============

Item was added:
+ TestCase subclass: #EphemeronTest
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Tests-Finalization'!

Item was added:
+ ----- Method: EphemeronTest>>finalizationProcessPriority (in category 'private') -----
+ finalizationProcessPriority
+ 	^(WeakArray classPool at: #FinalizationProcess) priority!

Item was added:
+ ----- Method: EphemeronTest>>flushNewSpace (in category 'private') -----
+ flushNewSpace
+ 	"make sure that all objects are old. A side effect of someObject is to flush all newSpace objects."
+ 
+ 	self someObject!

Item was added:
+ ----- Method: EphemeronTest>>testEphemeronWithNewSpaceKeyFired (in category 'tests') -----
+ testEphemeronWithNewSpaceKeyFired
+ 	1 to: 4 do:
+ 		[:i| | ephemeron ephemerTwo ephemerThree k |
+ 		self assert: Processor activePriority <  self finalizationProcessPriority.
+ 		Smalltalk garbageCollectMost.
+ 		"Even times around test that unfired ephemerons don't break things..."
+ 		i even ifTrue: [ephemerTwo := FinalizationTestEphemeron key: true].
+ 		ephemeron := FinalizationTestEphemeron key: (k := Object new).
+ 		"last two times, move ephemeron to oldSpace, hence in remembered table"
+ 		i >= 3 ifTrue: [ephemeron pin; unpin].
+ 		i even ifTrue: [ephemerThree := FinalizationTestEphemeron key: false].
+ 		Smalltalk garbageCollectMost.
+ 		"because thisContext refers to k the ephemeron should not be fired"
+ 		(Delay forMilliseconds: 1) wait.
+ 		self deny: ephemeron fired.
+ 		k := nil.
+ 		Smalltalk garbageCollectMost.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext no longer refers to k the ephemeron should be fired"
+ 		self assert: ephemeron fired]!

Item was added:
+ ----- Method: EphemeronTest>>testNewSpaceEphemeronsWithNewSpaceKeyFired (in category 'tests') -----
+ testNewSpaceEphemeronsWithNewSpaceKeyFired
+ 	1 to: 4 do:
+ 		[:i| | ephemerOne ephemerTwo ephemerThree ephemerFour ephemerFive k |
+ 		self assert: Processor activePriority < self finalizationProcessPriority.
+ 		Smalltalk garbageCollectMost.
+ 		k := Object new.
+ 		"Even times around test that unfired ephemerons don't break things..."
+ 		i even ifTrue: [ephemerThree  := FinalizationTestEphemeron key: nil].
+ 		ephemerOne := FinalizationTestEphemeron key: k.
+ 		i even ifTrue: [ephemerFour  := FinalizationTestEphemeron key: true].
+ 		ephemerTwo := FinalizationTestEphemeron key: k.
+ 		"last two times, move ephemerTwo to oldSpace, hence in remembered table"
+ 		i >= 3 ifTrue: [ephemerTwo pin; unpin].
+ 		i even ifTrue: [ephemerFive  := FinalizationTestEphemeron key: false].
+ 		Smalltalk garbageCollectMost.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext refers to k the ephemerons should not be fired"
+ 		self deny: ephemerOne fired | ephemerTwo fired.
+ 		k := nil.
+ 		Smalltalk garbageCollectMost.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext no longer refers to k the ephemerons should be fired"
+ 		self assert: ephemerOne fired & ephemerTwo fired]!

Item was added:
+ ----- Method: EphemeronTest>>testOldSpaceEphemeronWithOldSpaceKeyFired (in category 'tests') -----
+ testOldSpaceEphemeronWithOldSpaceKeyFired
+ 	1 to: 4 do:
+ 		[:i| | ephemeron ephemerTwo ephemerThree k |
+ 		self assert: Processor activePriority <  self finalizationProcessPriority.
+ 		Smalltalk garbageCollectMost.
+ 		"Even times around test that unfired ephemerons don't break things..."
+ 		i even ifTrue: [ephemerTwo := FinalizationTestEphemeron key: true].
+ 		ephemeron := FinalizationTestEphemeron key: (k := Object new).
+ 		"last two times, move ephemeron to oldSpace, hence in remembered table"
+ 		i >= 3 ifTrue: [ephemeron pin; unpin].
+ 		i even ifTrue: [ephemerThree := FinalizationTestEphemeron key: false].
+ 		self flushNewSpace.
+ 		Smalltalk garbageCollect.
+ 		"because thisContext refers to k the ephemeron should not be fired"
+ 		(Delay forMilliseconds: 1) wait.
+ 		self deny: ephemeron fired.
+ 		k := nil.
+ 		Smalltalk garbageCollect.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext no longer refers to k the ephemeron should be fired"
+ 		self assert: ephemeron fired]!

Item was added:
+ ----- Method: EphemeronTest>>testOldSpaceEphemeronsWithOldSpaceKeyFired (in category 'tests') -----
+ testOldSpaceEphemeronsWithOldSpaceKeyFired
+ 	1 to: 4 do:
+ 		[:i| | ephemerOne ephemerTwo ephemerThree ephemerFour ephemerFive k |
+ 		self assert: Processor activePriority < self finalizationProcessPriority.
+ 		Smalltalk garbageCollect.
+ 		k := Object new.
+ 		"Even times around test that unfired ephemerons don't break things..."
+ 		i even ifTrue: [ephemerThree  := FinalizationTestEphemeron key: nil].
+ 		ephemerOne := FinalizationTestEphemeron key: k.
+ 		i even ifTrue: [ephemerFour  := FinalizationTestEphemeron key: true].
+ 		ephemerTwo := FinalizationTestEphemeron key: k.
+ 		"last two times, move ephemerTwo to oldSpace, hence in remembered table"
+ 		i >= 3 ifTrue: [ephemerTwo pin; unpin].
+ 		i even ifTrue: [ephemerFive  := FinalizationTestEphemeron key: false].
+ 		self flushNewSpace.
+ 		Smalltalk garbageCollect.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext refers to k the ephemerons should not be fired"
+ 		self deny: ephemerOne fired | ephemerTwo fired.
+ 		k := nil.
+ 		Smalltalk garbageCollect.
+ 		(Delay forMilliseconds: 1) wait.
+ 		"becuase thisContext no longer refers to k the ephemerons should be fired"
+ 		self assert: ephemerOne fired & ephemerTwo fired]!

Item was added:
+ Ephemeron ephemeronSubclass: #FinalizationTestEphemeron
+ 	instanceVariableNames: 'fired'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Tests-Finalization'!

Item was added:
+ ----- Method: FinalizationTestEphemeron>>fired (in category 'accessing') -----
+ fired
+ 	^fired!

Item was added:
+ ----- Method: FinalizationTestEphemeron>>key: (in category 'accessing') -----
+ key: aKey
+ 	fired ifNil: [fired := false].
+ 	^super key: aKey!

Item was added:
+ ----- Method: FinalizationTestEphemeron>>key:value: (in category 'accessing') -----
+ key: aKey value: anObject
+ 	fired ifNil: [fired := false].
+ 	^super key: aKey value: anObject!

Item was added:
+ ----- Method: FinalizationTestEphemeron>>mourn (in category 'mourning') -----
+ mourn
+ 	"override to record mourn having been sent"
+ 
+ 	fired := true.
+ 	^super mourn!

Squeak-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]