OSDN Git Service

2003-08-21 David Daney <ddaney@avtrex.com>
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Aug 2003 22:08:09 +0000 (22:08 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Aug 2003 22:08:09 +0000 (22:08 +0000)
Fix for PR libgcj/12013:
* java/lang/ref/natReference.cc (finalize_referred_to_object):
Check `cleared' field.
* java/lang/ref/Reference.java (copy): Updated comments.
(cleared): New field.
(clear): Rewrote.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70668 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/lang/ref/Reference.java
libjava/java/lang/ref/natReference.cc

index 06595e0..80151e3 100644 (file)
@@ -1,3 +1,12 @@
+2003-08-21  David Daney  <ddaney@avtrex.com>
+
+       Fix for PR libgcj/12013:
+       * java/lang/ref/natReference.cc (finalize_referred_to_object):
+       Check `cleared' field.
+       * java/lang/ref/Reference.java (copy): Updated comments.
+       (cleared): New field.
+       (clear): Rewrote.
+
 2003-08-21  Scott Gilbertson  <scottg@mantatest.com>
             Thomas Fitzsimmons  <fitzsim@redhat.com>
 
index b02a4ed..3a2f91e 100644 (file)
@@ -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.
 
@@ -83,15 +83,25 @@ public abstract class Reference
 
   /**
    * 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.
+   * copy around so that we can clean up our internal data structure
+   * even after clear() is called.
    * GCJ LOCAL:
-   * This field doesn't exist in Classpath; we use it to detect
-   * clearing.
+   * This field doesn't exist in Classpath.
    * END GCJ LOCAL
    */
   gnu.gcj.RawData copy;
 
   /**
+   * Set to true if {@link #clear()} is called.
+   * GCJ LOCAL:
+   * This field doesn't exist in Classpath.  It is used internally in
+   * natReference.cc, which enqueues the reference unless it is true
+   * (has been cleared).
+   * END GCJ LOCAL
+   */
+  boolean cleared = false;
+
+  /**
    * The queue this reference is registered on. This is null, if this
    * wasn't registered to any queue or reference was already enqueued.
    */
@@ -166,8 +176,7 @@ public abstract class Reference
    */
   public void clear()
   {
-    referent = null;
-    copy = null;
+    cleared = true;
   }
 
   /**
index a1550f6..551bd08 100644 (file)
@@ -258,9 +258,7 @@ finalize_referred_to_object (jobject obj)
        {
          java::lang::ref::Reference *ref
            = reinterpret_cast<java::lang::ref::Reference *> (head->reference);
-         // If the copy is already NULL then the user must have
-         // called Reference.clear().
-         if (ref->copy != NULL)
+         if (! ref->cleared)
            ref->enqueue ();
 
          object_list *next = head->next;