Revision: 5826
          http://jnode.svn.sourceforge.net/jnode/?rev=5826&view=rev
Author:   lsantha
Date:     2011-06-25 21:07:57 +0000 (Sat, 25 Jun 2011)

Log Message:
-----------
Improved remote debugging. Now standard Java debuggers can connect to JNode.

Modified Paths:
--------------
    
trunk/core/src/classpath/ext/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
    trunk/core/src/classpath/vm/gnu/classpath/jdwp/NativeVMVirtualMachine.java
    
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/NativeTransportFactory.java

Added Paths:
-----------
    
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/JNodeSocketTransport.java
    trunk/core/src/emu/gnu/
    trunk/core/src/emu/gnu/classpath/
    trunk/core/src/emu/gnu/classpath/jdwp/
    trunk/core/src/emu/gnu/classpath/jdwp/EmuVirtualMachine.java
    trunk/core/src/emu/gnu/classpath/jdwp/Main.java

Removed Paths:
-------------
    trunk/core/src/classpath/vm/gnu/classpath/jdwp/JNodeSocketTransport.java

Modified: 
trunk/core/src/classpath/ext/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
===================================================================
--- 
trunk/core/src/classpath/ext/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
     2011-06-24 08:53:44 UTC (rev 5825)
+++ 
trunk/core/src/classpath/ext/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
     2011-06-25 21:07:57 UTC (rev 5826)
@@ -273,7 +273,7 @@
     ThreadGroup root = getRootThreadGroup(jdwpGroup);
 
     os.writeInt(1); // Just one top level group allowed?
-    idMan.getObjectId(root);
+    idMan.getObjectId(root).write(os);
   }
 
   private void executeDispose(ByteBuffer bb, DataOutputStream os)

Deleted: 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/JNodeSocketTransport.java
===================================================================
--- trunk/core/src/classpath/vm/gnu/classpath/jdwp/JNodeSocketTransport.java    
2011-06-24 08:53:44 UTC (rev 5825)
+++ trunk/core/src/classpath/vm/gnu/classpath/jdwp/JNodeSocketTransport.java    
2011-06-25 21:07:57 UTC (rev 5826)
@@ -1,166 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2003-2010 JNode.org
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This library 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 Lesser General Public 
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; If not, write to the Free Software Foundation, 
Inc., 
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- 
-package gnu.classpath.jdwp;
-
-import java.net.Socket;
-import java.net.ServerSocket;
-import java.util.HashMap;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import javax.net.ServerSocketFactory;
-import javax.net.SocketFactory;
-import gnu.classpath.jdwp.transport.ITransport;
-import gnu.classpath.jdwp.transport.TransportException;
-
-/**
- *
- */
-public class JNodeSocketTransport implements ITransport {
-
-    /**
-     * Name of this transport
-     */
-    public static final String NAME = "dt_socket";
-
-    // Configure properties
-    private static final String _PROPERTY_ADDRESS = "address";
-    private static final String _PROPERTY_SERVER = "server";
-
-    // Port number
-    private int port;
-
-    // Host name
-    private String host;
-
-    // Are we acting as a server?
-    private boolean server = false;
-
-    // Socket
-    private Socket socket;
-
-    /**
-     * Setup the connection configuration from the given properties
-     *
-     * @param properties the properties of the JDWP session
-     * @throws gnu.classpath.jdwp.transport.TransportException for any 
configury errors
-     */
-    public void configure (HashMap properties) throws TransportException {
-        // Get address [form: "hostname:port"]
-        String p = (String) properties.get(_PROPERTY_ADDRESS);
-        if (p != null) {
-            String[] s = p.split(":");
-            if (s.length == 2) {
-                host = s[0];
-                port = Integer.parseInt(s[1]);
-                // @classpath-bugfix Michael Klaus (michael.kl...@gmx.net)
-            } else if (s.length == 1) {
-                port = Integer.parseInt(s[0]);
-                // @classpath-bugfix-end
-            }
-        }
-
-        // Get server [form: "y" or "n"]
-        p = (String) properties.get(_PROPERTY_SERVER);
-        if (p != null) {
-            if (p.toLowerCase().equals("y"))
-                server = true;
-        }
-    }
-
-    public static class ServerSocketHolder {
-        private static ServerSocket ss;
-        public static void close(){
-            if(ss != null){
-                try {
-                    ss.close();
-                } catch (Exception e){
-
-                } finally {
-                    ss = null;
-                }
-            }
-        }
-
-        static Socket getSocket(int port, int backlog) throws IOException{
-            if(ss == null){
-                ServerSocketFactory ssf = ServerSocketFactory.getDefault();
-                ss = ssf.createServerSocket(port, backlog);
-            }
-            return ss.accept();
-        }
-    }
-    
-    /**
-     * Initialize this socket connection. This includes
-     * connecting to the host (or listening for it).
-     *
-     * @throws TransportException if a transport-related error occurs
-     */
-    public void initialize () throws TransportException {
-        try {
-            if (server) {
-                // Get a server socket
-                socket = ServerSocketHolder.getSocket(port, 1);
-            } else {
-                // Get a client socket (the factory will connect it)
-                SocketFactory sf = SocketFactory.getDefault();
-                socket = sf.createSocket(host, port);
-            }
-        }
-        catch (IOException ioe) {
-            // This will grab UnknownHostException, too.
-            throw new TransportException(ioe);
-        }
-    }
-
-    /**
-     * Shutdown the socket. This could cause SocketExceptions
-     * for anyone blocked on socket i/o
-     */
-    public void shutdown () {
-        try {
-            socket.close();
-        } catch (Throwable t) {
-            // We don't really care about errors at this point
-        }
-    }
-
-    /**
-     * Returns an <code>InputStream</code> for the transport
-     *
-     * @throws IOException if an I/O error occurs creating the stream
-     *                     or the socket is not connected
-     */
-    public InputStream getInputStream () throws IOException {
-        return socket.getInputStream();
-    }
-
-    /**
-     * Returns an <code>OutputStream</code> for the transport
-     *
-     * @throws IOException if an I/O error occurs creating the stream
-     *                     or the socket is not connected
-     */
-    public OutputStream getOutputStream () throws IOException {
-        return socket.getOutputStream();
-    }
-}

Modified: 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/NativeVMVirtualMachine.java
===================================================================
--- trunk/core/src/classpath/vm/gnu/classpath/jdwp/NativeVMVirtualMachine.java  
2011-06-24 08:53:44 UTC (rev 5825)
+++ trunk/core/src/classpath/vm/gnu/classpath/jdwp/NativeVMVirtualMachine.java  
2011-06-25 21:07:57 UTC (rev 5826)
@@ -27,6 +27,7 @@
 import gnu.classpath.jdwp.util.MethodResult;
 import gnu.classpath.jdwp.event.EventRequest;
 
+import org.jnode.annotation.NoInline;
 import org.jnode.vm.facade.VmUtils;
 import org.jnode.vm.isolate.VmIsolate;
 import org.jnode.vm.classmgr.VmIsolatedStatics;
@@ -41,23 +42,34 @@
  * @author Levente S\u00e1ntha
  */
 class NativeVMVirtualMachine {
+    @NoInline
+//    public static boolean debug() {
+//        return true;
+//    }
+
     /**
      * @see gnu.classpath.jdwp.VMVirtualMachine#suspendThread(java.lang.Thread)
      */
     private static void suspendThread(Thread arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.suspendThread()");
     }
     /**
      * @see gnu.classpath.jdwp.VMVirtualMachine#resumeThread(java.lang.Thread)
      */
     private static void resumeThread(Thread arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.resumeThread()");
     }
     /**
      * @see 
gnu.classpath.jdwp.VMVirtualMachine#getSuspendCount(java.lang.Thread)
      */
     private static int getSuspendCount(Thread arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getSuspendCount()");
         return 0;
     }
     /**
@@ -65,12 +77,16 @@
      */
     private static int getAllLoadedClassesCount() {
         //todo implement it
+//        if(debug())
+            
System.out.println("NativeVMVirtualMachine.getAllLoadedClassesCount()");
         return 0;
     }
     /**
      * @see gnu.classpath.jdwp.VMVirtualMachine#getAllLoadedClasses()
      */
     private static Iterator getAllLoadedClasses() {
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getAllLoadedClasses()");
         return new Iterator() {
             private VmStaticsIterator iter = new 
VmStaticsIterator(VmUtils.getVm().getSharedStatics());
             private Iterator<VmIsolatedStatics> isolated = 
VmIsolate.staticsIterator();
@@ -102,6 +118,8 @@
      */
     private static int getClassStatus(Class arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getClassStatus()");
         return 0;
     }
     /**
@@ -109,6 +127,8 @@
      */
     private static VMMethod[] getAllClassMethods(Class arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getAllClassMethods()");
         return null;
     }
     /**
@@ -116,6 +136,8 @@
      */
     private static VMMethod getClassMethod(Class arg1, long arg2) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getClassMethod()");
         return null;
     }
     /**
@@ -123,6 +145,8 @@
      */
     private static ArrayList getFrames(Thread arg1, int arg2, int arg3) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getFrame()");
         return null;
     }
     /**
@@ -130,6 +154,8 @@
      */
     private static VMFrame getFrame(Thread arg1, ByteBuffer arg2) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getFrame()");
         return null;
     }
     /**
@@ -137,6 +163,8 @@
      */
     private static int getFrameCount(Thread arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getFrameCount()");
         return 0;
     }
     /**
@@ -144,6 +172,8 @@
      */
     private static int getThreadStatus(Thread arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getThreadStatus()");
         return 0;
     }
     /**
@@ -151,6 +181,8 @@
      */
     private static ArrayList getLoadRequests(ClassLoader arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getLoadRequest()");
         return null;
     }
     /**
@@ -158,6 +190,8 @@
      */
     private static MethodResult executeMethod(Object arg1, Thread arg2, Class 
arg3, Method arg4, Object[] arg5, boolean arg6) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.executeMethod()");
         return null;
     }
     /**
@@ -165,6 +199,8 @@
      */
     private static String getSourceFile(Class arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.getSourceFile()");
         return null;
     }
     /**
@@ -172,21 +208,30 @@
      */
     private static void registerEvent(EventRequest arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.registerEvent() " + 
arg1.getId() + " " + arg1.getEventKind() +
+                " " + arg1.getSuspendPolicy() +  " " + arg1.getFilters());
     }
     /**
      * @see 
gnu.classpath.jdwp.VMVirtualMachine#unregisterEvent(gnu.classpath.jdwp.event.EventRequest)
      */
     private static void unregisterEvent(EventRequest arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.unregisterEvent()");
     }
     /**
      * @see gnu.classpath.jdwp.VMVirtualMachine#clearEvents(byte)
      */
     private static void clearEvents(byte arg1) {
         //todo implement it
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.clearEvents()");
     }
 
     public static void redefineClass(Class oldClass, byte[] classData){
+//        if(debug())
+            System.out.println("NativeVMVirtualMachine.redefineClass()");
         VmType old_type = VmType.fromClass(oldClass);
         VmType new_type = ClassDecoder.defineClass(oldClass.getName(),
                 ByteBuffer.wrap(classData), false,

Copied: 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/JNodeSocketTransport.java
 (from rev 5819, 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/JNodeSocketTransport.java)
===================================================================
--- 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/JNodeSocketTransport.java
                          (rev 0)
+++ 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/JNodeSocketTransport.java
  2011-06-25 21:07:57 UTC (rev 5826)
@@ -0,0 +1,166 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003-2010 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library 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 Lesser General Public 
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc., 
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+package gnu.classpath.jdwp.transport;
+
+import java.net.Socket;
+import java.net.ServerSocket;
+import java.util.HashMap;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
+import gnu.classpath.jdwp.transport.ITransport;
+import gnu.classpath.jdwp.transport.TransportException;
+
+/**
+ *
+ */
+public class JNodeSocketTransport implements ITransport {
+
+    /**
+     * Name of this transport
+     */
+    public static final String NAME = "dt_socket";
+
+    // Configure properties
+    private static final String _PROPERTY_ADDRESS = "address";
+    private static final String _PROPERTY_SERVER = "server";
+
+    // Port number
+    private int port;
+
+    // Host name
+    private String host;
+
+    // Are we acting as a server?
+    private boolean server = false;
+
+    // Socket
+    private Socket socket;
+
+    /**
+     * Setup the connection configuration from the given properties
+     *
+     * @param properties the properties of the JDWP session
+     * @throws gnu.classpath.jdwp.transport.TransportException for any 
configury errors
+     */
+    public void configure (HashMap properties) throws TransportException {
+        // Get address [form: "hostname:port"]
+        String p = (String) properties.get(_PROPERTY_ADDRESS);
+        if (p != null) {
+            String[] s = p.split(":");
+            if (s.length == 2) {
+                host = s[0];
+                port = Integer.parseInt(s[1]);
+                // @classpath-bugfix Michael Klaus (michael.kl...@gmx.net)
+            } else if (s.length == 1) {
+                port = Integer.parseInt(s[0]);
+                // @classpath-bugfix-end
+            }
+        }
+
+        // Get server [form: "y" or "n"]
+        p = (String) properties.get(_PROPERTY_SERVER);
+        if (p != null) {
+            if (p.toLowerCase().equals("y"))
+                server = true;
+        }
+    }
+
+    public static class ServerSocketHolder {
+        private static ServerSocket ss;
+        public static void close(){
+            if(ss != null){
+                try {
+                    ss.close();
+                } catch (Exception e){
+
+                } finally {
+                    ss = null;
+                }
+            }
+        }
+
+        static Socket getSocket(int port, int backlog) throws IOException{
+            if(ss == null){
+                ServerSocketFactory ssf = ServerSocketFactory.getDefault();
+                ss = ssf.createServerSocket(port, backlog);
+            }
+            return ss.accept();
+        }
+    }
+    
+    /**
+     * Initialize this socket connection. This includes
+     * connecting to the host (or listening for it).
+     *
+     * @throws TransportException if a transport-related error occurs
+     */
+    public void initialize () throws TransportException {
+        try {
+            if (server) {
+                // Get a server socket
+                socket = ServerSocketHolder.getSocket(port, 1);
+            } else {
+                // Get a client socket (the factory will connect it)
+                SocketFactory sf = SocketFactory.getDefault();
+                socket = sf.createSocket(host, port);
+            }
+        }
+        catch (IOException ioe) {
+            // This will grab UnknownHostException, too.
+            throw new TransportException(ioe);
+        }
+    }
+
+    /**
+     * Shutdown the socket. This could cause SocketExceptions
+     * for anyone blocked on socket i/o
+     */
+    public void shutdown () {
+        try {
+            socket.close();
+        } catch (Throwable t) {
+            // We don't really care about errors at this point
+        }
+    }
+
+    /**
+     * Returns an <code>InputStream</code> for the transport
+     *
+     * @throws IOException if an I/O error occurs creating the stream
+     *                     or the socket is not connected
+     */
+    public InputStream getInputStream () throws IOException {
+        return socket.getInputStream();
+    }
+
+    /**
+     * Returns an <code>OutputStream</code> for the transport
+     *
+     * @throws IOException if an I/O error occurs creating the stream
+     *                     or the socket is not connected
+     */
+    public OutputStream getOutputStream () throws IOException {
+        return socket.getOutputStream();
+    }
+}

Modified: 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/NativeTransportFactory.java
===================================================================
--- 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/NativeTransportFactory.java
        2011-06-24 08:53:44 UTC (rev 5825)
+++ 
trunk/core/src/classpath/vm/gnu/classpath/jdwp/transport/NativeTransportFactory.java
        2011-06-25 21:07:57 UTC (rev 5826)
@@ -20,8 +20,6 @@
  
 package gnu.classpath.jdwp.transport;
 
-import gnu.classpath.jdwp.JNodeSocketTransport;
-
 /**
  *
  */

Copied: trunk/core/src/emu/gnu/classpath/jdwp/EmuVirtualMachine.java (from rev 
5819, trunk/core/src/classpath/ext/gnu/classpath/jdwp/VMVirtualMachine.java)
===================================================================
--- trunk/core/src/emu/gnu/classpath/jdwp/EmuVirtualMachine.java                
                (rev 0)
+++ trunk/core/src/emu/gnu/classpath/jdwp/EmuVirtualMachine.java        
2011-06-25 21:07:57 UTC (rev 5826)
@@ -0,0 +1,404 @@
+/* VMVirtualMachine.java -- A reference implementation of a JDWP virtual
+   machine
+
+   Copyright (C) 2005, 2006 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.event.ClassPrepareEvent;
+import gnu.classpath.jdwp.event.EventRequest;
+import gnu.classpath.jdwp.event.VmInitEvent;
+import gnu.classpath.jdwp.exception.JdwpException;
+import gnu.classpath.jdwp.util.MethodResult;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * A virtual machine according to JDWP.
+ *
+ * @author Keith Seitz  <kei...@redhat.com>
+ */
+public class EmuVirtualMachine
+{
+  /**
+   * Suspend a thread
+   *
+   * @param  thread  the thread to suspend
+   */
+  public static void suspendThread (Thread thread)
+    throws JdwpException{
+      System.out.println("suspendThread");
+  }
+
+  /**
+   * Suspend all threads
+   */
+  public static void suspendAllThreads ()
+    throws JdwpException
+  {
+    // Our JDWP thread group -- don't suspend any of those threads
+    Thread current = Thread.currentThread ();
+    ThreadGroup jdwpGroup = current.getThreadGroup ();
+
+    // Find the root ThreadGroup
+    ThreadGroup group = jdwpGroup;
+    ThreadGroup parent = group.getParent ();
+    while (parent != null)
+      {
+       group = parent;
+       parent = group.getParent ();
+      }
+
+    // Get all the threads in the system
+    int num = group.activeCount ();
+    Thread[] threads = new Thread[num];
+    group.enumerate (threads);
+
+    for (int i = 0; i < num; ++i)
+      {
+       Thread t = threads[i];
+       if (t != null)
+         {
+           if (t.getThreadGroup () == jdwpGroup || t == current)
+             {
+               // Don't suspend the current thread or any JDWP thread
+               continue;
+             }
+           else
+             suspendThread (t);
+         }
+      }
+
+    // Now suspend the current thread
+    suspendThread (current);
+  }
+
+  /**
+   * Resume a thread. A thread must be resumed as many times
+   * as it has been suspended.
+   *
+   * @param  thread  the thread to resume
+   */
+  public static void resumeThread (Thread thread)
+    throws JdwpException {
+      System.out.println("resumeThread");
+  }
+
+  /**
+   * Resume all threads. This simply decrements the thread's
+   * suspend count. It can not be used to force the application
+   * to run.
+   */
+  public static void resumeAllThreads ()
+    throws JdwpException
+  {
+    // Our JDWP thread group -- don't resume
+    Thread current = Thread.currentThread ();
+    ThreadGroup jdwpGroup = current.getThreadGroup ();
+
+    // Find the root ThreadGroup
+    ThreadGroup group = jdwpGroup;
+    ThreadGroup parent = group.getParent ();
+    while (parent != null)
+      {
+       group = parent;
+       parent = group.getParent ();
+      }
+
+    // Get all the threads in the system
+    int num = group.activeCount ();
+    Thread[] threads = new Thread[num];
+    group.enumerate (threads);
+
+    for (int i = 0; i < num; ++i)
+      {
+       Thread t = threads[i];
+       if (t != null)
+         {
+           if (t.getThreadGroup () == jdwpGroup || t == current)
+             {
+               // Don't resume the current thread or any JDWP thread
+               continue;
+             }
+           else
+             resumeThread (t);
+         }
+      }
+  }
+
+  /**
+   * Get the suspend count for a give thread
+   *
+   * @param  thread  the thread whose suspend count is desired
+   * @return the number of times the thread has been suspended
+   */
+  public static int getSuspendCount (Thread thread)
+    throws JdwpException {
+      System.out.println("getSuspendCount");
+      return 0;
+  }
+
+  /**
+   * Returns a count of the number of loaded classes in the VM
+   */
+  public static int getAllLoadedClassesCount ()
+    throws JdwpException {
+      System.out.println("getAllLoadedClassesCount");
+      return 0;
+  }
+
+  /**
+   * Returns an iterator over all the loaded classes in the VM
+   */
+  public static Iterator getAllLoadedClasses ()
+    throws JdwpException {
+      System.out.println("getAllLoadedClasses");
+     ArrayList a = new ArrayList();
+      a.add(String.class);
+      a.add(Object.class);
+      a.add(Integer.class);
+      a.add(EmuVirtualMachine.class);
+      return a.iterator();
+  }
+
+  /**
+   * Returns the status of the given class
+   *
+   * @param  clazz  the class whose status is desired
+   * @return a flag containing the class's status
+   * @see gnu.classpath.jdwp.JdwpConstants.ClassStatus
+   */
+  public static int getClassStatus (Class clazz)
+    throws JdwpException {
+      System.out.println("getClassStatus");
+      return 0;
+  }
+
+  /**
+   * Returns all of the methods defined in the given class. This
+   * includes all methods, constructors, and class initializers.
+   *
+   * @param  klass  the class whose methods are desired
+   * @return an array of virtual machine methods
+   */
+  public static VMMethod[] getAllClassMethods (Class klass)
+    throws JdwpException {
+      System.out.println("getAllClassMethods");
+      return new VMMethod[0];
+  }
+
+  /**
+   * A factory method for getting valid virtual machine methods
+   * which may be passed to/from the debugger.
+   *
+   * @param klass the class in which the method is defined
+   * @param id    the ID of the desired method
+   * @return the desired internal representation of the method
+   * @throws gnu.classpath.jdwp.exception.InvalidMethodException if the method 
is not defined
+   *           in the class
+   * @throws gnu.classpath.jdwp.exception.JdwpException for any other error
+   */
+  public static VMMethod getClassMethod(Class klass, long id)
+    throws JdwpException {
+      System.out.println("getClassMethod");
+      return null;
+  }
+
+  /**
+   * Returns the thread's call stack
+   *
+   * @param  thread  thread for which to get call stack
+   * @param  start   index of first frame to return
+   * @param  length  number of frames to return (-1 for all frames)
+   * @return a list of frames
+   */
+  public static ArrayList getFrames (Thread thread, int start,
+                                           int length)
+    throws JdwpException {
+      System.out.println("getFrames");
+      return new ArrayList();
+  }
+
+  /**
+   * Returns the frame for a given thread with the frame ID in
+   * the buffer
+   *
+   * I don't like this.
+   *
+   * @param  thread  the frame's thread
+   * @param  bb      buffer containing the frame's ID
+   * @return the desired frame
+   */
+  public static VMFrame getFrame (Thread thread, ByteBuffer bb)
+    throws JdwpException {
+      System.out.println("getFrame");
+      return null;
+  }
+
+  /**
+   * Returns the number of frames in the thread's stack
+   *
+   * @param  thread  the thread for which to get a frame count
+   * @return the number of frames in the thread's stack
+   */
+  public static int getFrameCount (Thread thread)
+    throws JdwpException {
+      System.out.println("getFrameCount");
+      return 0;
+  }
+
+
+  /**
+   * Returns the status of a thread
+   *
+   * @param  thread  the thread for which to get status
+   * @return integer status of the thread
+   * @see gnu.classpath.jdwp.JdwpConstants.ThreadStatus
+   */
+  public static int getThreadStatus (Thread thread)
+    throws JdwpException {
+      System.out.println("getThreadStatus");
+      return 0;
+  }
+
+  /**
+   * Returns a list of all classes which this class loader has been
+   * requested to load
+   *
+   * @param  cl  the class loader
+   * @return a list of all visible classes
+   */
+  public static ArrayList getLoadRequests (ClassLoader cl)
+    throws JdwpException {
+      System.out.println("getLoadRequests");
+      return new ArrayList();
+  }
+
+  /**
+   * Executes a method in the virtual machine
+   *
+   * @param  obj         instance in which to invoke method (null for static)
+   * @param  thread      the thread in which to invoke the method
+   * @param  clazz       the class in which the method is defined
+   * @param  method      the method to invoke
+   * @param  values      arguments to pass to method
+   * @param  nonVirtual  "otherwise, normal virtual invoke
+   *                     (instance methods only) "
+   * @return a result object containing the results of the invocation
+   */
+  public static MethodResult executeMethod (Object obj, Thread thread,
+                                           Class clazz, Method method,
+                                           Object[] values,
+                                           boolean nonVirtual)
+    throws JdwpException {
+      System.out.println("executeMethod");
+      return null;
+  }
+
+  /**
+   * "Returns the name of source file in which a reference type was declared"
+   *
+   * @param  clazz  the class for which to return a source file
+   * @return a string containing the source file name; "no path information
+   *         for the file is included"
+   */
+  public static String getSourceFile (Class clazz)
+    throws JdwpException {
+      System.out.println("getSourceFile");
+      return null;
+  }
+
+  /**
+   * Register a request from the debugger
+   *
+   * Virtual machines have two options. Either do nothing and allow
+   * the event manager to take care of the request (useful for broadcast-type
+   * events like class prepare/load/unload, thread start/end, etc.)
+   * or do some internal work to set up the event notification (useful for
+   * execution-related events like breakpoints, single-stepping, etc.).
+   */
+  public static void registerEvent (EventRequest request)
+    throws JdwpException {
+      System.out.println("registerEvent " + request.getId() + " " + 
request.getEventKind() + " " +
+          request.getSuspendPolicy() + " " + request.getFilters());
+
+      if(request.getEventKind() == JdwpConstants.EventKind.VM_INIT) {
+          new Thread(){
+              @Override
+              public void run() {
+                  try {
+                    Thread.sleep(1000);
+                    Jdwp.notify(new VmInitEvent(Thread.currentThread()));
+                    Jdwp.notify(new ClassPrepareEvent(Thread.currentThread(), 
Class.class, 0));
+                  } catch (InterruptedException ie) {
+                      ie.printStackTrace();
+                  }
+              }
+          }.start();
+      }
+  }
+
+  /**
+   * Unregisters the given request
+   *
+   * @param  request  the request to unregister
+   */
+  public static void unregisterEvent (EventRequest request)
+    throws JdwpException {
+      System.out.println("unregisterEvent");
+
+  }
+
+
+  /**
+   * Clear all events of the given kind
+   *
+   * @param  kind  the type of events to clear
+   */
+  public static void clearEvents (byte kind)
+    throws JdwpException {
+      System.out.println("clearEvents");
+  }
+
+  public static void redefineClass(Class old_class, byte[] classData) {
+      System.out.println("redefineClass");
+  }
+}

Added: trunk/core/src/emu/gnu/classpath/jdwp/Main.java
===================================================================
--- trunk/core/src/emu/gnu/classpath/jdwp/Main.java                             
(rev 0)
+++ trunk/core/src/emu/gnu/classpath/jdwp/Main.java     2011-06-25 21:07:57 UTC 
(rev 5826)
@@ -0,0 +1,59 @@
+package gnu.classpath.jdwp;
+
+import gnu.classpath.jdwp.transport.JNodeSocketTransport;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+
+/**
+ * User: lsantha
+ * Date: 6/25/11 5:13 PM
+ */
+public class Main {
+    private static final String str_quit = "Type 'q' to exit";
+
+    private static final int DEFAULT_PORT = 6789;
+
+    private boolean up = true;
+
+    public static void main(String[] args) throws Exception {
+        new Main().execute();
+    }
+
+    public void execute() throws Exception {
+        // FIXME - in the even of internal exceptions, JDWP writes to 
System.out.
+        final String ps = "transport=dt_socket,suspend=n,address=" + 
DEFAULT_PORT + ",server=y";
+        Thread t = new Thread(new Runnable() {
+            public void run() {
+                while (up()) {
+                    Jdwp jdwp = new Jdwp();
+                    jdwp.configure(ps);
+                    jdwp.run();
+                    jdwp.waitToFinish();
+                    jdwp.shutdown();
+                }
+                // workaround for the restricted capabilities of JDWP support 
in GNU Classpath.
+                JNodeSocketTransport.ServerSocketHolder.close();
+            }
+        });
+        t.start();
+
+        Reader in = new InputStreamReader(System.in);
+        PrintWriter out = new PrintWriter(System.out);
+        while (in.read() != 'q') {
+            out.println(str_quit);
+        }
+        // FIXME - this just stops the 'debug' command.  The listener will 
keep running
+        // until the remote debugger disconnects.  We should have a way to 
disconnect at
+        // this end.
+        down();
+    }
+
+    public synchronized boolean up() {
+        return up;
+    }
+
+    public synchronized void down() {
+        up = false;
+    }
+}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a 
definitive record of customers, application performance, security 
threats, fraudulent activity and more. Splunk takes this data and makes 
sense of it. Business sense. IT sense. Common sense.. 
http://p.sf.net/sfu/splunk-d2d-c1
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to