mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 19:57:37 +08:00
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:
parent
aa779cf369
commit
c9a61d5aa7
@ -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>
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user