src/JavaFinalizationRegistry.st
branchjk_new_structure
changeset 1550 fde50161f2b4
parent 1549 d99bd163584e
child 1551 2af2aa41bddb
--- 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'!