Patch to fix Reference/natReference.

Tom Tromey tromey@redhat.com
Thu Aug 21 18:10:00 GMT 2003


David> If Reference.clear() is called and then the Reference is finalized
David> before its referent, a dangling pointer is created in the object_list
David> structure in natReference.cc.  This happens because the 'copy' field
David> of the Reference is cleared and that is what is used to find the slot
David> in the object_list table.

Could you try the appended patch instead?

I can't try it right now, since I've got other patches in my tree
that break things all over.

This is based on the idea that we shouldn't clear `copy'.  It also
removes the disappearing link registration; I think that is a leftover
from an earlier implementation where `referent' was an Object (and
thus traced by the GC).  If this works I think we can remove
_Jv_GCRegisterDisappearingLink altogether.

Tom

Index: java/lang/ref/Reference.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/ref/Reference.java,v
retrieving revision 1.4
diff -u -r1.4 Reference.java
--- java/lang/ref/Reference.java 19 Nov 2002 21:59:40 -0000 1.4
+++ java/lang/ref/Reference.java 21 Aug 2003 18:05:06 -0000
@@ -1,5 +1,5 @@
 /* java.lang.ref.Reference
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -85,8 +85,8 @@
    * This is like REFERENT but is not scanned by the GC.  We keep a
    * copy around so that we can see when clear() has been called.
    * GCJ LOCAL:
-   * This field doesn't exist in Classpath; we use it to detect
-   * clearing.
+   * This field doesn't exist in Classpath; we use it to let us clean
+   * up some internal data structures after clearing.
    * END GCJ LOCAL
    */
   gnu.gcj.RawData copy;
@@ -167,7 +167,6 @@
   public void clear()
   {
     referent = null;
-    copy = null;
   }
 
   /**
Index: java/lang/ref/natReference.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/ref/natReference.cc,v
retrieving revision 1.4
diff -u -r1.4 natReference.cc
--- java/lang/ref/natReference.cc 20 Aug 2003 15:30:04 -0000 1.4
+++ java/lang/ref/natReference.cc 21 Aug 2003 18:05:06 -0000
@@ -258,10 +258,16 @@
 	{
 	  java::lang::ref::Reference *ref
 	    = reinterpret_cast<java::lang::ref::Reference *> (head->reference);
-	  // If the copy is already NULL then the user must have
+	  // If reference is already NULL then the user must have
 	  // called Reference.clear().
-	  if (ref->copy != NULL)
-	    ref->enqueue ();
+	  if (ref->referent != NULL)
+	    {
+	      // The JDK doesn't appear to call clear() internally,
+	      // so we don't either.
+	      if (w != PHANTOM)
+		ref->referent = NULL;
+	      ref->enqueue ();
+	    }
 
 	  object_list *next = head->next;
 	  _Jv_Free (head);
@@ -303,8 +309,6 @@
       // finalizer for ourselves as well.
       _Jv_RegisterFinalizer (this, finalize_reference);
       _Jv_RegisterFinalizer (referent, finalize_referred_to_object);
-      jobject *objp = reinterpret_cast<jobject *> (&referent);
-      _Jv_GCRegisterDisappearingLink (objp);
       add_to_hash (this);
     }
 }



More information about the Java mailing list