aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/classpath/jdwp/VMIdManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/classpath/jdwp/VMIdManager.java')
-rw-r--r--libjava/gnu/classpath/jdwp/VMIdManager.java435
1 files changed, 0 insertions, 435 deletions
diff --git a/libjava/gnu/classpath/jdwp/VMIdManager.java b/libjava/gnu/classpath/jdwp/VMIdManager.java
deleted file mode 100644
index f787a8c..0000000
--- a/libjava/gnu/classpath/jdwp/VMIdManager.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/* VMIdManager.java -- A reference/example implementation of a manager for
- JDWP object/reference type IDs
-
- Copyright (C) 2005, 2006, 2007 Free Software Foundation
-
-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
-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 gnu.classpath.jdwp;
-
-import gnu.classpath.jdwp.exception.InvalidClassException;
-import gnu.classpath.jdwp.exception.InvalidObjectException;
-import gnu.classpath.jdwp.id.*;
-
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.SoftReference;
-import java.nio.ByteBuffer;
-import java.util.HashMap;
-import java.util.Hashtable;
-
-/**
- * This class manages objects and referencetypes that are reported
- * to the debugger. All objects and referencetypes reported to the
- * debugger should go through this manager.
- *
- * A brief summary of what an <code>IdManager</code> must provide:
- *
- * <code>
- * public ObjectId getObjectId (Object theObject);
- * public ObjectId get (long id);
- * public ObjectId readObjectId (ByteBuffer bb);
- * public ReferenceTypeId getReferenceTypeId (Class clazz);
- * public ReferenceTypeId getReferenceType (long id);
- * public ReferenceTypeId readReferenceTypeId (ByteBuffer bb);
- * </code>
- *
- * See the javadoc on these methods later in this file for more
- * information on these functions.
- *
- * <b>NOTE:</b> All IDs handled by the ID manager (all object and reference
- * type IDs) are assumed to be of type <code>long</code>.
- *
- * <b>NOTE:</b> This class does not manage virtual machine-specific types,
- * like methods, fields, and frames. These already have unique IDs within
- * the virtual machine and do not need further abstraction here.
- *
- * @author Keith Seitz (keiths@redhat.com)
- */
-public class VMIdManager
-{
- // This factory generates ids for objects and types that may
- // be sent to a debugger.
- private static class IdFactory
- {
- // ID of last object / referencetype
- private static Object _idLock = new Object ();
- private static Object _ridLock = new Object ();
- private static long _lastId = 0;
- private static long _lastRid = 0;
-
- // A list of all ID types
- private static HashMap _idList = new HashMap ();
-
- // Initialize the id list with known types
- static
- {
- // ObjectId and ArrayId are special cases. See newObjectId.
- _idList.put (ClassLoaderId.typeClass, ClassLoaderId.class);
- _idList.put (ClassObjectId.typeClass, ClassObjectId.class);
- _idList.put (StringId.typeClass, StringId.class);
- _idList.put (ThreadId.typeClass, ThreadId.class);
- _idList.put (ThreadGroupId.typeClass, ThreadGroupId.class);
- }
-
- /**
- * Returns a new id for the given object
- *
- * @param obj SoftReference of the object for which an id is desired
- * @returns a suitable object id
- */
- public static ObjectId newObjectId (SoftReference obj)
- {
- ObjectId id = null;
- Object object = obj.get ();
-
- // Special case: arrays
- if (object.getClass ().isArray ())
- id = new ArrayId ();
- else
- {
- // Loop through all classes until we hit baseclass
- Class myClass;
- for (myClass = object.getClass (); myClass != null;
- myClass = myClass.getSuperclass ())
- {
- Class clz = (Class) _idList.get (myClass);
- if (clz != null)
- {
- try
- {
- id = (ObjectId) clz.newInstance ();
- synchronized (_idLock)
- {
- id.setId (++_lastId);
- }
- id.setReference (obj);
- return id;
- }
- catch (InstantiationException ie)
- {
- // This really should not happen
- throw new RuntimeException ("cannot create new ID", ie);
- }
- catch (IllegalAccessException iae)
- {
- // This really should not happen
- throw new RuntimeException ("illegal access of ID", iae);
- }
- }
- }
-
- /* getSuperclass returned null and no matching ID type found.
- So it must derive from Object. */
- id = new ObjectId ();
- }
-
- synchronized (_idLock)
- {
- id.setId (++_lastId);
- }
- id.setReference (obj);
- return id;
- }
-
- /**
- * Returns a new reference type id for the given class
- *
- * @param ref SoftReference to the desired type
- * @returns a suitable reference type id or null when the
- * reference is cleared.
- */
- public static ReferenceTypeId newReferenceTypeId (SoftReference ref)
- {
- ReferenceTypeId id;
- Class clazz = (Class) ref.get ();
- if (clazz == null)
- return null;
-
- if (clazz.isArray ())
- id = new ArrayReferenceTypeId ();
- else if (clazz.isInterface ())
- id = new InterfaceReferenceTypeId ();
- else
- id = new ClassReferenceTypeId ();
- id.setReference (ref);
- synchronized (_ridLock)
- {
- id.setId (++_lastRid);
- }
- return id;
- }
- }
-
- /**
- * This class is a SoftReferenceIdentity type that is used by
- * the ID manager.
- */
- class ReferenceKey extends SoftReference
- {
- // Hash code of referent
- private int _hash;
-
- /**
- * Constructs a new <code>ReferenceKey</code> object
- * with the given referent.
- *
- * <p>This constructor should only be used for object lookups
- * by the backend.
- *
- * @param referent the object to reference
- */
- public ReferenceKey (Object referent)
- {
- super (referent);
- _hash = referent.hashCode ();
- }
-
- /**
- * Constructs a new <code>ReferenceKey</code> object
- * with the given referent and reference queue.
- *
- * <p>The JDWP back-end stores a <code>ReferenceKey</code>
- * with its corresponding <code>JdwpId</code>. This constructor
- * is used by the back-end when adding new IDs to be managed.
- *
- * @param referent the object to reference
- * @param queue the queue to which to report garbage collections
- */
- public ReferenceKey (Object referent, ReferenceQueue queue)
- {
- super (referent, queue);
- _hash = referent.hashCode ();
- }
-
- /**
- * Returns the hash code of the referent.
- * This seems hacky, but is required in order to use this class
- * as a hash table key.
- *
- * @returns the hash code of the referent
- */
- public int hashCode ()
- {
- return _hash;
- }
-
- /**
- * Comparator for keys
- *
- * This method can be used in two ways:
- *
- * <ol>
- * <li>For table lookups, where we want to compare referents</li>
- * <li>For clearing GCd objects, where we want to compare the actual
- * key object (not the referent)</li>
- * </ol>
- */
- public boolean equals (Object obj)
- {
- if (obj instanceof ReferenceKey)
- {
- ReferenceKey ref = (ReferenceKey) obj;
-
- /* First check if the two references are the same.
- If they are, that means we must be clearing GCd objects. */
- if (this == obj)
- return true;
-
- return (ref.get () == get ());
- }
-
- return false;
- }
- }
-
- // instance of VMIdManager
- private static VMIdManager _idm = new VMIdManager ();
-
- // A reference queue for our objects
- private ReferenceQueue _refQueue;
-
- // Mapping of objects (ReferenceKey) to IDs (ObjectId)
- private Hashtable _oidTable;
-
- // Mapping of ID numbers (Long) to IDs (ObjectId)
- private Hashtable _idTable;
-
- /* Mapping of class (ReferenceKey) to IDs (ReferenceTypeId) for reference
- types. Unlike other types, reference id types are NEVER released. */
- private Hashtable _classTable;
-
- // Mapping of ID numbers (Long) to reference type IDs (ReferenceTypeId)
- private Hashtable _ridTable;
-
- /**
- * Gets the instance of VMIdManager, constructing a new one
- * if none currently exists.
- */
- public static VMIdManager getDefault ()
- {
- return _idm;
- }
-
- // Constructs a new <code>IdManager</code>
- private VMIdManager ()
- {
- _refQueue = new ReferenceQueue ();
- _oidTable = new Hashtable (50);
- _idTable = new Hashtable (50);
- _classTable = new Hashtable (20);
- _ridTable = new Hashtable (20);
- }
-
- // Updates the object ID table, removing IDs whose objects have
- // been garbage collected.
- private void _update ()
- {
- Reference ref;
- while ((ref = _refQueue.poll ()) != null)
- {
- ObjectId id = (ObjectId) _oidTable.get (ref);
- _oidTable.remove (ref);
- _idTable.remove (new Long (id.getId ()));
- }
- }
-
- /**
- * Returns an id for the given object, adding it
- * if it does not have an id.
- *
- * @param theObject the object to get an ID/add
- * @returns the ID of the object
- */
- public ObjectId getObjectId (Object theObject)
- {
- // Special case: null object.
- if (theObject == null)
- return new NullObjectId ();
-
- ReferenceKey ref = new ReferenceKey (theObject, _refQueue);
- ObjectId id = (ObjectId) _oidTable.get (ref);
- if (id == null)
- {
- // update the tables -- this is an arbitrary place to put this
- _update ();
-
- // Object not found. Make new id for it
- id = IdFactory.newObjectId (ref);
- _oidTable.put (ref, id);
- _idTable.put (new Long (id.getId ()), id);
- }
-
- return id;
- }
-
- /**
- * Returns the <code>JdwpId</code> for a given ID. Unlike
- * <code>getId</code>, it throws an exception if the ID is not
- * known.
- *
- * @param id the numerical ID of the desired <code>JdwpId</code>
- * @throws InvalidObjectException if the ID is not found
- */
- public ObjectId get (long id)
- throws InvalidObjectException
- {
- // Special case: null object id.
- if (id == 0)
- return new NullObjectId ();
-
- ObjectId oid = (ObjectId) _idTable.get (new Long (id));
- if (oid == null)
- throw new InvalidObjectException (id);
-
- return oid;
- }
-
- public ObjectId readObjectId (ByteBuffer bb)
- throws InvalidObjectException
- {
- long id = bb.getLong ();
- return get (id);
- }
-
- /**
- * Gets the reference type id for the given class, creating
- * a new one if it does not already have an id
- *
- * @param clazz the class for which to get an ID
- * @returns the ID of the class
- */
- public ReferenceTypeId getReferenceTypeId (Class clazz)
- {
- ReferenceKey ref = new ReferenceKey (clazz);
- ReferenceTypeId id = (ReferenceTypeId)_classTable.get (ref);
- if (id == null)
- {
- // Object not found. Make new id for it
- id = IdFactory.newReferenceTypeId (ref);
- _classTable.put (ref, id);
- _ridTable.put (new Long (id.getId ()), id);
- }
-
- return id;
- }
-
- /**
- * Returns the <code>ReferenceTypeId</code> for a given ID. Unlike
- * <code>getReferenceTypeId</code>, it throws an exception if the ID is not
- * known.
- *
- * @param id the numerical ID of the desired reference type
- * @throws InvalidClassException if the ID is not found
- */
- public ReferenceTypeId getReferenceType (long id)
- throws InvalidClassException
- {
- ReferenceTypeId rid = (ReferenceTypeId) _ridTable.get (new Long (id));
- if (rid == null)
- throw new InvalidClassException (id);
-
- return rid;
- }
-
- public ReferenceTypeId readReferenceTypeId (ByteBuffer bb)
- throws InvalidClassException
- {
- long id = bb.getLong ();
- return getReferenceType (id);
- }
-}