mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			205 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Java
		
	
	
	
/* java.lang.ref.Reference
 | 
						|
   Copyright (C) 1999, 2002, 2003, 2006 Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 
 | 
						|
GNU Classpath is distributed in the hope that it will be useful, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package java.lang.ref;
 | 
						|
 | 
						|
/**
 | 
						|
 * This is the base class of all references.  A reference allows
 | 
						|
 * refering to an object without preventing the garbage collector to
 | 
						|
 * collect it.  The only way to get the referred object is via the
 | 
						|
 * <code>get()</code>-method.  This method will return
 | 
						|
 * <code>null</code> if the object was collected. <br>
 | 
						|
 *
 | 
						|
 * A reference may be registered with a queue.  When a referred
 | 
						|
 * element gets collected the reference will be put on the queue, so
 | 
						|
 * that you will be notified. <br>
 | 
						|
 *
 | 
						|
 * There are currently three types of references:  soft reference,
 | 
						|
 * weak reference and phantom reference. <br>
 | 
						|
 *
 | 
						|
 * Soft references will be cleared if the garbage collector is told
 | 
						|
 * to free some memory and there are no unreferenced or weakly referenced
 | 
						|
 * objects.  It is useful for caches. <br>
 | 
						|
 *
 | 
						|
 * Weak references will be cleared as soon as the garbage collector
 | 
						|
 * determines that the refered object is only weakly reachable.  They
 | 
						|
 * are useful as keys in hashtables (see <code>WeakHashtable</code>) as
 | 
						|
 * you get notified when nobody has the key anymore.
 | 
						|
 *
 | 
						|
 * Phantom references don't prevent finalization.  If an object is only
 | 
						|
 * phantom reachable, it will be finalized, and the reference will be
 | 
						|
 * enqueued, but not cleared.  Since you mustn't access an finalized
 | 
						|
 * object, the <code>get</code> method of a phantom reference will never
 | 
						|
 * work.  It is useful to keep track, when an object is finalized.
 | 
						|
 *
 | 
						|
 * @author Jochen Hoenicke
 | 
						|
 * @see java.util.WeakHashtable
 | 
						|
 */
 | 
						|
public abstract class Reference<T>
 | 
						|
{
 | 
						|
  /**
 | 
						|
   * The underlying object.  This field is handled in a special way by
 | 
						|
   * the garbage collector.
 | 
						|
   * GCJ LOCAL:
 | 
						|
   * This is a RawData because it must be disguised from the GC.
 | 
						|
   * END GCJ LOCAL
 | 
						|
   */
 | 
						|
  gnu.gcj.RawData referent;
 | 
						|
 | 
						|
  /**
 | 
						|
   * This is like REFERENT but is not scanned by the GC.  We keep a
 | 
						|
   * 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.
 | 
						|
   * 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.
 | 
						|
   */
 | 
						|
  ReferenceQueue<? super T> queue;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Link to the next entry on the queue.  If this is null, this
 | 
						|
   * reference is not enqueued.  Otherwise it points to the next
 | 
						|
   * reference.  The last reference on a queue will point to itself
 | 
						|
   * (not to null, that value is used to mark a not enqueued
 | 
						|
   * reference).  
 | 
						|
   */
 | 
						|
  Reference nextOnQueue;
 | 
						|
 | 
						|
  /**
 | 
						|
   * This lock should be taken by the garbage collector, before
 | 
						|
   * determining reachability.  It will prevent the get()-method to
 | 
						|
   * return the reference so that reachability doesn't change.
 | 
						|
   */
 | 
						|
  static Object lock = new Object();
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a new reference that is not registered to any queue.
 | 
						|
   * Since it is package private, it is not possible to overload this
 | 
						|
   * class in a different package.  
 | 
						|
   * @param referent the object we refer to.
 | 
						|
   */
 | 
						|
  Reference(T ref)
 | 
						|
  {
 | 
						|
    create (ref);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a reference that is registered to a queue.  Since this is
 | 
						|
   * package private, it is not possible to overload this class in a
 | 
						|
   * different package.  
 | 
						|
   * @param referent the object we refer to.
 | 
						|
   * @param q the reference queue to register on.
 | 
						|
   * @exception NullPointerException if q is null.
 | 
						|
   */
 | 
						|
  Reference(T ref, ReferenceQueue<? super T> q)
 | 
						|
  {
 | 
						|
    if (q == null)
 | 
						|
      throw new NullPointerException();
 | 
						|
    queue = q;
 | 
						|
    create (ref);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Notifies the VM that a new Reference has been created.
 | 
						|
   */
 | 
						|
  private native void create (T o);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the object, this reference refers to.
 | 
						|
   * @return the object, this reference refers to, or null if the 
 | 
						|
   * reference was cleared.
 | 
						|
   */
 | 
						|
  public native T get();
 | 
						|
 | 
						|
  /**
 | 
						|
   * Clears the reference, so that it doesn't refer to its object
 | 
						|
   * anymore.  For soft and weak references this is called by the
 | 
						|
   * garbage collector.  For phantom references you should call 
 | 
						|
   * this when enqueuing the reference.
 | 
						|
   */
 | 
						|
  public void clear()
 | 
						|
  {
 | 
						|
    // Must synchronize so changes are visible in finalizer thread.
 | 
						|
    synchronized (lock)
 | 
						|
      {
 | 
						|
        referent = null;
 | 
						|
        cleared = true;
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Tells if the object is enqueued on a reference queue.
 | 
						|
   * @return true if it is enqueued, false otherwise.
 | 
						|
   */
 | 
						|
  public boolean isEnqueued()
 | 
						|
  {
 | 
						|
    return nextOnQueue != null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Enqueue an object on a reference queue.  This is normally executed
 | 
						|
   * by the garbage collector.
 | 
						|
   */
 | 
						|
  public boolean enqueue() 
 | 
						|
  {
 | 
						|
    if (queue != null && nextOnQueue == null)
 | 
						|
      {
 | 
						|
	queue.enqueue(this);
 | 
						|
	queue = null;
 | 
						|
	return true;
 | 
						|
      }
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
}
 |