--- a/src/JavaFinalizationRegistry.st Tue Jul 24 02:46:03 2012 +0000
+++ b/src/JavaFinalizationRegistry.st Tue Jul 24 10:22:56 2012 +0000
@@ -115,7 +115,7 @@
(o ~~ referees and:[o ~~ activeReferees]) ifTrue:[
(index := self references: o anyOf: referees) ~~ 0 ifTrue:[
o class name == #'java/lang/ref/Finalizer' ifTrue:[
- "/ self assert: (o instVarNamed: #next) isNil.
+ self assert: (self getNextOf: o) isNil.
references at: index put: o
] ifFalse:[
living at: index put: o.
@@ -133,10 +133,10 @@
firstPendingReference isNil ifTrue:[
firstPendingReference := lastPendingReference := ref
] ifFalse:[
- lastPendingReference instVarNamed: #'next' put: ref.
+ self setNextOf: lastPendingReference to: ref.
lastPendingReference := ref.
].
- lastPendingReference instVarNamed: #'next' put: lastPendingReference.
+ self setNextOf: lastPendingReference to: lastPendingReference
].
].
wasBlocked ifFalse:[ OperatingSystem unblockInterrupts].
@@ -157,6 +157,13 @@
"Created: / 24-07-2012 / 01:19:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
+getNextOf: reference
+
+ ^reference instVarAt: 3
+
+ "Created: / 24-07-2012 / 11:22:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
grow
self shouldImplement.
@@ -170,11 +177,16 @@
reference isNil ifTrue:[ ^ self ].
referenceClass := Java classForName: 'java.lang.ref.Reference'.
- lock := referenceClass instVarNamed: #lock.
+ lock := JavaVM monitorFor: (referenceClass instVarNamed: #lock).
+
- JavaVM monitorEnter: lock in: nil.
- referenceClass instVarNamed: #pending put: reference.
- JavaVM notify: lock.
+ lock enter.
+ [
+ referenceClass instVarNamed: #pending put: reference.
+ lock notify.
+ ] ensure:[
+ lock exit.
+ ].
"Created: / 24-07-2012 / 03:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -308,6 +320,13 @@
^0
"Created: / 24-07-2012 / 01:49:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setNextOf: reference to: value
+
+ ^reference instVarAt: 3 put: value
+
+ "Created: / 24-07-2012 / 11:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaFinalizationRegistry methodsFor:'registering objects'!