classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [PATCH/JDWP] Events


From: Keith Seitz
Subject: [cp-patches] [PATCH/JDWP] Events
Date: Mon, 29 Aug 2005 17:51:25 -0700
User-agent: Mozilla Thunderbird 1.0.6-1.1.fc4 (X11/20050720)

Hi,

I've committed some files covering events. It is not complete, but it is a start. I don't like some of it, but I'll fix whatever I don't like when I start working on optimization.

Keith

ChangeLog
2005-08-29  Keith Seitz  <address@hidden>

        * gnu/classpath/jdwp/event/Event.java: New file describing JDWP
        events.
        * gnu/classpath/jdwp/event/ClassPrepareEvent.java: New file.
        * gnu/classpath/jdwp/event/ThreadEndEvent.java: New file.
        * gnu/classpath/jdwp/event/ThreadStartEvent.java: New file.
        * gnu/classpath/jdwp/event/VmInitEvent.java (VmInitEvent): New
        file.
Index: gnu/classpath/jdwp/event/Event.java
===================================================================
RCS file: gnu/classpath/jdwp/event/Event.java
diff -N gnu/classpath/jdwp/event/Event.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/event/Event.java 30 Aug 2005 00:49:59 -0000
@@ -0,0 +1,130 @@
+/* Event.java -- a base class for all event types
+   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., 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.event;
+
+import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.transport.JdwpCommandPacket;
+import gnu.classpath.jdwp.transport.JdwpPacket;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * This class is a base class for all VM->debugger event
+ * notifications.
+ *
+ * @author Keith Seitz  (address@hidden)
+ */
+public abstract class Event
+{
+  // The kind of event represented by this event
+  private byte _eventKind;
+
+  /**
+   * Constructs an <code>Event</code> of the given kind
+   *
+   * @param kind  the type of event
+   */
+  public Event (byte kind)
+  {
+    _eventKind = kind;
+  }
+
+  /**
+   * Returns the event type of this event
+   *
+   * @returns  the event kind
+   */
+  public byte getEventKind ()
+  {
+    return _eventKind;
+  }
+
+  /**
+   * Abstract function used by implementing classes to fill in the
+   * event-specific data. Note that request ID is automatically added
+   * by this class (since it appears in all event notifications).
+   *
+   * @param outStream  the stream to which to write data
+   */
+  protected abstract void _writeData (DataOutputStream outStream)
+    throws IOException;
+
+  /**
+   * Returns a specific filtering parameter for this event. For example,
+   * most events may be filtered by thread. Consequently, a call to this
+   * method with <code>ThreadId.class</code> should return a
+   * <code>Thread</code>.
+   *
+   * @param type  the type of parameter to return
+   * @returns the parameter (not the ID) or <code>null</code> if none is
+   *          is defined for this event
+   */
+  public abstract Object getParameter (Class type);
+
+  /**
+   * Converts this event into to a JDWP packet
+   *
+   * @param dos     the stream to which to write data
+   * @param request the request the wanted this notification
+   * @returns a <code>JdwpPacket</code> of the events
+   */
+  public JdwpPacket toPacket (DataOutputStream dos, EventRequest request)
+  {
+    JdwpPacket pkt;
+    try
+      {
+       dos.writeByte (request.getSuspendPolicy ());
+       dos.writeInt (1);
+       dos.writeByte (_eventKind);
+       dos.writeInt (request.getId ());
+       _writeData (dos);
+
+       pkt = new JdwpCommandPacket (JdwpConstants.CommandSet.Event.CS_VALUE,
+                                    JdwpConstants.CommandSet.Event.COMPOSITE);
+      }
+    catch (IOException ioe)
+      {
+       pkt = null;
+      }
+
+    return pkt;
+  }
+}
Index: gnu/classpath/jdwp/event/ClassPrepareEvent.java
===================================================================
RCS file: gnu/classpath/jdwp/event/ClassPrepareEvent.java
diff -N gnu/classpath/jdwp/event/ClassPrepareEvent.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/event/ClassPrepareEvent.java     30 Aug 2005 00:49:59 
-0000
@@ -0,0 +1,147 @@
+/* ClassPrepareEvent.java -- An event specifying that a class has been
+   prepared by the virtual machine
+   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., 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.event;
+
+import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMIdManager;
+import gnu.classpath.jdwp.id.ReferenceTypeId;
+import gnu.classpath.jdwp.id.ThreadId;
+import gnu.classpath.jdwp.util.JdwpString;
+import gnu.classpath.jdwp.util.Signature;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * "Notification of a class prepare in the target VM. See the JVM
+ * specification for a definition of class preparation. Class prepare
+ * events are not generated for primtiive classes (for example,
+ * <code>java.lang.Integer.TYPE</code>)." -- JDWP 1.4.2
+ *
+ * @author Keith Seitz  (address@hidden)
+ */
+public class ClassPrepareEvent
+  extends Event
+{
+  // The thread in which this event occurred
+  private Thread _thread;
+
+  // The class that was prepared
+  private Class _class;
+
+  // Prepare flags
+  private int _status;
+
+  /**
+   * Class has been verified
+   */
+  public static final int STATUS_VERIFIED
+      = JdwpConstants.ClassStatus.VERIFIED;
+
+  /**
+   * Class has been prepared
+   */
+  public static final int STATUS_PREPARED
+      = JdwpConstants.ClassStatus.PREPARED;
+
+  /**
+   * Class has been initialized
+   */
+  public static final int STATUS_INITIALIZED
+      = JdwpConstants.ClassStatus.INITIALIZED;
+
+  /**
+   * Error preparing class
+   */
+  public static final int STATUS_ERROR
+      = JdwpConstants.ClassStatus.ERROR;
+
+  /**
+   * Constructs a new <code>ClassPrepareEvent</code>
+   *
+   * @param thread  thread in which event occurred
+   * @param clazz   class which was prepared
+   * @param flags   prepare status flags
+   */
+  public ClassPrepareEvent (Thread thread, Class clazz, int flags)
+  {
+    super (JdwpConstants.EventKind.CLASS_PREPARE);
+    _thread = thread;
+    _class = clazz;
+    _status = flags;
+  }
+
+  /**
+   * Returns a specific filtering parameter for this event.
+   * Valid types are thread and class.
+   *
+   * @param type  the type of parameter desired
+   * @returns the desired parameter or <code>null</code>
+   */
+  public Object getParameter (Class type)
+  {
+    if (type == ThreadId.class)
+      return _thread;
+    else if (type == ReferenceTypeId.class)
+      return _class;
+
+    return null;
+  }
+
+  /**
+   * Writes the event to the given stream
+   *
+   * @param outStream  the output stream to write the event to
+   */
+  protected void _writeData (DataOutputStream outStream)
+    throws IOException
+  {
+    VMIdManager idm = VMIdManager.getDefault();
+    ThreadId tid = (ThreadId) idm.getObjectId (_thread);
+    ReferenceTypeId rid = idm.getReferenceTypeId (_class);
+
+    tid.write (outStream);
+    rid.writeTagged (outStream);
+    JdwpString.writeString (outStream,
+                           Signature.computeClassSignature (_class));
+    outStream.writeInt (_status);
+  }
+}
Index: gnu/classpath/jdwp/event/ThreadEndEvent.java
===================================================================
RCS file: gnu/classpath/jdwp/event/ThreadEndEvent.java
diff -N gnu/classpath/jdwp/event/ThreadEndEvent.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/event/ThreadEndEvent.java        30 Aug 2005 00:49:59 
-0000
@@ -0,0 +1,105 @@
+/* ThreadEndEvent.java -- An event specifying that a thread has died
+   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., 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.event;
+
+import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMIdManager;
+import gnu.classpath.jdwp.id.ThreadId;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * "Notification of a completed thread in the target VM. The notification
+ * is generated by the dying thread before it terminates. Because of this
+ * timing, it is possible for VirtualMachine.allThreads to return this
+ * thread after this event is received.
+ *
+ * <p>Note that this event gives no information about the lifetime of the
+ * thread object. It may or may not be collected soon depending on what
+ * references exist in the target VM." -- JDWP 1.4.2
+ *
+ * @author Keith Seitz  (address@hidden)
+ */
+public class ThreadEndEvent
+  extends Event
+{
+  private Thread _thread;
+
+  /**
+   * Constructs a new <code>ThreadEndEvent</code>
+   *
+   * @param thread  the deceased thread
+   */
+  public ThreadEndEvent (Thread thread)
+  {
+    super (JdwpConstants.EventKind.THREAD_END);
+    _thread = thread;
+  }
+
+  /**
+   * Returns a specific filtering parameter for this event.
+   * Valid types are ThreadId.
+   *
+   * @param type  the type of parameter desired
+   * @returns the desired parameter or <code>null</code>
+   */
+  public Object getParameter (Class type)
+  {
+    if (type == ThreadId.class)
+      return _thread;
+
+    return null;
+  }
+
+  /**
+   * Writes the event to the given stream
+   *
+   * @param outStream  the output stream to write the event to
+   */
+  protected void _writeData (DataOutputStream outStream)
+    throws IOException
+  {
+    VMIdManager idm = VMIdManager.getDefault();
+    ThreadId tid = (ThreadId) idm.getObjectId (_thread);
+    tid.write (outStream);
+  }
+}
+
Index: gnu/classpath/jdwp/event/ThreadStartEvent.java
===================================================================
RCS file: gnu/classpath/jdwp/event/ThreadStartEvent.java
diff -N gnu/classpath/jdwp/event/ThreadStartEvent.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/event/ThreadStartEvent.java      30 Aug 2005 00:49:59 
-0000
@@ -0,0 +1,109 @@
+/* ThreadStartEvent.java -- An event specifying that a new thread
+   has started in the virtual machine
+   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., 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.event;
+
+import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMIdManager;
+import gnu.classpath.jdwp.id.ThreadId;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * "Notification of a new running thread in the target VM. The new
+ * thread can be the result of a call to address@hidden 
java.lang.Thread.start} or
+ * the result of attaching a new thread to the VM though JNI. The
+ * notification is generated by the new thread some time before its
+ * execution starts. Because of this timing, it is possible to receive
+ * other events for the thread before this event is received. (Notably,
+ * Method Entry Events and Method Exit Events might occur during thread
+ * initialization. It is also possible for the VirtualMachine AllThreads
+ * command to return a thread before its thread start event is received.
+ *
+ * <p>Note that this event gives no information about the creation of the
+ * thread object which may have happened much earlier, depending on the
+ * VM being debugged." -- JDWP 1.4.2
+ *
+ * @author Keith Seitz  (address@hidden)
+ */
+public class ThreadStartEvent
+  extends Event
+{
+  private Thread _thread;
+
+  /**
+   * Constructs a new <code>ThreadStartEvent</code>
+   *
+   * @param tid  the thread ID in which event occurred
+   */
+  public ThreadStartEvent (Thread thread) {
+    super (JdwpConstants.EventKind.THREAD_END);
+    _thread = thread;
+  }
+
+  /**
+   * Returns a specific filtering parameter for this event.
+   * Valid types are ThreadId.
+   *
+   * @param type  the type of parameter desired
+   * @returns the desired parameter or <code>null</code>
+   */
+  public Object getParameter (Class type)
+  {
+    if (type == ThreadId.class)
+      return _thread;
+
+    return null;
+  }
+
+  /**
+   * Writes the event to the given stream
+   *
+   * @param outStream  the output stream to write the event to
+   */
+  protected void _writeData (DataOutputStream outStream)
+    throws IOException
+  {
+    VMIdManager idm = VMIdManager.getDefault();
+    ThreadId tid = (ThreadId) idm.getObjectId (_thread);
+    tid.write (outStream);
+  }
+}
Index: gnu/classpath/jdwp/event/VmInitEvent.java
===================================================================
RCS file: gnu/classpath/jdwp/event/VmInitEvent.java
diff -N gnu/classpath/jdwp/event/VmInitEvent.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/event/VmInitEvent.java   30 Aug 2005 00:49:59 -0000
@@ -0,0 +1,94 @@
+/* VmInitEvent.java -- An event specifying that the VM has started
+   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., 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.event;
+
+import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMIdManager;
+import gnu.classpath.jdwp.id.ThreadId;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * "Notification of initialization of a target VM. This event is
+ * received before the main thread is started and before any application
+ * code has been executed." -- JDWP 1.4.2
+ * 
+ * @author Keith Seitz  (address@hidden)
+ */
+public class VmInitEvent
+  extends Event
+{
+  private Thread _initialThread;
+
+  /**
+   * Constructs a <code>VmInitEvent</code> object
+   *
+   * @param thread  the initial thread
+   */
+  public VmInitEvent (Thread thread)
+  {
+    super (JdwpConstants.EventKind.VM_INIT);
+    _initialThread = thread;
+  }
+
+  /**
+   * Returns a specific filtering parameter for this event.
+   * This event has no valid types.
+   *
+   * @param type  the type of parameter desired
+   * @returns the desired parameter or <code>null</code>
+   */
+  public Object getParameter (Class type)
+  {
+    return null;
+  }
+
+  /**
+   * Writes out event-specific data
+   */
+  protected void _writeData (DataOutputStream outStream)
+    throws IOException
+  {
+    VMIdManager idm = VMIdManager.getDefault();
+    ThreadId tid = (ThreadId) idm.getObjectId (_initialThread);
+    tid.write (outStream);
+  }
+}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]