You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by od...@apache.org on 2009/07/16 17:57:41 UTC

svn commit: r794726 [5/15] - in /harmony/enhanced/jdktools/branches/java6/modules/jpda: ./ src/main/native/include/ src/main/native/jdwp/common/agent/commands/ src/main/native/jdwp/common/agent/core/ src/main/native/jdwp/common/generic/ src/main/native...

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.cpp Thu Jul 16 15:57:37 2009
@@ -15,17 +15,14 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Vitaly A. Provodin
- * @version $Revision: 1.16.2.2 $
- */
 #include "ThreadReference.h"
 #include "PacketParser.h"
 #include "ThreadManager.h"
 #include "VirtualMachine.h"
 #include "MemoryManager.h"
 #include "ClassManager.h"
+#include "ExceptionManager.h"
+
 
 using namespace jdwp;
 using namespace ThreadReference;
@@ -33,66 +30,78 @@
 //-----------------------------------------------------------------------------
 //NameHandler------------------------------------------------------------------
 
-void
-ThreadReference::NameHandler::Execute(JNIEnv *jni) throw (AgentException)
+int
+ThreadReference::NameHandler::Execute(JNIEnv *jni) 
 {
     jvmtiThreadInfo info;
     info.name = 0;
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("Name: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Name: received: threadID=%p", thrd));
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
     JvmtiAutoFree destroyer(info.name);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("Name: send: name=" << JDWP_CHECK_NULL(info.name));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Name: send: name=%s", JDWP_CHECK_NULL(info.name)));
     m_cmdParser->reply.WriteString(info.name);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //SuspendHandler----------------------------------------------------------------
 
-void
-ThreadReference::SuspendHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::SuspendHandler::Execute(JNIEnv *jni) 
 {
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
 
-    JDWP_TRACE_DATA("Suspend: suspend: threadID=" << thrd);
-    GetThreadManager().Suspend(jni, thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Suspend: suspend: threadID=%p", thrd));
+    int ret = GetThreadManager().Suspend(jni, thrd);
+
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //ResumeHandler----------------------------------------------------------------
 
-void
-ThreadReference::ResumeHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::ResumeHandler::Execute(JNIEnv *jni) 
 {
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
 
-    JDWP_TRACE_DATA("Resume: resume: threadID=" << thrd);
-    GetThreadManager().Resume(jni, thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Resume: resume: threadID=%p", thrd));
+    int ret = GetThreadManager().Resume(jni, thrd);
+
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //StatusHandler----------------------------------------------------------------
 
-void
-ThreadReference::StatusHandler::Execute(JNIEnv *jni) throw (AgentException)
+int
+ThreadReference::StatusHandler::Execute(JNIEnv *jni) 
 {
     jint thread_state;
 
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("Status: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Status: received: threadID=%p", thrd));
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadState(thrd, &thread_state));
-    JDWP_TRACE_DATA("Status: threadState=" << hex << thread_state);
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadState(thrd, &thread_state));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Status: threadState=%x", thread_state));
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     jint ret_value;
     jint const THREAD_STATE_SLEEPING =
@@ -101,7 +110,7 @@
     if ( (thread_state & THREAD_STATE_SLEEPING) == THREAD_STATE_SLEEPING ) {
         ret_value = JDWP_THREAD_STATUS_SLEEPING;
     } else {
-        switch (thread_state & JVMTI_JAVA_LANG_THREAD_STATE_MASK)
+        switch (thread_state & (JVMTI_JAVA_LANG_THREAD_STATE_MASK))
         {
         case JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED:
             ret_value = JDWP_THREAD_STATUS_ZOMBIE;
@@ -117,9 +126,10 @@
             ret_value = JDWP_THREAD_STATUS_WAIT;
             break;
         default:
-            JDWP_TRACE_DATA("Status: bad Java thread state: " 
-                << hex << thread_state);
-            throw InternalErrorException();
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Status: bad Java thread state: %x", thread_state));
+            AgentException e(JDWP_ERROR_INTERNAL);
+			JDWP_SET_EXCEPTION(e);
+            return JDWP_ERROR_INTERNAL;
         }
     }
     m_cmdParser->reply.WriteInt(ret_value);
@@ -127,77 +137,91 @@
         m_cmdParser->reply.WriteInt(JDWP_SUSPEND_STATUS_SUSPENDED);
     else
         m_cmdParser->reply.WriteInt(0);
-    JDWP_TRACE_DATA("Status: send: status=" << ret_value);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Status: send: status=%d", ret_value));
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //ThreadGroupHandler-----------------------------------------------------------
 
-void 
-ThreadReference::ThreadGroupHandler::Execute(JNIEnv *jni) throw(AgentException)
+int 
+ThreadReference::ThreadGroupHandler::Execute(JNIEnv *jni) 
 {
     jvmtiThreadInfo info;
     info.name = 0;
 
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("ThreadGroup: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ThreadGroup: received: threadID=%p", thrd));
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
     JvmtiAutoFree destroyer(info.name);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("ThreadGroup: send: threadGroupID=" << info.thread_group);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ThreadGroup: send: threadGroupID=%p", info.thread_group));
     m_cmdParser->reply.WriteThreadGroupID(jni, info.thread_group);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //FramesHandler----------------------------------------------------------------
 
-void
-ThreadReference::FramesHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::FramesHandler::Execute(JNIEnv *jni)
 {
     jvmtiEnv *jvmti = GetJvmtiEnv();
 
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
     
-    if (!GetThreadManager().IsSuspended(thrd))
-        throw AgentException(JVMTI_ERROR_THREAD_NOT_SUSPENDED);
+    if (!GetThreadManager().IsSuspended(thrd)){
+        AgentException e(JVMTI_ERROR_THREAD_NOT_SUSPENDED);
+		JDWP_SET_EXCEPTION(e);
+        return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
+    }
     
     jint startFrame = m_cmdParser->command.ReadInt();
     jint length = m_cmdParser->command.ReadInt();
-    JDWP_TRACE_DATA("Frames: received: threadID=" << thrd 
-        << ", startFrame=" << startFrame 
-        << ", length=" << length);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Frames: received: threadID=%p, startFrame=%d, length=%d", thrd, startFrame, length));
 
     jint frameCount;
     jvmtiError err;
-    JVMTI_TRACE(err, jvmti->GetFrameCount(thrd, &frameCount));
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetFrameCount(thrd, &frameCount));
 
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     if (length == -1) {
         length = frameCount - startFrame;
     }
 
     if (length == 0) {
-        JDWP_TRACE_DATA("Frames: frameCount=" << frameCount 
-            << ", startFrame=" << startFrame 
-            << ", length=" << length);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Frames: frameCount=%d, startFrame=%d, length=%d", frameCount, startFrame, length));
         m_cmdParser->reply.WriteInt(0);
-        return;
+        return JDWP_ERROR_NONE;
     }
 
-    if (startFrame >= frameCount || startFrame < 0)
-        throw AgentException(JDWP_ERROR_INVALID_INDEX);
+    if (startFrame >= frameCount || startFrame < 0){
+        AgentException e(JDWP_ERROR_INVALID_INDEX);
+		JDWP_SET_EXCEPTION(e);
+        return JDWP_ERROR_INVALID_INDEX;
+    }
 
     jint maxFrame = startFrame + length;
     if ( (length < 0) || (maxFrame > frameCount) ) {
-        throw AgentException(JDWP_ERROR_INVALID_LENGTH);
+        AgentException e(JDWP_ERROR_INVALID_LENGTH);
+		JDWP_SET_EXCEPTION(e);
+        return JDWP_ERROR_INVALID_LENGTH;
     }
 
     jvmtiFrameInfo *frame_buffer = 
@@ -206,19 +230,18 @@
     AgentAutoFree destroyer(frame_buffer JDWP_FILE_LINE);
 
     jint count;
-    JVMTI_TRACE(err, jvmti->GetStackTrace(thrd, 0, frameCount, 
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetStackTrace(thrd, 0, frameCount, 
                                                  frame_buffer, &count));
     if (err != JVMTI_ERROR_NONE) {
-        throw AgentException(err);
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
     }
     JDWP_ASSERT(count == frameCount);
 
     m_cmdParser->reply.WriteInt(length);
 
-    JDWP_TRACE_DATA("Frames: frameCount=" << frameCount 
-        << ", startFrame=" << startFrame 
-        << ", length=" << length 
-        << ", maxFrame=" << maxFrame);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Frames: frameCount=%d, startFrame=%d, length=%d, maxFrame=%d", frameCount, startFrame, length, maxFrame));
 
     jclass declaring_class;
     jdwpTypeTag typeTag;
@@ -226,10 +249,12 @@
     for (jint j = startFrame; j < maxFrame; j++) {
         m_cmdParser->reply.WriteFrameID(jni, thrd, j, frameCount);
 
-        JVMTI_TRACE(err, jvmti->GetMethodDeclaringClass(frame_buffer[j].method,
+        JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetMethodDeclaringClass(frame_buffer[j].method,
             &declaring_class));
         if (err != JVMTI_ERROR_NONE) {
-            throw AgentException(err);
+            AgentException e(err);
+		    JDWP_SET_EXCEPTION(e);
+            return err;
         }
 
         typeTag = GetClassManager().GetJdwpTypeTag(declaring_class);
@@ -237,171 +262,211 @@
 #ifndef NDEBUG
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {
             jvmtiThreadInfo info;
-            JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
-            JDWP_TRACE_DATA("Frames: send: frame#=" << j 
-                << ", threadName=" << info.name 
-                << ", loc=" << frame_buffer[j].location 
-                << ", methodID=" << frame_buffer[j].method 
-                << ", classID=" << declaring_class
-                << ", typeTag=" << typeTag);
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(thrd, &info));
+            JvmtiAutoFree jafInfoName(info.name);
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Frames: send: frame#=%d, threadName=%s, loc=%lld, methodID=%p, classID=%p, typeTag=%d", 
+                            j, info.name, frame_buffer[j].location, frame_buffer[j].method, declaring_class, typeTag));
         }
 #endif
+        
+        jboolean isObsolete;
+        JVMTI_TRACE(LOG_DEBUG, err, jvmti->IsMethodObsolete(frame_buffer[j].method, &isObsolete));
 
-        m_cmdParser->reply.WriteLocation(jni, typeTag,
+        // we should return 0 as the methodID for obsolete method.
+        if(isObsolete) {	 
+            m_cmdParser->reply.WriteLocation(jni, typeTag,
+                        declaring_class, 0,
+                        frame_buffer[j].location);
+        } else {
+            m_cmdParser->reply.WriteLocation(jni, typeTag,
                         declaring_class, frame_buffer[j].method,
                         frame_buffer[j].location);
+        }
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //FrameCountHandler------------------------------------------------------------
 
-void
-ThreadReference::FrameCountHandler::Execute(JNIEnv *jni) throw (AgentException)
+int
+ThreadReference::FrameCountHandler::Execute(JNIEnv *jni) 
 {
     jint count;
 
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("FrameCount: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "FrameCount: received: threadID=%p", thrd));
 
-    if (!GetThreadManager().IsSuspended(thrd))
-        throw AgentException(JVMTI_ERROR_THREAD_NOT_SUSPENDED);
+    if (!GetThreadManager().IsSuspended(thrd)){
+        AgentException e(JVMTI_ERROR_THREAD_NOT_SUSPENDED);
+		JDWP_SET_EXCEPTION(e);
+        return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
+    }
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetFrameCount(thrd, &count));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetFrameCount(thrd, &count));
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     m_cmdParser->reply.WriteInt(count);
-    JDWP_TRACE_DATA("FrameCount: send: count=" << count);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "FrameCount: send: count=%d", count));
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //OwnedMonitorsHandler---------------------------------------------------------
 
-void
-ThreadReference::OwnedMonitorsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::OwnedMonitorsHandler::Execute(JNIEnv *jni) 
 {
     jint count;
     jobject* owned_monitors = 0;
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("OwnedMonitors: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitors: received: threadID=%p", thrd));
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetOwnedMonitorInfo(thrd, &count,
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetOwnedMonitorInfo(thrd, &count,
         &owned_monitors));
     JvmtiAutoFree destroyer(owned_monitors);
 
     JDWP_ASSERT(err != JVMTI_ERROR_NULL_POINTER);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("OwnedMonitors: send: monitors=" << count);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitors: send: monitors=%d", count));
     m_cmdParser->reply.WriteInt(count);
     for (int i = 0; i < count; i++)
     {
-        JDWP_TRACE_DATA("OwnedMonitors: send: monitor#=" << i
-            << ", objectID=" << owned_monitors[i]);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitors: send: monitor#=%d, objectID=%p", i, owned_monitors[i]));
         m_cmdParser->reply.WriteTaggedObjectID(jni, owned_monitors[i]);
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //OwnedMonitorsHandler---------------------------------------------------------
 
-void
-ThreadReference::CurrentContendedMonitorHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::CurrentContendedMonitorHandler::Execute(JNIEnv *jni) 
 {
     jobject monitor;
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);\
-    JDWP_TRACE_DATA("CurrentContendedMonitor: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "CurrentContendedMonitor: received: threadID=%p", thrd));
                                                                            
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetCurrentContendedMonitor(thrd, &monitor));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetCurrentContendedMonitor(thrd, &monitor));
 
     JDWP_ASSERT(err != JVMTI_ERROR_NULL_POINTER);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("CurrentContendedMonitor: send: monitor=" << monitor);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "CurrentContendedMonitor: send: monitor=%p", monitor));
     m_cmdParser->reply.WriteTaggedObjectID(jni, monitor);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //StopHandler------------------------------------------------------------------
 
-void
-ThreadReference::StopHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::StopHandler::Execute(JNIEnv *jni) 
 {
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
     jobject excp = m_cmdParser->command.ReadObjectID(jni);
 
-    JDWP_TRACE_DATA("Stop: stop: threadID=" << thrd 
-        << ", throwableID=" << excp);
-    GetThreadManager().Stop(jni, thrd, excp);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Stop: stop: threadID=%p throwableID=%p", thrd, excp));
+    int ret = GetThreadManager().Stop(jni, thrd, excp);
+
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //InterruptHandler-------------------------------------------------------------
 
-void
-ThreadReference::InterruptHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+ThreadReference::InterruptHandler::Execute(JNIEnv *jni) 
 {
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
 
-    JDWP_TRACE_DATA("Interrupt: interrupt: threadID=" << thrd);
-    GetThreadManager().Interrupt(jni, thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Interrupt: interrupt: threadID=%p", thrd));
+    int ret = GetThreadManager().Interrupt(jni, thrd);
+
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //SuspendCountHandler----------------------------------------------------------
 
-void
+int
 ThreadReference::SuspendCountHandler::Execute(JNIEnv *jni)
-    throw (AgentException)
 {
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("SuspendCount: received: threadID=" << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "SuspendCount: received: threadID=%p", thrd));
     jint count = GetThreadManager().GetSuspendCount(jni, thrd);
 
-    JDWP_TRACE_DATA("SuspendCount: send: count=" << count);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "SuspendCount: send: count=%d", count));
     m_cmdParser->reply.WriteInt(count);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //OwnedMonitorsStackDepthInfoHandler-------------------------------------------
 
-void
+int
 ThreadReference::OwnedMonitorsStackDepthInfoHandler::Execute(JNIEnv *jni)
-    throw (AgentException)
 {
     // Read thread id from OwnedMonitorsStackDepthInfoHandler command
+    // Bug fix, if thread id is invalid, error code reply should be returned
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("OwnedMonitorsStackDepthInfo: received: threadID=" << thrd);
-
-    // If the thread is not suspended, throw exception
-    if (!GetThreadManager().IsSuspended(thrd))
-        throw AgentException(JVMTI_ERROR_THREAD_NOT_SUSPENDED);
+    if(thrd == 0){
+        AgentException aex = GetExceptionManager().GetLastException();
+        jdwpError err = aex.ErrCode();
+        AgentException ex(err);
+        JDWP_SET_EXCEPTION(ex);
+        return err;
+	}
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitorsStackDepthInfo: received: threadID=%p", thrd));
+    
+    // If the thread is not in the suspended list or is terminated,
+    // throw INVALID_THREAD exception or THREAD_NOT_SUSPENDED
+    int ret = GetThreadManager().CheckThreadStatus(jni, thrd);
+    JDWP_CHECK_RETURN(ret);
 
     // Invoke jvmti function to attain the expected monitor data
     jvmtiError err;
     jint count;
     jvmtiMonitorStackDepthInfo* pMonitorInfos;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetOwnedMonitorStackDepthInfo(thrd, &count, &pMonitorInfos));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetOwnedMonitorStackDepthInfo(thrd, &count, &pMonitorInfos));
     if (err != JVMTI_ERROR_NONE) {
         // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_INVALID_THREAD
         // JVMTI_ERROR_THREAD_NOT_ALIVE, JVMTI_ERROR_NULL_POINTER 
-        throw AgentException(err);
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
     }
     
     // Must release memeory manually
     JvmtiAutoFree af(pMonitorInfos);
 
     // Write monitor count to reply package
-    JDWP_TRACE_DATA("OwnedMonitorsStackDepthInfo: received: monitor count=" << count);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitorsStackDepthInfo: received: monitor count=%d", count));
     m_cmdParser->reply.WriteInt(count);
     
     // Write each monitor and its stack depth to reply package 
@@ -409,32 +474,36 @@
         // Attain monitor and its stack depth from returned data.
         jobject monitor = pMonitorInfos[i].monitor;
         m_cmdParser->reply.WriteTaggedObjectID(jni, monitor);
-        JDWP_TRACE_DATA("OwnedMonitorsStackDepthInfo: received: monitor object=" << monitor);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitorsStackDepthInfo: received: monitor object=%p", monitor));
         
         jint stack_depth = pMonitorInfos[i].stack_depth;
-        JDWP_TRACE_DATA("OwnedMonitorsStackDepthInfo: received: monitor stack depth=" << stack_depth);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "OwnedMonitorsStackDepthInfo: received: monitor stack depth=%d", stack_depth));
         m_cmdParser->reply.WriteInt(stack_depth);
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //ForceEarlyReturnHandler------------------------------------------------------
 
-void
+int
 ThreadReference::ForceEarlyReturnHandler::Execute(JNIEnv *jni)
-    throw (AgentException)
 {
     // Read thread id from ForceEarlyReturnHandler command
     jthread thrd = m_cmdParser->command.ReadThreadID(jni);
-    JDWP_TRACE_DATA("ForceEarlyReturn Command: received: threadID = " << thrd);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: received: threadID = %p", thrd));
 
     // If the thread is not suspended, throw exception
-    if (!GetThreadManager().IsSuspended(thrd))
-        throw AgentException(JDWP_ERROR_THREAD_NOT_SUSPENDED);
+    if (!GetThreadManager().IsSuspended(thrd)) {
+        AgentException e(JDWP_ERROR_THREAD_NOT_SUSPENDED);
+		JDWP_SET_EXCEPTION(e);
+        return JDWP_ERROR_THREAD_NOT_SUSPENDED;
+    }
 
     // Attain return value type from the command
     jdwpTaggedValue taggedValue = m_cmdParser->command.ReadValue(jni);
-    JDWP_TRACE_DATA("ForceEarlyReturn Command: received value type:" << taggedValue.tag);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: received value type: %d", taggedValue.tag));
     
     // Invoke relevant jvmti function according to return value's type
     jvmtiError err = JVMTI_ERROR_NONE;      
@@ -446,8 +515,8 @@
         case JDWP_TAG_THREAD_GROUP:
         case JDWP_TAG_CLASS_LOADER:
         case JDWP_TAG_CLASS_OBJECT:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: jobject return value:"<< taggedValue.value.l);
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnObject(thrd, taggedValue.value.l));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: jobject return value: %p", taggedValue.value.l));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnObject(thrd, taggedValue.value.l));
             break;
         }
         case JDWP_TAG_BOOLEAN:
@@ -459,59 +528,65 @@
             switch (taggedValue.tag) {
                 case JDWP_TAG_BOOLEAN:
                     ivalue = static_cast<jint>(taggedValue.value.z);
-                    JDWP_TRACE_DATA("ForceEarlyReturn Command: value=(boolean)" << taggedValue.value.z);
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: value=(boolean)%d", taggedValue.value.z));
                     break;
                 case JDWP_TAG_BYTE:
                     ivalue = static_cast<jint>(taggedValue.value.b);
-                    JDWP_TRACE_DATA("ForceEarlyReturn Command: value=(byte)" << taggedValue.value.b);
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: value=(byte)%d", taggedValue.value.b));
                     break;
                 case JDWP_TAG_CHAR:
                     ivalue = static_cast<jint>(taggedValue.value.c);
-                    JDWP_TRACE_DATA("ForceEarlyReturn Command: value=(char)" << taggedValue.value.c);
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: value=(char)%d", taggedValue.value.c));
                     break;
                 case JDWP_TAG_SHORT:
                     ivalue = static_cast<jint>(taggedValue.value.s);
-                    JDWP_TRACE_DATA("ForceEarlyReturn Command: value=(short)" << taggedValue.value.s);
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: value=(short)%d", taggedValue.value.s));
                     break;
                 case JDWP_TAG_INT:
                     ivalue = taggedValue.value.i;
-                    JDWP_TRACE_DATA("ForceEarlyReturn Command: value=(int)" << taggedValue.value.i);
+                    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: value=(int)%d", taggedValue.value.i));
                     break;
             }
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnInt(thrd, ivalue));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnInt(thrd, ivalue));
             break;
         }
         case JDWP_TAG_LONG:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: jlong returne value:"<< taggedValue.value.j);
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnLong(thrd, taggedValue.value.j));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: jlong return value:%lld", taggedValue.value.j));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnLong(thrd, taggedValue.value.j));
             break;
         }
         case JDWP_TAG_FLOAT:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: jfloat return value:"<< taggedValue.value.f);
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnFloat(thrd, taggedValue.value.f));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: jfloat return value:%f", taggedValue.value.f));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnFloat(thrd, taggedValue.value.f));
             break;
             
         }
         case JDWP_TAG_DOUBLE:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: jdouble return value:"<< taggedValue.value.d);
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnDouble(thrd, taggedValue.value.d));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: jdouble return value:%Lf", taggedValue.value.d));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnDouble(thrd, taggedValue.value.d));
             break;
         }
         case JDWP_TAG_VOID:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: void return value");
-            JVMTI_TRACE(err, GetJvmtiEnv()->ForceEarlyReturnVoid(thrd));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: void return value"));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->ForceEarlyReturnVoid(thrd));
             break;
         }
         default:{
-            JDWP_TRACE_DATA("ForceEarlyReturn Command: Value's type is not supported " << taggedValue.tag);
-            throw AgentException(JDWP_ERROR_INVALID_TAG);
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command: Value's type is not supported %d", taggedValue.tag));
+            AgentException e(JDWP_ERROR_INVALID_TAG);
+			JDWP_SET_EXCEPTION(e);
+            return JDWP_ERROR_INVALID_TAG;
         }
     }
     
     if (err != JVMTI_ERROR_NONE) {
-        throw AgentException(err);
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
     }
-    JDWP_TRACE_DATA("ForceEarlyReturn Command finished.");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ForceEarlyReturn Command finished."));
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/ThreadReference.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Vitaly A. Provodin
- * @version $Revision: 1.4.2.1 $
- */
-
 /**
  * @file
  * ThreadReference.h
@@ -54,7 +48,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//NameHandler
 
@@ -71,7 +65,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//SuspendHandler
 
@@ -88,7 +82,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//ResumeHandler
 
@@ -105,7 +99,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//StatusHandler
 
@@ -122,7 +116,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//ThreadGroupHandler
 
@@ -139,7 +133,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//FramesHandler
 
@@ -156,7 +150,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//FrameCountHandler
 
@@ -173,7 +167,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//OwnedMonitorsHandler
 
@@ -190,7 +184,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//CurrentContendedMonitorHandler
 
@@ -207,7 +201,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//StopHandler
 
@@ -224,7 +218,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//InterruptHandler
 
@@ -241,7 +235,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//SuspendCountHandler
 
@@ -259,7 +253,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//OwnedMonitorsStackDepthInfoHandler
         
@@ -276,7 +270,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni);
 
         };//ForceEarlyReturnHandler
 

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.cpp Thu Jul 16 15:57:37 2009
@@ -15,13 +15,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Vitaly A. Provodin
- * @version $Revision: 1.23.2.2 $
- */
-#include <string.h>
-
 #include "jvmti.h"
 #include "jdwp.h"
 
@@ -34,6 +27,13 @@
 #include "EventDispatcher.h"
 #include "TransportManager.h"
 #include "CallBacks.h"
+#include "ExceptionManager.h"
+
+
+#include "vmi.h"
+#include "hyport.h"
+
+#include <string.h>
 
 using namespace jdwp;
 using namespace VirtualMachine;
@@ -42,8 +42,8 @@
 //-----------------------------------------------------------------------------
 //VersionHandler---------------------------------------------------------------
 
-void
-VirtualMachine::VersionHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::VersionHandler::Execute(JNIEnv *jni) 
 {
     ClassManager &clsMgr = AgentBase::GetClassManager();
 
@@ -69,37 +69,32 @@
     char *description = reinterpret_cast<char*>
         (AgentBase::GetMemoryManager().Allocate(descriptionSize JDWP_FILE_LINE));
     AgentAutoFree dobj_description(description JDWP_FILE_LINE);
-    sprintf(description, pattern,
-        (javaVersion == 0) ? unknown : javaVersion,
-        (javaVmName == 0) ? unknown : javaVmName,
-        (javaVmInfo == 0) ? unknown : javaVmInfo,
-        (javaVmVersion == 0) ? unknown : javaVmVersion);
-
-    JDWP_TRACE_DATA("Version: send: "
-        << ", description=" << JDWP_CHECK_NULL(description)
-        << ", jdwpMajor=" << JDWP_VERSION_MAJOR
-        << ", jdwpMinor=" << JDWP_VERSION_MINOR
-        << ", vmVersion=" << JDWP_CHECK_NULL(javaVersion)
-        << ", vmVersion=" << JDWP_CHECK_NULL(javaVmName)
 
-    );
+    PORT_ACCESS_FROM_ENV(jni);
+    hystr_printf(privatePortLibrary, description, (U_32)descriptionSize, pattern, (javaVersion == 0) ? unknown : javaVersion,
+        (javaVmName == 0) ? unknown : javaVmName, (javaVmInfo == 0) ? unknown : javaVmInfo, (javaVmVersion == 0) ? unknown : javaVmVersion);
+
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Version: send: description=%s, jdwpMajor=%d, jdwpMinor=%d, vmVersion=%s, vmName=%s",
+                    JDWP_CHECK_NULL(description), JDWP_VERSION_MAJOR, JDWP_VERSION_MINOR,
+                    JDWP_CHECK_NULL(javaVersion), JDWP_CHECK_NULL(javaVmName)));
 
     m_cmdParser->reply.WriteString(description);
     m_cmdParser->reply.WriteInt(JDWP_VERSION_MAJOR);
     m_cmdParser->reply.WriteInt(JDWP_VERSION_MINOR);
     m_cmdParser->reply.WriteString(javaVersion);
     m_cmdParser->reply.WriteString(javaVmName);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //ClassesBySignatureHandler----------------------------------------------------
 
-void
-VirtualMachine::ClassesBySignatureHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::ClassesBySignatureHandler::Execute(JNIEnv *jni) 
 {
     const char *signature = m_cmdParser->command.ReadString();
-    JDWP_TRACE_DATA("ClassesBySignature: received: "
-        << "signature=" << JDWP_CHECK_NULL(signature));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassesBySignature: received: signature=%s", JDWP_CHECK_NULL(signature)));
 
     jint classCount = 0;
     jclass* classes = 0;
@@ -107,11 +102,16 @@
     jvmtiEnv* jvmti = AgentBase::GetJvmtiEnv();
 
     jvmtiError err;
-    JVMTI_TRACE(err, jvmti->GetLoadedClasses(&classCount, &classes));
+    AgentBase::GetJniEnv()->PushLocalFrame(100);
+
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetLoadedClasses(&classCount, &classes));
     JvmtiAutoFree dobj(classes);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE) {
+        AgentException e(err);
+        JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     int i;
     int count = 0;
@@ -120,22 +120,25 @@
         if (IsSignatureMatch(classes[i], signature)) {
             classes[count] = classes[i];
             count++;
-        }
+        } 
     }
+
     size_t classCountPos = m_cmdParser->reply.GetPosition();
     m_cmdParser->reply.WriteInt(count);
-    JDWP_TRACE_DATA("ClassesBySignature: classes=" << count);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassesBySignature: classes=%d", count));
     
     int notIncludedClasses = 0;
-    for (i = 0; i < count; i++)
+    for (i = count - 1; i >= 0; i --)
     {
         jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(classes[i]);
 
         jint status;
-        JVMTI_TRACE(err, jvmti->GetClassStatus(classes[i], &status));
-        if (err != JVMTI_ERROR_NONE)
-            throw AgentException(err);
-
+        JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassStatus(classes[i], &status));
+        if (err != JVMTI_ERROR_NONE){
+            AgentException e(err);
+            JDWP_SET_EXCEPTION(e);
+            return err;
+        }
         if (status == JVMTI_CLASS_STATUS_ARRAY) {
            status = 0;
         } else {
@@ -149,19 +152,19 @@
                 }
             }
         }
-        m_cmdParser->reply.WriteByte(refTypeTag);
+        m_cmdParser->reply.WriteByte((jbyte)refTypeTag);
         m_cmdParser->reply.WriteReferenceTypeID(jni, classes[i]);
         m_cmdParser->reply.WriteInt(status);
+
+
 #ifndef NDEBUG
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {    
             jvmtiError err;
             char* signature = 0;
-            JVMTI_TRACE(err, jvmti->GetClassSignature(classes[i], &signature, 0));
+            JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassSignature(classes[i], &signature, 0));
             JvmtiAutoFree afcs(signature);
-            JDWP_TRACE_DATA("ClassesBySignature: class#=" << i
-                << ", refTypeID=" << classes[i]
-                << ", status=" << status
-                << ", signature=" << JDWP_CHECK_NULL(signature));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassesBySignature: class#=%d, refTypeID=%p, status=%d, signature=%s", 
+                            i, classes[i], status, JDWP_CHECK_NULL(signature)));
         }
 #endif
     }
@@ -174,21 +177,26 @@
         m_cmdParser->reply.SetPosition(currentPos);
         m_cmdParser->reply.SetLength(currentLength);
     }
+
+    AgentBase::GetJniEnv()->PopLocalFrame(NULL);
+
+    return JDWP_ERROR_NONE;
 }
 
 bool
 VirtualMachine::ClassesBySignatureHandler::IsSignatureMatch(jclass klass,
                                                             const char *signature)
-                                                            throw(AgentException)
 {
     char* sign = 0;
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetClassSignature(klass, &sign, 0));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetClassSignature(klass, &sign, 0));
     JvmtiAutoFree dobj(sign);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "GetClassSignature failed with error %d on signature %s", err, signature));
+        return false;
+    }
 
     return strcmp(signature, sign) == 0;
 }
@@ -196,22 +204,27 @@
 //-----------------------------------------------------------------------------
 //AllClassesHandler------------------------------------------------------------
 
-void
-VirtualMachine::AllClassesHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::AllClassesHandler::Execute(JNIEnv *jni) 
 {
     jint classCount = 0;
     jclass* classes = 0;
 
     jvmtiEnv* jvmti = AgentBase::GetJvmtiEnv();
     jvmtiError err;
-    JVMTI_TRACE(err, jvmti->GetLoadedClasses(&classCount, &classes));
+
+    AgentBase::GetJniEnv()->PushLocalFrame(100);
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetLoadedClasses(&classCount, &classes));
 
     JvmtiAutoFree dobj(classes);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+        JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("AllClasses: classes=" << classCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "AllClasses: classes=%d", classCount));
     size_t classCountPos = m_cmdParser->reply.GetPosition();
     m_cmdParser->reply.WriteInt(classCount);
 
@@ -229,30 +242,40 @@
         m_cmdParser->reply.SetPosition(currentPos);
         m_cmdParser->reply.SetLength(currentLength);
     }
+
+    AgentBase::GetJniEnv()->PopLocalFrame(NULL);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 
 int
 VirtualMachine::AllClassesHandler::Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti,
-        jclass klass) throw (AgentException)
+        jclass klass) 
 {
     jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(klass);
 
     char* signature = 0;
 
     jvmtiError err;
-    JVMTI_TRACE(err, jvmti->GetClassSignature(klass, &signature, 0));
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassSignature(klass, &signature, 0));
 
     JvmtiAutoFree dobj(signature);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     jint status;
-    JVMTI_TRACE(err, jvmti->GetClassStatus(klass, &status));
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassStatus(klass, &status));
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     // According to JVMTI spec ClassStatus flag for arrays and primitive classes must be zero
     if (status == JVMTI_CLASS_STATUS_ARRAY || status == JVMTI_CLASS_STATUS_PRIMITIVE) {
@@ -262,7 +285,7 @@
         return 1;
     }
 
-    m_cmdParser->reply.WriteByte(refTypeTag);
+    m_cmdParser->reply.WriteByte((jbyte)refTypeTag);
     m_cmdParser->reply.WriteReferenceTypeID(jni, klass);
     m_cmdParser->reply.WriteString(signature);
     m_cmdParser->reply.WriteInt(status);
@@ -273,25 +296,27 @@
 //-----------------------------------------------------------------------------
 //AllThreadHandler-------------------------------------------------------------
 
-void
+int
 VirtualMachine::AllThreadsHandler::Execute(JNIEnv *jni)
-    throw(AgentException)
 {
     jint totalThreadsCount, threadsCount;
     jthread* threads = 0;
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetAllThreads(&totalThreadsCount, &threads));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetAllThreads(&totalThreadsCount, &threads));
 
     JvmtiAutoFree dobj(threads);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     threadsCount = 0;
     ThreadManager& thrdMgr = GetThreadManager();
 
-    JDWP_TRACE_DATA("AllThreads: threads=" << totalThreadsCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "AllThreads: threads=%d", totalThreadsCount));
 
     int i;
     for (i = 0; i < totalThreadsCount; i++)
@@ -301,11 +326,10 @@
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {
             jvmtiThreadInfo info;
             info.name = 0;
-            JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(threads[i], &info));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadInfo(threads[i], &info));
             JvmtiAutoFree jafInfoName(info.name);
-            JDWP_TRACE_DATA("AllThreads: thread#=" << i 
-                << ", name=" << JDWP_CHECK_NULL(info.name)
-                << ", isAgent=" << (thrdMgr.IsAgentThread(jni, threads[i])));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "AllThreads: thread#=%d, name=%s, isAgent=%s", 
+                            i, JDWP_CHECK_NULL(info.name), (thrdMgr.IsAgentThread(jni, threads[i])?"TRUE":"FALSE")));
         }
 #endif
 
@@ -321,27 +345,31 @@
     {
         m_cmdParser->reply.WriteThreadID(jni, threads[i]);
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //TopLevelThreadGroupsHandler--------------------------------------------------
 
-void
+int
 VirtualMachine::TopLevelThreadGroupsHandler::Execute(JNIEnv *jni)
-    throw(AgentException)
 {
     jint groupCount;
     jthreadGroup* groups = 0;
 
     jvmtiError err;
-    JVMTI_TRACE(err, GetJvmtiEnv()->GetTopThreadGroups(&groupCount, &groups));
+    JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetTopThreadGroups(&groupCount, &groups));
 
     JvmtiAutoFree dobj(groups);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
-    JDWP_TRACE_DATA("TopLevelThreadGroup: send: groupCount=" << groupCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "TopLevelThreadGroup: send: groupCount=%d", groupCount));
     m_cmdParser->reply.WriteInt(groupCount);
     for (jint i = 0; i < groupCount; i++) {
 
@@ -349,82 +377,94 @@
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {
             jvmtiThreadGroupInfo info;
             info.name = 0;
-            JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadGroupInfo(groups[i], &info));
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetThreadGroupInfo(groups[i], &info));
             JvmtiAutoFree jafInfoName(info.name);
         
-            JDWP_TRACE_DATA("TopLevelThreadGroup: send: group#" << i 
-                << ", groupID=" << groups[i]
-                << ", name=" << JDWP_CHECK_NULL(info.name));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "TopLevelThreadGroup: send: group#%d, groupID=%p, name=%s", 
+                            i, groups[i], JDWP_CHECK_NULL(info.name)));
         }
 #endif
 
         m_cmdParser->reply.WriteThreadGroupID(jni, groups[i]);
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //DisposeHandler---------------------------------------------------------------
 
-void
-VirtualMachine::DisposeHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::DisposeHandler::Execute(JNIEnv *jni) 
 {
-    JDWP_TRACE_DATA("Dispose: write reply");
-    m_cmdParser->WriteReply(jni);
-    JDWP_TRACE_DATA("Dispose: reset agent");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Dispose: write reply"));
+    int ret = m_cmdParser->WriteReply(jni);
+    JDWP_CHECK_RETURN(ret);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Dispose: reset agent"));
     GetPacketDispatcher().Reset(jni);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //IDSizesHandler---------------------------------------------------------------
 
-void
-VirtualMachine::IDSizesHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::IDSizesHandler::Execute(JNIEnv *jni) 
 {
     m_cmdParser->reply.WriteInt(FIELD_ID_SIZE);
     m_cmdParser->reply.WriteInt(METHOD_ID_SIZE);
     m_cmdParser->reply.WriteInt(OBJECT_ID_SIZE);
     m_cmdParser->reply.WriteInt(REFERENCE_TYPE_ID_SIZE);
     m_cmdParser->reply.WriteInt(FRAME_ID_SIZE);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //SuspendHandler---------------------------------------------------------------
 
-void
-VirtualMachine::SuspendHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::SuspendHandler::Execute(JNIEnv *jni) 
 {
-    JDWP_TRACE_DATA("Suspend: suspendAll");
-    GetThreadManager().SuspendAll(jni);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Suspend: suspendAll"));
+    int ret = GetThreadManager().SuspendAll(jni);
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //ResumedHandler---------------------------------------------------------------
 
-void
-VirtualMachine::ResumeHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::ResumeHandler::Execute(JNIEnv *jni) 
 {
-    JDWP_TRACE_DATA("Resume: resumeAll");
-    GetThreadManager().ResumeAll(jni);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Resume: resumeAll"));
+    int ret = GetThreadManager().ResumeAll(jni);
+
+    return ret;
 }
 
 //-----------------------------------------------------------------------------
 //ExitHandler------------------------------------------------------------------
 
-void
-VirtualMachine::ExitHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::ExitHandler::Execute(JNIEnv *jni) 
 {
     jint exitCode = m_cmdParser->command.ReadInt();
-    JDWP_TRACE_DATA("Exit: received: exitCode=" << exitCode);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Exit: received: exitCode=%d", exitCode));
 
-    JDWP_TRACE_DATA("Exit: write reply");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Exit: write reply"));
+    // No need to check return code here as we will exit the process immediately
     m_cmdParser->WriteReply(jni);
 
-    JDWP_TRACE_DATA("Exit: reset agent");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Exit: reset agent"));
+    // No need to check return code here as we will exit the process immediately
     GetTransportManager().Reset();
     
-    JDWP_TRACE_DATA("Exit: terminate process");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "Exit: terminate process"));
     exit(static_cast<int>(exitCode));
 
+    return JDWP_ERROR_NONE;
 /*
     // another variant is to call System.exit()
     ClassManager &clsMgr = AgentBase::GetClassManager();
@@ -440,15 +480,17 @@
 //-----------------------------------------------------------------------------
 //CreateStringHandler----------------------------------------------------------
 
-void
-VirtualMachine::CreateStringHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::CreateStringHandler::Execute(JNIEnv *jni) 
 {
     const char *utf = m_cmdParser->command.ReadString();
-    JDWP_TRACE_DATA("CreateString: received: string=" << JDWP_CHECK_NULL(utf));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "CreateString: received: string=%s", JDWP_CHECK_NULL(utf)));
     jstring str = jni->NewStringUTF(utf);
 
-    JDWP_TRACE_DATA("CreateString: send: objectID=" << str);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "CreateString: send: objectID=%p", str));
     m_cmdParser->reply.WriteObjectID(jni, str);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
@@ -459,9 +501,8 @@
     return (value == 1) ? JNI_TRUE : JNI_FALSE;
 }
 
-void
+int
 VirtualMachine::CapabilitiesHandler::Execute(JNIEnv *jni)
-    throw(AgentException)
 {
     jdwpCapabilities caps = GetCapabilities();
 
@@ -472,6 +513,8 @@
     m_cmdParser->reply.WriteBoolean(IsAdded(caps.canGetOwnedMonitorInfo));
     m_cmdParser->reply.WriteBoolean(IsAdded(caps.canGetCurrentContendedMonitor));
     m_cmdParser->reply.WriteBoolean(IsAdded(caps.canGetMonitorInfo));
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
@@ -479,7 +522,7 @@
 
 void
 VirtualMachine::ClassPathsHandler::WritePathStrings(char *str,
-        char pathSeparator) throw(AgentException)
+        char pathSeparator)
 {
     if (str == 0) {
         m_cmdParser->reply.WriteInt(1);
@@ -510,8 +553,8 @@
     }
 }
 
-void
-VirtualMachine::ClassPathsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::ClassPathsHandler::Execute(JNIEnv *jni) 
 {
     ClassManager &clsMgr = AgentBase::GetClassManager();
 
@@ -536,66 +579,68 @@
     char pathSeparator =
         (pathSeparatorString == 0) ? ';' : pathSeparatorString[0];
 
-    JDWP_TRACE_DATA("ClassPaths: baseDir="
-        << JDWP_CHECK_NULL(baseDir));
-    JDWP_TRACE_DATA("ClassPaths: pathSeparatorString="
-        << JDWP_CHECK_NULL(pathSeparatorString));
-    JDWP_TRACE_DATA("ClassPaths: classPaths="
-        << JDWP_CHECK_NULL(classPaths));
-    JDWP_TRACE_DATA("ClassPaths: bootClassPaths="
-        << JDWP_CHECK_NULL(bootClassPaths));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassPaths: baseDir=%s", JDWP_CHECK_NULL(baseDir)));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassPaths: pathSeparatorString=%s", JDWP_CHECK_NULL(pathSeparatorString)));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassPaths: classPaths=%s", JDWP_CHECK_NULL(classPaths)));
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ClassPaths: bootClassPaths=%s", JDWP_CHECK_NULL(bootClassPaths)));
 
     m_cmdParser->reply.WriteString(baseDir);
     WritePathStrings(classPaths, pathSeparator);
     WritePathStrings(bootClassPaths, pathSeparator);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //DisposeObjectsHandler--------------------------------------------------------
 
-void
-VirtualMachine::DisposeObjectsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::DisposeObjectsHandler::Execute(JNIEnv *jni) 
 {
     jint refCount;
     ObjectID objectID;
     jint objCount = m_cmdParser->command.ReadInt();
-    JDWP_TRACE_DATA("DisposeObjects: dispose: objects=" << objCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "DisposeObjects: dispose: objects=%d", objCount));
     for (jint i = 0; i < objCount; i++)
     {
         objectID = m_cmdParser->command.ReadRawObjectID();
         refCount = m_cmdParser->command.ReadInt();
         GetObjectManager().DisposeObject(jni, objectID, refCount);
-        JDWP_TRACE_DATA("DisposeObjects: object#=" << i 
-            << ", objectID=" << objectID);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "DisposeObjects: object#=%d, objectID=%p", i, objectID));
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //HoldEventsHandler------------------------------------------------------------
 
-void
-VirtualMachine::HoldEventsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::HoldEventsHandler::Execute(JNIEnv *jni) 
 {
-    JDWP_TRACE_DATA("HoldEvents: hold events");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "HoldEvents: hold events"));
     GetEventDispatcher().HoldEvents();
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //ReleaseEventsHandler---------------------------------------------------------
 
-void
-VirtualMachine::ReleaseEventsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::ReleaseEventsHandler::Execute(JNIEnv *jni) 
 {
-    JDWP_TRACE_DATA("ReleaseEvents: release events");
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "ReleaseEvents: release events"));
     GetEventDispatcher().ReleaseEvents();
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //CapabilitiesNewHandler-------------------------------------------------------
 
-void
+int
 VirtualMachine::CapabilitiesNewHandler::Execute(JNIEnv *jni)
-    throw(AgentException)
 {
     jdwpCapabilities caps = GetCapabilities();
 
@@ -627,6 +672,8 @@
     for (int i = 0; i < 11; i++){
         m_cmdParser->reply.WriteBoolean(JNI_FALSE);
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
@@ -634,8 +681,8 @@
 
 class DAgentAutoFree {
 public:
-    DAgentAutoFree(unsigned char **ptr, size_t count) throw() : m_ptr(ptr) {m_count = count;}
-    ~DAgentAutoFree() throw()
+    DAgentAutoFree(unsigned char **ptr, size_t count) : m_ptr(ptr) {m_count = count;}
+    ~DAgentAutoFree()
     {
         MemoryManager &mm = AgentBase::GetMemoryManager();
         if (m_ptr != 0)
@@ -657,13 +704,13 @@
     unsigned char **m_ptr;
 };
 
-void
-VirtualMachine::RedefineClassesHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::RedefineClassesHandler::Execute(JNIEnv *jni) 
 {
     MemoryManager &mm = GetMemoryManager();
 
     jint classCount = m_cmdParser->command.ReadInt();
-    JDWP_TRACE_DATA("RedefineClasses: received: classCount=" << classCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "RedefineClasses: received: classCount=%d", classCount));
 
     jvmtiClassDefinition *classDefs =
         reinterpret_cast<jvmtiClassDefinition *>(mm.Allocate(sizeof(jvmtiClassDefinition)*classCount JDWP_FILE_LINE));
@@ -678,7 +725,7 @@
 
         DAgentAutoFree dobjDefs(bytes, classCount);
 
-        JDWP_TRACE_DATA("RedefineClasses: classes" << classCount);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "RedefineClasses: classes=%d", classCount));
         for (i = 0; i < classCount; i++)
         {
             classDefs[i].klass = m_cmdParser->command.ReadReferenceTypeID(jni);
@@ -692,34 +739,39 @@
             if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {    
                 jvmtiError err;
                 char* signature = 0;
-                JVMTI_TRACE(err, GetJvmtiEnv()->GetClassSignature(classDefs[i].klass, &signature, 0));
+                JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetClassSignature(classDefs[i].klass, &signature, 0));
                 JvmtiAutoFree afcs(signature);
-                JDWP_TRACE_DATA("RedefineClasses: class#=" << i
-                    << ", refTypeID=" << classDefs[i].klass
-                    << ", class_byte_count=" << classDefs[i].class_byte_count 
-                    << ", signature=" << JDWP_CHECK_NULL(signature));
+                JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "RedefineClasses: class#=%d, refTypeID=%p, class_byte_count=%d, signature=%s", 
+                                i, classDefs[i].klass, classDefs[i].class_byte_count, JDWP_CHECK_NULL(signature)));
             }
 #endif
         }
 
         jvmtiError err;
-        JVMTI_TRACE(err, GetJvmtiEnv()->RedefineClasses(classCount, classDefs));
+        JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->RedefineClasses(classCount, classDefs));
 
-        if (err != JVMTI_ERROR_NONE)
-            throw AgentException(err);
+        if (err != JVMTI_ERROR_NONE){
+            AgentException e(err);
+		    JDWP_SET_EXCEPTION(e);
+            return err;
+        }
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
 //SetDefaultStratumHandler-----------------------------------------------------
 
-void
-VirtualMachine::SetDefaultStratumHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::SetDefaultStratumHandler::Execute(JNIEnv *jni)
 {
-    // Note. The SetDefaultStratum handler is not implemented
-    // here because JDWP specs are not clear about this command.
-    JDWP_TRACE_DATA("SetDefaultStratumHandler: not implemented");
-    throw AgentException(JDWP_ERROR_NOT_IMPLEMENTED);
+    JDWP_TRACE(LOG_RELEASE, (LOG_FUNC_FL, "SetDefaultStratumHandler(%p)", jni));
+
+    char *stratum = m_cmdParser->command.ReadStringNoFree();
+    AgentBase::SetDefaultStratum(stratum);
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------
@@ -727,7 +779,7 @@
 
 int
 VirtualMachine::AllClassesWithGenericHandler::Compose41Class(JNIEnv *jni_env,
-            jvmtiEnv* jvmti, jclass klass) throw (AgentException)
+            jvmtiEnv* jvmti, jclass klass) 
 {
     jdwpTypeTag refTypeTag = GetClassManager().GetJdwpTypeTag(klass);
 
@@ -735,18 +787,24 @@
     char* generic = 0;
 
     jvmtiError err;
-    JVMTI_TRACE(err, jvmti->GetClassSignature(klass, &signature, &generic));
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassSignature(klass, &signature, &generic));
 
     JvmtiAutoFree dobjs(signature);
     JvmtiAutoFree dobjg(generic);
 
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     jint status;
-    JVMTI_TRACE(err, jvmti->GetClassStatus(klass, &status));
-    if (err != JVMTI_ERROR_NONE)
-        throw AgentException(err);
+    JVMTI_TRACE(LOG_DEBUG, err, jvmti->GetClassStatus(klass, &status));
+    if (err != JVMTI_ERROR_NONE){
+        AgentException e(err);
+		JDWP_SET_EXCEPTION(e);
+        return err;
+    }
 
     // According to JVMTI spec ClassStatus flag for arrays and primitive classes must be zero
     if (status == JVMTI_CLASS_STATUS_ARRAY || status == JVMTI_CLASS_STATUS_PRIMITIVE) {
@@ -756,7 +814,7 @@
         return 1;
     }
 
-    m_cmdParser->reply.WriteByte(refTypeTag);
+    m_cmdParser->reply.WriteByte((jbyte)refTypeTag);
     m_cmdParser->reply.WriteReferenceTypeID(jni_env, klass);
     m_cmdParser->reply.WriteString(signature);
 
@@ -766,9 +824,8 @@
         m_cmdParser->reply.WriteString("");
 
     m_cmdParser->reply.WriteInt(status);
-    JDWP_TRACE_DATA("AllClassesWithGeneric: typeTag=" << refTypeTag << ", refTypeID="
-         << klass << ", signature=" << JDWP_CHECK_NULL(signature) << ", generic=" 
-         << JDWP_CHECK_NULL(generic) << ", status=" << status);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "AllClassesWithGeneric: typeTag=%d, refTypeID=%p, signature=%s, generic=%s, status=%d", 
+                    refTypeTag, klass, JDWP_CHECK_NULL(signature), JDWP_CHECK_NULL(generic), status));
 
     return 0;
 }
@@ -777,26 +834,27 @@
 //-----------------------------------------------------------------------------
 //InstanceCountsHandler-------------------------------------------------
 
-void
-VirtualMachine::InstanceCountsHandler::Execute(JNIEnv *jni) throw(AgentException)
+int
+VirtualMachine::InstanceCountsHandler::Execute(JNIEnv *jni) 
 {
     jint refTypesCount = m_cmdParser->command.ReadInt();
     // Illegal argument
     if(refTypesCount < 0) {
-        throw AgentException(JDWP_ERROR_ILLEGAL_ARGUMENT);
+        AgentException e(JDWP_ERROR_ILLEGAL_ARGUMENT);
+		JDWP_SET_EXCEPTION(e);
+        return JDWP_ERROR_ILLEGAL_ARGUMENT;
     }
 
     m_cmdParser->reply.WriteInt(refTypesCount);
-    JDWP_TRACE_DATA("InstanceCounts: return the number of counts that follow:" << refTypesCount);
+    JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "InstanceCounts: return the number of counts that follow:%d", refTypesCount));
 
     // Number of reference types equals zero
     if(0 == refTypesCount) {
-        return;
+        return JDWP_ERROR_NONE;
     }
 
     jclass jvmClass;
     jvmtiError err;
-    char* signature = 0;
     // Tag is used to mark object which is reported in FollowReferences
     jlong tag_value = 0xffff;
     jlong tags[1] = {tag_value};
@@ -808,9 +866,9 @@
     memset(&hcbs, 0, sizeof(hcbs));
     hcbs.heap_iteration_callback = NULL;
     hcbs.heap_reference_callback = &HeapReferenceCallback;
-    hcbs.primitive_field_callback = &PrimitiveFieldCallback;
-    hcbs.array_primitive_value_callback = &ArrayPrimitiveValueCallback;
-    hcbs.string_primitive_value_callback = &StringPrimitiveValueCallback;
+    hcbs.primitive_field_callback = NULL;
+    hcbs.array_primitive_value_callback = NULL;
+    hcbs.string_primitive_value_callback = NULL;
 
     for(int i = 0; i < refTypesCount;i++) {
          jvmClass = m_cmdParser->command.ReadReferenceTypeID(jni);
@@ -818,38 +876,57 @@
         // JDWP_ERROR_INVALID_CLASS, JDWP_ERROR_INVALID_OBJECT
 #ifndef NDEBUG
         if (JDWP_TRACE_ENABLED(LOG_KIND_DATA)) {
-            JVMTI_TRACE(err, GetJvmtiEnv()->GetClassSignature(jvmClass, &signature, 0));
+            char* signature = 0;
+            JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetClassSignature(jvmClass, &signature, 0));
             JvmtiAutoFree afcs(signature);
-            JDWP_TRACE_DATA("SourceDebugExtension: received: refTypeID=" << jvmClass
-                << ", classSignature=" << JDWP_CHECK_NULL(signature));
+            JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "InstanceCounts: received: refTypeID=%p, classSignature=%s", jvmClass, JDWP_CHECK_NULL(signature)));
         }
 #endif
         
         //It initiates a traversal over the objects that are directly and indirectly reachable from the heap roots.
-        JVMTI_TRACE(err, GetJvmtiEnv()->FollowReferences(0, jvmClass,  NULL,
+        JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->FollowReferences(0, jvmClass,  NULL,
              &hcbs, &tag_value));
         if (err != JVMTI_ERROR_NONE) {
             // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_INVALID_CLASS
             // JVMTI_ERROR_INVALID_OBJECT, JVMTI_ERROR_NULL_POINTER 
-            throw AgentException(err);
+            AgentException e(err);
+		    JDWP_SET_EXCEPTION(e);
+            return err;
         }
 
+        jobject *pResultObjects = 0;
+
         // Return the instances that have been marked expected tag_value tag.
-        JVMTI_TRACE(err, GetJvmtiEnv()->GetObjectsWithTags(1, tags, &reachableInstancesNum,
-            NULL, NULL));
+        JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->GetObjectsWithTags(1, tags, &reachableInstancesNum,
+            &pResultObjects, NULL));
+		JvmtiAutoFree afResultObjects(pResultObjects);
   
         if (err != JVMTI_ERROR_NONE) {
             // Can be: JVMTI_ERROR_MUST_POSSESS_CAPABILITY, JVMTI_ERROR_ILLEGAL_ARGUMENT 
             // JVMTI_ERROR_ILLEGAL_ARGUMENT, JVMTI_ERROR_NULL_POINTER  
-            throw AgentException(err);
+            AgentException e(err);
+		    JDWP_SET_EXCEPTION(e);
+            return err;
         }
 
         m_cmdParser->reply.WriteLong(reachableInstancesNum);
-        JDWP_TRACE_DATA("InstanceCounts: return the number of instances for the corresponding  reference type:"
-            << reachableInstancesNum);
+        JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "InstanceCounts: return the number of instances for the corresponding  reference type:%d",
+                        reachableInstancesNum));
+	   //Set objects tags back to 0 
+       for(int i = 0; i < reachableInstancesNum; i++) {
+          JVMTI_TRACE(LOG_DEBUG, err, GetJvmtiEnv()->SetTag(pResultObjects[i], 0));
+          jni->DeleteLocalRef(pResultObjects[i]);
+          if (err != JVMTI_ERROR_NONE) {
+              AgentException e(err);
+	          JDWP_SET_EXCEPTION(e);
+              return err;
+          }
+        }
         // tag_value is changed to indicate instances of other types 
         tags[0] = ++tag_value;
     }
+
+    return JDWP_ERROR_NONE;
 }
 
 //-----------------------------------------------------------------------------

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/commands/VirtualMachine.h Thu Jul 16 15:57:37 2009
@@ -15,12 +15,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
-/**
- * @author Vitaly A. Provodin
- * @version $Revision: 1.6.2.1 $
- */
-
 /**
  * @file
  * VirtualMachine.h
@@ -54,7 +48,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };
 
@@ -71,11 +65,11 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         private:
             bool IsSignatureMatch(jclass klass, const char *signature)
-                throw(AgentException);
+                ;
 
         };//ClassesBySignatureHandler
 
@@ -92,7 +86,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
             /**
              * If the passed class (klass parameter) has status
@@ -109,8 +103,7 @@
              * @return 0 on success,
              *         1 otherwise.
              */
-            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
-                                            throw (AgentException);
+            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass);
 
         };//AllClassesHandler
 
@@ -127,7 +120,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//AllThreadsHandler
 
@@ -144,7 +137,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//TopLevelThreadGroupsHandler
 
@@ -161,7 +154,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//DisposeHandler
 
@@ -178,7 +171,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//IDSizesHandler
 
@@ -195,7 +188,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//SuspendHandler
 
@@ -212,7 +205,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//ResumeHandler
 
@@ -229,7 +222,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//ExitHandler
 
@@ -246,7 +239,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//CreateStringHandler
 
@@ -263,7 +256,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//CapabilitiesHandler
 
@@ -280,11 +273,11 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         private:
             void WritePathStrings(char *str, char pathSeparator)
-                throw(AgentException);
+                ;
 
         };//ClassPathsHandler
 
@@ -301,7 +294,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//DisposeObjectsHandler
 
@@ -318,7 +311,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//HoldEventsHandler
 
@@ -335,7 +328,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//ReleaseEventsHandler
 
@@ -352,7 +345,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//CapabilitiesNewHandler
 
@@ -369,7 +362,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//RedefineClassesHandler
 
@@ -386,7 +379,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//SetDefaultStratumHandler
 
@@ -412,8 +405,7 @@
              * @return 0 on success,
              *         1 otherwise.
              */
-            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass)
-                                            throw (AgentException);
+            virtual int Compose41Class(JNIEnv *jni, jvmtiEnv* jvmti, jclass klass);
 
         };//AllClassesWithGenericHandler
 
@@ -431,7 +423,7 @@
              *
              * @param jni - the JNI interface pointer
              */
-            virtual void Execute(JNIEnv *jni) throw(AgentException);
+            virtual int Execute(JNIEnv *jni) ;
 
         };//InstanceCountsHandler
     } // VirtualMachine