JdwpIdFactory.java: New file.
authorKeith Seitz <kseitz@gcc.gnu.org>
Wed, 15 Jun 2005 03:10:31 +0000 (03:10 +0000)
committerKeith Seitz <kseitz@gcc.gnu.org>
Wed, 15 Jun 2005 03:10:31 +0000 (03:10 +0000)
        * gnu/classpath/jdwp/id/JdwpIdFactory.java: New file.
        * gnu/classpath/jdwp/processor/PacketProcessor.java: New file.

From-SVN: r100970

libjava/ChangeLog
libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java [new file with mode: 0644]
libjava/gnu/classpath/jdwp/processor/PacketProcessor.java [new file with mode: 0644]

index 1024cccfbaaee014a903ece6dfcf41c7c2b411db..3f64814cc2a9f5f07124d886918a491a6b616ebd 100644 (file)
@@ -1,3 +1,12 @@
+2005-06-15  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+       * configure.host: Handle Solaris 10/x86.
+
+2005-06-14  Keith Seitz  <keiths@redhat.com>
+
+       * gnu/classpath/jdwp/id/JdwpIdFactory.java: New file.
+       * gnu/classpath/jdwp/processor/PacketProcessor.java: New file.
+
 2005-06-14  Keith Seitz  <keiths@redhat.com>
 
        * gnu/classpath/jdwp/id/ArrayId.java: New file.
        * gnu/classpath/jdwp/id/ThreadGroupId.java: New file.
        * gnu/classpath/jdwp/id/ThreadId.java: New file.
 
-2005-06-15  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
-
-       * configure.host: Handle Solaris 10/x86.
-
 2005-06-14  Tom Tromey  <tromey@redhat.com>
 
        PR libgcj/19877:
diff --git a/libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java b/libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java
new file mode 100644 (file)
index 0000000..5a26cf8
--- /dev/null
@@ -0,0 +1,165 @@
+/* JdwpIdFactory.java -- factory for generating type and object IDs
+   Copyright (C) 2005 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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.id;
+
+import java.util.HashMap;
+
+/**
+ * This factory generates ids for objects and types that may
+ * be sent to a debugger.
+ *
+ * @author Keith Seitz  (keiths@redhat.com)
+ */
+public class JdwpIdFactory
+{
+  // 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 newId.
+    _idList.put (ClassLoaderId.typeClass, ClassLoaderId.class);
+    _idList.put (ClassObjectId.typeClass, ClassObjectId.class);
+    //_idList.put (FieldId.typeClass, FieldId.class);
+    //_idList.put (FrameId.typeClass, FrameId.class);
+    //_idList.put (MethodId.typeClass, MethodId.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 object  the object for which an id is desired
+   * @returns a suitable object id
+   */
+  public static JdwpId newId (Object object)
+  {
+    JdwpId id = null;
+    
+    // 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 = (JdwpId) clz.newInstance ();
+                   synchronized (_idLock)
+                     {
+                       id.setId (++_lastId);
+                     }
+                   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);
+      }
+
+    return id;
+  }
+
+  /**
+   * Returns a new reference type id for the given class
+   *
+   * @param clazz  the <code>Class</code> for which an id is desired
+   * @returns a suitable reference type id or <code>null</code>
+   */
+  public static ReferenceTypeId newReferenceTypeId (Class clazz)
+  {
+    ReferenceTypeId id = null;
+    try
+      {
+       if (clazz.isArray ())
+         id = new ArrayReferenceTypeId ();
+       else if (clazz.isInterface ())
+         id = new InterfaceReferenceTypeId ();
+       else
+         id = new ClassReferenceTypeId ();
+       synchronized (_ridLock)
+         {
+           id.setId (++_lastRid);
+         }
+       return id;
+      }
+    catch (InstantiationException ie)
+      {
+       return null;
+      }
+    catch (IllegalAccessException iae)
+      {
+       return null;
+      }
+  }
+}
diff --git a/libjava/gnu/classpath/jdwp/processor/PacketProcessor.java b/libjava/gnu/classpath/jdwp/processor/PacketProcessor.java
new file mode 100644 (file)
index 0000000..8195cbb
--- /dev/null
@@ -0,0 +1,138 @@
+/* PacketProcessor.java -- a thread which processes command packets
+   from the debugger
+   Copyright (C) 2005 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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.processor;
+
+import gnu.classpath.jdwp.Jdwp;
+import gnu.classpath.jdwp.event.Event;
+import gnu.classpath.jdwp.exception.JdwpException;
+import gnu.classpath.jdwp.transport.JdwpConnection;
+import gnu.classpath.jdwp.transport.JdwpCommandPacket;
+import gnu.classpath.jdwp.transport.JdwpPacket;
+import gnu.classpath.jdwp.transport.JdwpReplyPacket;
+
+import java.io.IOException;
+
+/**
+ * This class is responsible for processing packets from the
+ * debugger. It waits for an available packet from the connection
+ * ({@link gnu.classpath.jdwp.transport.JdwpConnection}) and then
+ * processes the packet and any reply.
+ *
+ * @author Keith Seitz (keiths@redhat.com)
+ */
+public class PacketProcessor
+  extends Thread
+{
+  // The connection to the debugger
+  private JdwpConnection _connection;
+  
+  // Shutdown this thread?
+  private boolean _shutdown;
+
+  /**
+   * Constructs a new <code>PacketProcessor</code> object
+   * Connection must be validated before getting here!
+   *
+   * @param con  the connection
+   */
+  public PacketProcessor (JdwpConnection con)
+  {
+    _connection = con;
+    _shutdown = false;
+  }
+
+  /**
+   * Main run routine for this thread. Will loop getting packets
+   * from the connection and processing them.
+   */
+  public void run ()
+  {
+    while (!_shutdown)
+      {
+       _processOnePacket ();
+      }
+  }
+
+  /**
+   * Shutdown the packet processor
+   */
+  public void shutdown ()
+  {
+    _shutdown = true;
+    interrupt ();
+  }
+
+  // Helper function which actually does all the work of waiting
+  // for a packet and getting it processed.
+  private void _processOnePacket ()
+  {
+    JdwpPacket pkt = _connection.getPacket ();
+    if (pkt instanceof JdwpReplyPacket)
+      {
+       // We're not supposed to get these from the debugger!
+       // Drop it on the floor
+       return;
+      }
+
+    if (pkt != null)
+      {
+       JdwpReplyPacket reply;
+       try
+         {
+           // !! process packet here !!
+           reply = new JdwpReplyPacket (pkt, (short) 0);
+         }
+       catch (JdwpException ex)
+         {
+           reply = new JdwpReplyPacket (pkt, ex.getErrorCode ());
+         }
+
+       try
+         {
+           _connection.sendPacket (reply);
+         }
+       catch (IOException ioe)
+         {
+           // Not much we can do...
+         }
+      }
+  }
+}