]> gcc.gnu.org Git - gcc.git/commitdiff
* gnu/classpath/jdwp/VMVirtualMachine.java
authorKeith Seitz <keiths@redhat.com>
Mon, 25 Sep 2006 17:08:05 +0000 (17:08 +0000)
committerKeith Seitz <kseitz@gcc.gnu.org>
Mon, 25 Sep 2006 17:08:05 +0000 (17:08 +0000)
        (_jdwp_suspend_counts): New private variable.
        * gnu/classpath/jdwp/natVMVirtualMachine.cc
        (initialize): Initialize _jdwp_suspend_counts.
        (suspendThread): Implement.
        (resumeThread): Implement.
        (getSuspendCount): Implement.

From-SVN: r117196

libjava/ChangeLog
libjava/gnu/classpath/jdwp/VMVirtualMachine.java
libjava/gnu/classpath/jdwp/natVMVirtualMachine.cc

index 843e466106b9b05989d6d3888b9b99954793d134..8c4662d6f55794696529516bf9b1ac0c31409a0a 100644 (file)
@@ -1,3 +1,13 @@
+2006-09-25  Keith Seitz  <keiths@redhat.com>
+
+       * gnu/classpath/jdwp/VMVirtualMachine.java
+       (_jdwp_suspend_counts): New private variable.
+       * gnu/classpath/jdwp/natVMVirtualMachine.cc
+       (initialize): Initialize _jdwp_suspend_counts.
+       (suspendThread): Implement.
+       (resumeThread): Implement.
+       (getSuspendCount): Implement.
+
 2006-09-22  Marco Trudel  <mtrudel@gmx.ch>
 
        * jvmti.cc (_Jv_JVMTI_GetErrorName): Now static.  Marked JNICALL.
index 6da1d1d631efd3f0241db2e17ccb87a71f5fa872..5c4018fce131bfd43bd7b2a6140c63476e51a4ff 100644 (file)
@@ -48,6 +48,7 @@ import gnu.classpath.jdwp.util.MethodResult;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Hashtable;
 import java.util.Iterator;
 
 /**
@@ -57,6 +58,9 @@ import java.util.Iterator;
  */
 public class VMVirtualMachine
 {
+  // Thread suspension table. Maps Thread to suspend count (Integer)
+  private static Hashtable _jdwp_suspend_counts;
+
   public static native void initialize ();
 
   /**
index b475c49931d67fab23f931d106bed70d53260e20..5e790b96534f30a8f4aebe4d6179a4ab0e8682d4 100644 (file)
@@ -15,15 +15,20 @@ details. */
 
 #include <java/lang/Class.h>
 #include <java/lang/ClassLoader.h>
+#include <java/lang/Integer.h>
+#include <java/lang/String.h>
+#include <java/lang/StringBuffer.h>
 #include <java/lang/Thread.h>
 #include <java/nio/ByteBuffer.h>
 #include <java/util/ArrayList.h>
+#include <java/util/Hashtable.h>
 #include <java/util/Iterator.h>
 
 #include <gnu/classpath/jdwp/VMFrame.h>
 #include <gnu/classpath/jdwp/VMMethod.h>
 #include <gnu/classpath/jdwp/VMVirtualMachine.h>
 #include <gnu/classpath/jdwp/event/EventRequest.h>
+#include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h>
 #include <gnu/classpath/jdwp/util/MethodResult.h>
 
 using namespace java::lang;
@@ -36,6 +41,7 @@ static jvmtiEnv *_jdwp_jvmtiEnv;
 void
 gnu::classpath::jdwp::VMVirtualMachine::initialize ()
 {
+  _jdwp_suspend_counts = new ::java::util::Hashtable ();
   JavaVM *vm = _Jv_GetJavaVM ();
   vm->GetEnv (reinterpret_cast<void **> (&_jdwp_jvmtiEnv), JVMTI_VERSION_1_0);
 }
@@ -43,17 +49,106 @@ gnu::classpath::jdwp::VMVirtualMachine::initialize ()
 void
 gnu::classpath::jdwp::VMVirtualMachine ::suspendThread (Thread *thread)
 {
+  jint value;
+  Integer *count;
+  {
+    JvSynchronize dummy (_jdwp_suspend_counts);
+    count = reinterpret_cast<Integer *> (_jdwp_suspend_counts->get (thread));
+    if (count == NULL)
+      {
+       // New -- suspend thread
+       value = 0;
+      }
+    else
+      {
+       // Thread already suspended
+       value = count->intValue ();
+      }
+
+    count = Integer::valueOf (++value);
+    _jdwp_suspend_counts->put (thread, count);
+  }
+
+  if (value == 1)
+    {
+      // Suspend the thread
+      jvmtiError err = _jdwp_jvmtiEnv->SuspendThread (thread);
+      if (err != JVMTI_ERROR_NONE)
+       {
+         using namespace gnu::classpath::jdwp::exception;
+         char *reason;
+         _jdwp_jvmtiEnv->GetErrorName (err, &reason);
+         ::java::lang::String *txt
+             = JvNewStringLatin1 ("could not suspend thread: ");
+         ::java::lang::StringBuffer *msg
+             = new ::java::lang::StringBuffer (txt);
+         msg->append (JvNewStringLatin1 (reason));
+         _jdwp_jvmtiEnv->Deallocate ((unsigned char *) reason);
+         throw new JdwpInternalErrorException (msg->toString ());
+       }
+    }
 }
 
 void
 gnu::classpath::jdwp::VMVirtualMachine::resumeThread (Thread *thread)
 {
+  jint value;
+  {
+    JvSynchronize dummy (_jdwp_suspend_counts);
+    Integer *count
+      = reinterpret_cast<Integer *> (_jdwp_suspend_counts->get (thread));
+    if (count == NULL)
+      {
+       // Thread not suspended: ThreadReference.Resume says to ignore it.
+       return;
+      }
+    else
+      {
+       // Decrement suspend count
+       value = count->intValue () - 1;
+      }
+
+    if (value == 0)
+      {
+       // Thread will be resumed, remove from table
+       _jdwp_suspend_counts->remove (thread);
+      }
+    else
+      {
+       // Thread stays suspended: record new suspend count
+       count = Integer::valueOf (value);
+       _jdwp_suspend_counts->put (thread, count);
+      }
+  }
+
+  if (value == 0)
+    {
+      jvmtiError err = _jdwp_jvmtiEnv->ResumeThread (thread);
+      if (err != JVMTI_ERROR_NONE)
+       {
+         using namespace gnu::classpath::jdwp::exception;
+         char *reason;
+         _jdwp_jvmtiEnv->GetErrorName (err, &reason);
+         ::java::lang::String *txt 
+             = JvNewStringLatin1 ("could not resume thread: ");
+         ::java::lang::StringBuffer *msg
+             = new ::java::lang::StringBuffer (txt);
+         msg->append (JvNewStringLatin1 (reason));
+         _jdwp_jvmtiEnv->Deallocate ((unsigned char *) reason);
+         throw new JdwpInternalErrorException (msg->toString ());
+       }
+    }
 }
 
 jint
 gnu::classpath::jdwp::VMVirtualMachine::getSuspendCount (Thread *thread)
 {
-  return 0;
+  jint suspensions = 0;
+  Integer *count
+    = reinterpret_cast<Integer *> (_jdwp_suspend_counts->get (thread));
+  if (count != NULL)
+    suspensions = count->intValue ();
+  return suspensions;
 }
 
 void
This page took 0.08175 seconds and 5 git commands to generate.