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