re PR libgcj/12013 (Calling Reference.clear() can cause runtime to crash.)

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.

From-SVN: r70668
This commit is contained in:
David Daney 2003-08-21 22:08:09 +00:00 committed by Tom Tromey
parent aa779cf369
commit c9a61d5aa7
3 changed files with 25 additions and 9 deletions

View 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>

View 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,14 +83,24 @@ 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;
}
/**

View 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;