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 [14/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/nativ...

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.cpp Thu Jul 16 15:57:37 2009
@@ -16,16 +16,13 @@
  *  limitations under the License.
  */
 
-/**
- * @author Viacheslav G. Rybalov
- * @version $Revision: 1.14 $
- */
-// TransportManager.cpp
-//
-
-#include <string.h>
+#ifndef USING_VMI
+#define USING_VMI
 
 #include "TransportManager.h"
+#include "ExceptionManager.h"
+
+#include <string.h>
 
 using namespace jdwp;
 
@@ -57,35 +54,52 @@
     m_isServer = true;
     m_lastErrorMessage = 0;
     m_isConnected = false;
+    m_isCleaned = false;
 } //TransportManager::TransportManager()
 
 TransportManager::~TransportManager()
 {
+#if defined(WIN32) || defined(WIN64)
+    if (m_sendMonitor !=0) {
+        delete m_sendMonitor;
+        m_sendMonitor = 0;
+    }
+#endif
     if (m_address != 0) {
         GetMemoryManager().Free(m_address JDWP_FILE_LINE);
     }
     if (m_loadedLib != 0) {
-        jdwpTransport_UnLoad_Type UnloadFunc = reinterpret_cast<jdwpTransport_UnLoad_Type>
-                (GetProcAddress(m_loadedLib, unLoadDecFuncName)); 
+	    PORT_ACCESS_FROM_JAVAVM(GetJavaVM()); 
+        jdwpTransport_UnLoad_Type UnloadFunc = 0;
+		UDATA ret = hysl_lookup_name(m_loadedLib, (const char*) unLoadDecFuncName, (UDATA*) &UnloadFunc, "VL");
+        if (ret != 0) {
+	        ret = hysl_lookup_name(m_loadedLib, "jdwpTransport_UnLoad", (UDATA*) &UnloadFunc, "VL");
+        }
+	    //	reinterpret_cast<jdwpTransport_UnLoad_Type>
+        //        (GetProcAddress(m_loadedLib, unLoadDecFuncName)); 
         if ((UnloadFunc != 0) && (m_env != 0)) {
             (UnloadFunc) (&m_env); 
-        }
-        FreeLibrary(m_loadedLib); 
+		}
+		hysl_close_shared_library (m_loadedLib);
     }
 } //TransportManager::~TransportManager()
 
-void 
+int 
 TransportManager::Init(const char* transportName, 
-                const char* libPath) throw(TransportException)
+                const char* libPath)
 {
-    JDWP_TRACE_ENTRY("Init(" << JDWP_CHECK_NULL(transportName) << ',' << JDWP_CHECK_NULL(libPath) << ')');
+    JDWP_CHECK_NULL(transportName);
+    JDWP_CHECK_NULL(libPath);
+    JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Init(%s,%s)", transportName, libPath));
 
-    JDWP_TRACE_PROG("Init: transport=" << JDWP_CHECK_NULL(transportName )
-        << ", libPath=" << JDWP_CHECK_NULL(libPath));
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Init: transport=%s, libPath=%s", transportName, libPath));
 
     JDWP_ASSERT(m_loadedLib == 0);
+    PORT_ACCESS_FROM_JAVAVM(GetJavaVM());
     m_isConnected = false;
-
+#if defined(WIN32) || defined(WIN64)
+    m_sendMonitor = new AgentMonitor("_jdwp_send_waitMonitor");
+#endif
     m_transportName = transportName;
     const char* begin = libPath;
     do {
@@ -117,13 +131,19 @@
         }
         size_t length = strlen("Loading of  failed") + strlen(transportName) + 1;
         m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
-        sprintf(m_lastErrorMessage, "Loading of %s failed", transportName);
-        JDWP_ERROR("Loading of " << transportName << " failed");
-        throw TransportException(JDWP_ERROR_TRANSPORT_LOAD, JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        hystr_printf(privatePortLibrary, m_lastErrorMessage, (U_32)length, "Loading of %s failed", transportName);
+        JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, m_lastErrorMessage));
+        AgentException ex(JDWP_ERROR_TRANSPORT_LOAD,
+						   JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_TRANSPORT_LOAD;
     }
 
-    jdwpTransport_OnLoad_t transportOnLoad = reinterpret_cast<jdwpTransport_OnLoad_t>
-            (GetProcAddress(m_loadedLib, onLoadDecFuncName));
+    jdwpTransport_OnLoad_t transportOnLoad;
+    UDATA ret = hysl_lookup_name(m_loadedLib, (char*) onLoadDecFuncName, (UDATA*) &transportOnLoad, "ILLIL");
+    if (ret != 0) {
+	ret = hysl_lookup_name(m_loadedLib, "jdwpTransport_OnLoad", (UDATA*) &transportOnLoad, "ILLIL");
+    }
     if (transportOnLoad == 0) {
         if (m_lastErrorMessage != 0) {
             GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
@@ -131,10 +151,14 @@
         size_t length = strlen(" function not found in ") + strlen(transportName)
             + strlen(onLoadDecFuncName) + 1;
         m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
-        sprintf(m_lastErrorMessage, "%s function not found in %s", onLoadDecFuncName, transportName);
-        JDWP_ERROR(onLoadDecFuncName << " function not found in " << transportName);
-        throw TransportException(JDWP_ERROR_TRANSPORT_INIT, JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        hystr_printf(privatePortLibrary, m_lastErrorMessage, (U_32)length, "%s function not found in %s", onLoadDecFuncName, transportName);
+        JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, m_lastErrorMessage));
+        AgentException ex(JDWP_ERROR_TRANSPORT_INIT,
+						   JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_TRANSPORT_INIT;
     }
+ 
     jint res = (*transportOnLoad)(GetJavaVM(), &callback, JDWPTRANSPORT_VERSION_1_0, &m_env);
     if (res == JNI_ENOMEM) {
         if (m_lastErrorMessage != 0) {
@@ -142,17 +166,22 @@
         }
         size_t length = strlen("Out of memory");
         m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
-        sprintf(m_lastErrorMessage, "Out of memeory");
-        throw TransportException(JDWP_ERROR_OUT_OF_MEMORY);
+        hystr_printf(privatePortLibrary, m_lastErrorMessage, (U_32)length, "Out of memeory");
+        AgentException ex(JDWP_ERROR_OUT_OF_MEMORY);
+    	JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_OUT_OF_MEMORY;
     } else if (res != JNI_OK) {
         if (m_lastErrorMessage != 0) {
             GetMemoryManager().Free(m_lastErrorMessage JDWP_FILE_LINE);
         }
         size_t length = strlen("Invoking of  failed") + strlen(onLoadDecFuncName) + 1;
         m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
-        sprintf(m_lastErrorMessage, "Invoking of %s failed", onLoadDecFuncName);
-        JDWP_ERROR("Invoking of " << onLoadDecFuncName << " failed");
-        throw TransportException(JDWP_ERROR_TRANSPORT_INIT, JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        hystr_printf(privatePortLibrary, m_lastErrorMessage, (U_32)length, "Invoking of %s failed", onLoadDecFuncName);
+        JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, m_lastErrorMessage));
+        AgentException ex(JDWP_ERROR_TRANSPORT_INIT,
+						   JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_TRANSPORT_INIT;
     }
     if (m_env == 0) {
         if (m_lastErrorMessage != 0) {
@@ -160,24 +189,26 @@
         }
         size_t length = strlen("Transport provided invalid environment");
         m_lastErrorMessage = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
-        sprintf(m_lastErrorMessage, "Transport provided invalid environment");
-        JDWP_ERROR("Transport provided invalid environment");
-        throw TransportException(JDWP_ERROR_TRANSPORT_INIT, JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+        hystr_printf(privatePortLibrary, m_lastErrorMessage, (U_32)length, "Transport provided invalid environment");
+        JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, m_lastErrorMessage));
+        AgentException ex(JDWP_ERROR_TRANSPORT_INIT,
+						   JDWPTRANSPORT_ERROR_NONE, m_lastErrorMessage);
+    	JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_TRANSPORT_INIT;
     }
 
+    return JDWP_ERROR_NONE;
 } // TransportManager::Init()
 
-void 
+int 
 TransportManager::PrepareConnection(const char* address, bool isServer, 
-                jlong connectTimeout, jlong handshakeTimeout) throw(TransportException)
+                jlong connectTimeout, jlong handshakeTimeout)
 {
-    JDWP_TRACE_ENTRY("PrepareConnection(" << JDWP_CHECK_NULL(address) << ',' << isServer 
-        << ',' << connectTimeout << ',' << handshakeTimeout << ')');
+    JDWP_CHECK_NULL(address);
+    JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "PrepareConnection(%s,%s,%lld,%lld)", address, (isServer?"TRUE":"FALSE"), connectTimeout, handshakeTimeout));
     
-    JDWP_TRACE_PROG("PrepareConnection: address=" << JDWP_CHECK_NULL(address) 
-        << " connectTimeout=" << connectTimeout 
-        << " handshakeTimeout=" << handshakeTimeout 
-        << " isServer=" << isServer);
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "PrepareConnection: address=%s isServer=%s connectTimeout=%lld handshakeTimeout=%lld",
+                    address, (isServer?"TRUE":"FALSE"), connectTimeout, handshakeTimeout));
 
     JDWP_ASSERT((m_loadedLib != 0) && (!m_ConnectionPrepared));
 
@@ -189,22 +220,37 @@
 
     JDWPTransportCapabilities capabilities;
     jdwpTransportError err = m_env->GetCapabilities(&capabilities);
-    CheckReturnStatus(err);
-    if ((connectTimeout != 0) && isServer && (!capabilities.can_timeout_accept)) {
-        JDWP_INFO("Warning: transport does not support accept timeout");
+    if (err != JDWPTRANSPORT_ERROR_NONE) {
+        return CheckReturnStatus(err);
+    }
+
+    /*
+	if ((connectTimeout != 0) && isServer && (!capabilities.can_timeout_accept)) {
+        JDWP_TRACE(LOG_RELEASE, (LOG_INFO_FL, "Warning: transport does not support accept timeout"));
     }
     if ((connectTimeout != 0) && (!isServer) && (!capabilities.can_timeout_attach)) {
-        JDWP_INFO("Warning: transport does not support attach timeout");
+        JDWP_TRACE(LOG_RELEASE, (LOG_INFO_FL, "Warning: transport does not support attach timeout"));
     }
     if ((handshakeTimeout != 0) && (!capabilities.can_timeout_handshake)) {
-        JDWP_INFO("Warning: transport does not support handshake timeout");
+        JDWP_TRACE(LOG_RELEASE, (LOG_INFO_FL, "Warning: transport does not support handshake timeout"));
+    }
+	*/
+
+	// only print error message when all of handshake, accept and attach timeout can not be used.
+    if ((handshakeTimeout != 0) && (!capabilities.can_timeout_handshake) && (connectTimeout != 0)) {
+        if ((isServer && (!capabilities.can_timeout_accept)) || ((!isServer) && (!capabilities.can_timeout_attach))) {
+            JDWP_TRACE(LOG_RELEASE, (LOG_INFO_FL, "Warning: transport does not support timeouts"));
+        }
     }
 
     if (isServer) {
         err = m_env->StartListening(address, &m_address); 
-        CheckReturnStatus(err);
-        JDWP_INFO("transport is listening on " << m_address);
-        JDWP_TRACE_PROG("PrepareConnection: listening on " << m_address);
+        if (err != JDWPTRANSPORT_ERROR_NONE) {
+            return CheckReturnStatus(err);
+        }
+
+        JDWP_TRACE(LOG_RELEASE, (LOG_SIMPLE_FL, "Listening for transport %s at address: %s", m_transportName, m_address));
+        JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "PrepareConnection: listening on %s", m_address));
     } else {
         m_address = static_cast<char *>(GetMemoryManager().Allocate(strlen(address) + 1 JDWP_FILE_LINE));
         strcpy(m_address, address);
@@ -212,84 +258,145 @@
 
     m_ConnectionPrepared = true;
 
+    return JDWP_ERROR_NONE;
 } // TransportManager::PrepareConnection()
 
-void 
-TransportManager::Connect() throw(TransportException)
+int 
+TransportManager::Connect()
 {
     if (m_isConnected) {
-        return;
+        return JDWP_ERROR_NONE;
     }
 
-    JDWP_TRACE_PROG("Connect: isServer=" << m_isServer);
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Connect: isServer=%s", (m_isServer?"TRUE":"FALSE")));
     JDWP_ASSERT(m_ConnectionPrepared);
     jdwpTransportError err;
     if (m_isServer) {
-        err = m_env->Accept(m_connectTimeout, m_handshakeTimeout);
-        CheckReturnStatus(err);
+        if (strcmp("dt_shmem", m_transportName)) {
+            err = m_env->Accept(m_connectTimeout, m_handshakeTimeout);
+            if (err != JDWPTRANSPORT_ERROR_NONE) {
+                return CheckReturnStatus(err);
+            }
+        } else {
+            /*
+             * Work around: because Accept can't be interrupted by StopListening
+             * when use "dt_shmem", we use loop instead of blocking at Accept
+             */
+            jlong timeout = 100;
+            jlong total = m_connectTimeout;
+            while (m_connectTimeout == 0 || total > 0) {
+                if (m_isCleaned) {
+                    AgentException ex(JDWP_ERROR_TRANSPORT_INIT, JDWPTRANSPORT_ERROR_NONE, "Connection failed");
+                    JDWP_SET_EXCEPTION(ex);
+                    return JDWP_ERROR_TRANSPORT_INIT;
+                }
+
+                err = m_env->Accept(timeout, m_handshakeTimeout);
+
+                if (err == JDWPTRANSPORT_ERROR_NONE) {
+                    break;
+                }
+
+                if (err != JDWPTRANSPORT_ERROR_TIMEOUT) {
+                    return CheckReturnStatus(err);
+                }
+
+                total -= timeout;
+            }
+            if (err != JDWPTRANSPORT_ERROR_NONE) {
+                return CheckReturnStatus(err);
+            }
+        }
     } else {
         err = m_env->Attach(m_address, m_connectTimeout, m_handshakeTimeout);
-        CheckReturnStatus(err);
+        if (err != JDWPTRANSPORT_ERROR_NONE) {
+            return CheckReturnStatus(err);
+        }
     }
     m_isConnected = true;
-    JDWP_TRACE_PROG("Connect: connection established");
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Connect: connection established"));
+    return JDWP_ERROR_NONE;
 } // TransportManager::Connect()
 
-void 
-TransportManager::Launch(const char* command) throw(AgentException)
+int 
+TransportManager::Launch(const char* command)
 {
-    JDWP_TRACE_PROG("Launch: " << JDWP_CHECK_NULL(command));
+    JDWP_CHECK_NULL(command);
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Launch: %s", command));
     JDWP_ASSERT(m_ConnectionPrepared);
     const char* extra_argv[2];
     extra_argv[0] = m_transportName;
     extra_argv[1] = m_address;
-    StartDebugger(command, 2, extra_argv);
-    Connect();
+    int ret = StartDebugger(command, 2, extra_argv);
+    JDWP_CHECK_RETURN(ret);
+    ret = Connect();
+    return ret;
 } // TransportManager::Launch()
 
-void 
-TransportManager::Read(jdwpPacket* packet) throw(TransportException)
+int 
+TransportManager::Read(jdwpPacket* packet)
 {
     JDWP_ASSERT(m_ConnectionPrepared);
-    JDWP_TRACE_PACKET("read packet");
+    JDWP_TRACE(LOG_RELEASE, (LOG_PACKET_FL, "read packet"));
     jdwpTransportError err = m_env->ReadPacket(packet);
-    CheckReturnStatus(err);
+    if (err != JDWPTRANSPORT_ERROR_NONE) {
+        return CheckReturnStatus(err);
+    }
     TracePacket("rcvt", packet);
+    return JDWP_ERROR_NONE;
 } // TransportManager::Read()
 
-void 
-TransportManager::Write(const jdwpPacket *packet) throw(TransportException)
+int 
+TransportManager::Write(const jdwpPacket *packet)
 {
     JDWP_ASSERT(m_ConnectionPrepared);
-    JDWP_TRACE_PACKET("send packet");
-    jdwpTransportError err = m_env->WritePacket(packet);
-    CheckReturnStatus(err);
+    JDWP_TRACE(LOG_RELEASE, (LOG_PACKET_FL, "send packet"));
+    jdwpTransportError err;
+#if defined(WIN32) || defined(WIN64)
+    // work around: prevent different threads from sending data at the same time.
+    // This enables Harmony jdwp to work with RI dt_shmem.dll
+    {
+    MonitorAutoLock lock(m_sendMonitor JDWP_FILE_LINE);
+#endif
+    err = m_env->WritePacket(packet);
+#if defined(WIN32) || defined(WIN64)
+    }
+#endif
+    if (err != JDWPTRANSPORT_ERROR_NONE) {
+        return CheckReturnStatus(err);
+    }
     TracePacket("sent", packet);
+    return JDWP_ERROR_NONE;
 } // TransportManager::Write()
 
-void 
-TransportManager::Reset() throw(TransportException)
+int 
+TransportManager::Reset()
 {
-    JDWP_TRACE_PROG("Reset: close connection");
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Reset: close connection"));
     if(m_env != 0) {
         JDWP_ASSERT(m_ConnectionPrepared);
         jdwpTransportError err = m_env->Close();
-        CheckReturnStatus(err);
+        if (err != JDWPTRANSPORT_ERROR_NONE) {
+            return CheckReturnStatus(err);
+        }
     }
     m_isConnected = false;
-    JDWP_TRACE_PROG("Reset: connection closed");
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Reset: connection closed"));
+    return JDWP_ERROR_NONE;
 } // TransportManager::Reset()
 
 
 void 
-TransportManager::Clean() throw(TransportException)
+TransportManager::Clean()
 {
-    JDWP_TRACE_PROG("Clean: close connection and stop listening");
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Clean: close connection and stop listening"));
     if (m_env != 0) {
         m_env->Close();
         m_env->StopListening();
     }
-    JDWP_TRACE_PROG("Clean: connection closed and listening stopped");
+
+    m_isCleaned = true;
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Clean: connection closed and listening stopped"));
 } // TransportManager::Clean()
 
 bool 
@@ -307,7 +414,7 @@
 } // TransportManager::IsOpen()
 
 char* 
-TransportManager::GetLastTransportError() throw(TransportException)
+TransportManager::GetLastTransportError()
 {
     char* lastErrorMessage = 0;
     if (m_lastErrorMessage != 0) {
@@ -317,39 +424,86 @@
         JDWP_ASSERT(m_env != 0);
         m_env->GetLastError(&lastErrorMessage);
     }
-    JDWP_TRACE_PROG("GetLastTransportError: " << JDWP_CHECK_NULL(lastErrorMessage));
+    JDWP_CHECK_NULL(lastErrorMessage);
+    JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "GetLastTransportError: %s", lastErrorMessage));
     return lastErrorMessage;
 } // TransportManager::GetLastTransportError()
 
-void 
-TransportManager::CheckReturnStatus(jdwpTransportError err) throw(TransportException)
+/**
+ * Returns JDWP_ERROR_NONE if there is no error, an error value 
+ * otherwise 
+ */
+int
+TransportManager::CheckReturnStatus(jdwpTransportError err)
 {
-    if (err == JDWPTRANSPORT_ERROR_NONE) {
-        return;
-    }
     if (err == JDWPTRANSPORT_ERROR_OUT_OF_MEMORY) {
-        throw TransportException(JDWP_ERROR_OUT_OF_MEMORY, JDWPTRANSPORT_ERROR_OUT_OF_MEMORY);
+        AgentException ex(JDWP_ERROR_OUT_OF_MEMORY, JDWPTRANSPORT_ERROR_OUT_OF_MEMORY);
+        JDWP_SET_EXCEPTION(ex);
+        return JDWP_ERROR_OUT_OF_MEMORY;
     }
     char* lastErrorMessage = GetLastTransportError();
-    // AgentBase::GetMemoryManager().Free(lastErrorMessage JDWP_FILE_LINE);
-    throw TransportException(JDWP_ERROR_TRANSPORT_INIT, err, lastErrorMessage);
+    AgentException ex(JDWP_ERROR_TRANSPORT_INIT, err, lastErrorMessage);
+    JDWP_SET_EXCEPTION(ex);
+    return JDWP_ERROR_TRANSPORT_INIT;
 } // TransportManager::CheckReturnStatus()
 
 inline void 
 TransportManager::TracePacket(const char* message, const jdwpPacket* packet) 
 { 
     if (packet->type.cmd.flags & JDWPTRANSPORT_FLAGS_REPLY) { 
-        JDWP_TRACE_PACKET(message 
-                <<" length=" << packet->type.cmd.len 
-                << " Id=" << packet->type.cmd.id 
-                << " flag=REPLY" 
-                << " errorCode=" << (short)(packet->type.reply.errorCode));
+        JDWP_TRACE(LOG_RELEASE, (LOG_PACKET_FL, "%s length=%d id=%d flag=REPLY errorCode=%d",
+                          message, packet->type.cmd.len, packet->type.cmd.id, (short)(packet->type.reply.errorCode)));
     } else { 
-        JDWP_TRACE_PACKET(message 
-                <<" length=" << packet->type.cmd.len 
-                << " Id=" << packet->type.cmd.id 
-                << " flag=NONE"
-                << " cmdSet=" << (int)(packet->type.cmd.cmdSet) 
-                << " cmd=" << (int)(packet->type.cmd.cmd)); 
+        JDWP_TRACE(LOG_RELEASE, (LOG_PACKET_FL, "%s length=%d id=%d flag=NONE cmdSet=%d cmd=%d",
+                          message, packet->type.cmd.len, packet->type.cmd.id, (int)(packet->type.cmd.cmdSet), (int)(packet->type.cmd.cmd)));
+
     } 
 } // TransportManager::TracePacket()
+
+LoadedLibraryHandler TransportManager::LoadTransport(const char* dirName, const char* transportName)
+{
+//    JavaVM *vm = ((internalEnv*)env->functions->reserved1)->jvm;
+    PORT_ACCESS_FROM_JAVAVM(GetJavaVM());
+
+    JDWP_CHECK_NULL(dirName); JDWP_CHECK_NULL(transportName);
+    JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "LoadTransport(%s,%s)", dirName, transportName));
+
+    JDWP_ASSERT(transportName != 0);
+    char* transportFullName = 0;
+
+#ifdef WIN32
+    if (dirName == 0) {
+        size_t length = strlen(transportName) + 5;
+        transportFullName = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        hystr_printf(privatePortLibrary, transportFullName, (U_32)length, "%s.dll", transportName);
+    } else {
+        size_t length = strlen(dirName) + strlen(transportName) + 6;
+        transportFullName = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        hystr_printf(privatePortLibrary, transportFullName, (U_32)length, "%s\\%s.dll", dirName, transportName);
+    }
+#else
+    if (dirName == 0) {
+        size_t length = strlen(transportName) + 7;
+        transportFullName = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        hystr_printf(privatePortLibrary, transportFullName, length, "lib%s.so", transportName);
+    } else {
+        size_t length = strlen(dirName) + strlen(transportName) + 8;
+        transportFullName = static_cast<char *>(GetMemoryManager().Allocate(length JDWP_FILE_LINE));
+        hystr_printf(privatePortLibrary, transportFullName, length, "%s/lib%s.so", dirName, transportName);
+    }
+#endif
+//    AgentAutoFree afv(transportFullName JDWP_FILE_LINE);
+    UDATA res;
+    UDATA ret = hysl_open_shared_library(transportFullName,&res, FALSE);
+
+    if (ret != 0) {
+	JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "LoadTransport: loading library %s failed: %s)", transportFullName, hyerror_last_error_message()));
+        //JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "LoadTransport: loading library " << transportFullName << " failed (error code: " << GetLastTransportError() << ")"));
+        res = 0;
+    } else {
+        JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "LoadTransport: transport library %s loaded", transportFullName));
+    }
+    return (LoadedLibraryHandler)res;
+}
+
+#endif

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/TransportManager.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 Viacheslav G. Rybalov
- * @version $Revision: 1.10.2.1 $
- */
-
 /**
  * @file
  * TransportManager.h
@@ -30,14 +24,21 @@
 #ifndef _TRANSPORT_MANAGER_H_
 #define _TRANSPORT_MANAGER_H_
 
+
+#include "TransportManager_pd.h"
 #include "jdwpTransport.h"
 #include "AgentBase.h"
 #include "AgentException.h"
 #include "Log.h"
-#include "TransportManager_pd.h"
+#include "AgentMonitor.h"
+#include "vmi.h"
+#include "hythread.h"
+#include "hyport.h"
 
 namespace jdwp {
 
+typedef UDATA LoadedLibraryHandler;
+
     /**
      * The given class provides a high level interface with the JDWP transport.
      * At first the function Init() must be invoked. It loads and
@@ -68,8 +69,8 @@
          * @exception TransportException() - transport initialization
          *            error happens.
          */
-        void Init(const char* transportName, 
-                const char* libPath) throw(TransportException);
+        int Init(const char* transportName, 
+                const char* libPath);
 
         /**
          * Connection preparation. If the agent is server, then starts listening.
@@ -84,8 +85,8 @@
          *
          * @exception TransportException() - transport error happens.
          */
-        void PrepareConnection(const char* address, bool isServer, 
-                jlong connectTimeout, jlong handshakeTimeout) throw(TransportException);
+        int PrepareConnection(const char* address, bool isServer, 
+                jlong connectTimeout, jlong handshakeTimeout);
         
         /**
          * Establish connection with the debugger.
@@ -93,7 +94,7 @@
          *
          * @exception TransportException() - transport error happens.
          */
-        void Connect() throw(TransportException);
+        int Connect();
         
         /**
          * Launch the debugger and establish connection.
@@ -102,7 +103,7 @@
          *
          * @exception AgentException() - any error happens.
          */
-        void Launch(const char* command) throw(AgentException);
+        int Launch(const char* command);
         
         /**
          * The given function does a blocking read on an open connection.
@@ -112,7 +113,7 @@
          *
          * @exception TransportException() - transport error happens.
          */
-        void Read(jdwpPacket* packet) throw(TransportException);
+        int Read(jdwpPacket* packet);
         
         /**
          * Writes a JDWP packet to an open connection.
@@ -122,16 +123,16 @@
          * @exception TransportException() - transport error 
          *            happens.
          */
-        void Write(const jdwpPacket *packet) throw(TransportException);
+        int Write(const jdwpPacket *packet);
         
         /**
          * Close an open connection. The connection may be established again.
          * 
          * @exception TransportException() - transport error happens.
          */
-        void Reset() throw(TransportException);
+        int Reset();
 
-        void Clean() throw(TransportException);
+        void Clean();
         
         /**
          * Check the connection.
@@ -145,7 +146,7 @@
          *
          * @exception TransportException() - transport error happens.
          */
-        char* GetLastTransportError() throw(TransportException);
+        char* GetLastTransportError();
 
     protected:
 
@@ -155,14 +156,17 @@
         bool m_ConnectionPrepared;               // if true PrepareConnection done
         bool m_isConnected;                      // true if connection is established
         bool m_isServer;                         // is jdwp agent server or not
+        bool m_isCleaned;                        // is clean method is invoked
         const char* m_transportName;             // transport name
         char* m_address;                         // transport address
         jdwpTransportEnv* m_env;                 // jdwpTransport environment
         LoadedLibraryHandler m_loadedLib;        // transport library handler
         char* m_lastErrorMessage;                // last error message
-
-        void CheckReturnStatus(jdwpTransportError err) throw(TransportException);
-        void StartDebugger(const char* command, int extra_argc, const char* extra_argv[]) throw(AgentException);
+#if defined(WIN32) || defined(WIN64)
+	AgentMonitor* m_sendMonitor;
+#endif
+        int CheckReturnStatus(jdwpTransportError err);
+        int StartDebugger(const char* command, int extra_argc, const char* extra_argv[]);
         void TracePacket(const char* message, const jdwpPacket* packet);
         LoadedLibraryHandler LoadTransport(const char* dirName, const char* transportName);
 

Added: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Util.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Util.h?rev=794726&view=auto
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Util.h (added)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Util.h Thu Jul 16 15:57:37 2009
@@ -0,0 +1,320 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * @file
+ * Util.h
+ *
+ * Add some util classes to replace C++ STL
+ */
+
+#ifndef _UTIL_H_
+#define _UTIL_H_
+#define JDWP_DEFAULT_VECTOR_SIZE 32
+
+#include "stdlib.h"
+#include "string.h"
+#include "jni.h"
+#include "PacketParser.h"
+
+namespace jdwp{
+     // element in queue
+     template <class U>
+     struct Element {
+         U* element;
+         Element* previous;
+         Element* next;
+     };
+
+     // A queue/deque class for jdwp use
+     class JDWPQueue {
+         private:
+         Element<EventComposer>* header;
+         Element<EventComposer>* tail;
+         jint queuesize;
+
+         public:
+
+         /**
+          * A constructor.
+          * Creates a new instance.
+          *
+          */
+         JDWPQueue(){
+            header = NULL;
+            tail = NULL;
+            queuesize = 0;
+         }
+
+         /**
+          * A destructor.
+          * Destroys the given instance.
+         */
+         ~JDWPQueue(){
+            clear();
+         }
+
+         void clear(){
+             Element<EventComposer>* delp, * walkp = header;
+             while((delp = walkp) != NULL){
+                walkp = walkp->next;
+                free(delp);
+             }
+	     header = tail = NULL;
+             queuesize = 0;
+         }
+
+         bool empty(){
+             return queuesize == 0;
+         }
+
+         EventComposer* front(){
+            if (header != NULL){
+                 return header->element;
+            }
+            return NULL;
+         }
+
+         void pop(){
+             Element<EventComposer>* ret = header;
+             if (queuesize > 0){
+                header = header->next;
+                if (header != NULL){
+                    header->previous = NULL;
+                } else {
+		    // the list is empty, the tail is null as the header 
+                    tail = NULL;
+		}
+                queuesize--;
+		free(ret);
+             }
+         }
+
+         jint size(){
+             return queuesize;
+         }
+
+         void push(EventComposer* ec){
+             Element<EventComposer>* newElement = (Element<EventComposer>*)malloc(sizeof(Element<EventComposer>));
+             newElement->element = ec;
+             newElement->next = NULL;
+
+             if (tail == NULL){
+                // header should be null as well    
+                tail = header = newElement;
+                header->previous = NULL;
+             } else {
+                newElement->previous = tail;
+                tail->next = newElement;
+                tail = newElement;
+	     }
+             queuesize ++;
+         }
+     };
+
+     // a simple jdwp vector, replace the standard lib one.
+     // WARNING: only for current JDWP using now, no guarantee its correctness for new functions.
+     template <class T>
+     class JDWPVector {
+
+         private:
+         T** elements;
+         jint vectorsize;
+	 jint vectorcount;
+	
+         public:
+         // a simple jdwp vector iterator, replace the standard lib one.
+         // WARNING: only for current JDWP using now, no guarantee its correctness for new functions.
+	 // WARNING: it do not check the synchronization of its vector
+	 class iterator{
+		 private:
+                        int currentIndex;
+			JDWPVector* vector;
+	         public:
+			iterator(JDWPVector* const jvector){
+                                 vector = jvector;
+                                 currentIndex = 0;
+			}
+
+			T* getNext(){
+				if (currentIndex < vector->vectorcount){
+				        T* ret = vector->getIndexof(currentIndex);
+					currentIndex ++;
+					return ret;
+				}
+				return NULL;
+			}
+
+			bool hasNext(){
+				if (currentIndex < vector->vectorcount){
+					return true;
+				}
+				// Tricky here: make hasCurrent correct here.
+				// In iterator search, we call hasNext before getNext
+				// however, if check hasNext is false, we should set 
+				// hasCurrent to false to show we've searched the whole iterator
+				currentIndex++;
+				return false;
+			}
+
+			// Note: c++ iterator is different from java vection, it can take current element
+			// again and again, in this case we can check if we have a current element, then
+			// use getCurrent()
+			bool hasCurrent(){
+                                return (currentIndex >0 && currentIndex <= vector->vectorcount);
+			}
+
+			T* getCurrent(){
+				return vector->getIndexof(currentIndex -1);
+			}
+
+			jint getIndex(){
+				return currentIndex - 1;
+			}
+
+			// avoid a compiler error, reset this iterator
+			void reset(){
+				currentIndex = 0;
+			}
+
+			// do not move pointer
+			void remove(){
+				vector->remove(currentIndex - 1);
+				backwards();
+			}
+
+			// step back
+			// Warning: no check here, for inner use only
+			void backwards(){
+				currentIndex --;
+			}
+
+	 };
+
+         /**
+          * A constructor.
+          * Creates a new instance.
+          *
+          */
+         JDWPVector(){
+	    // default size
+            vectorsize = JDWP_DEFAULT_VECTOR_SIZE;
+            vectorcount = 0;
+            elements = (T**) malloc(sizeof(T*)*vectorsize);
+         }
+
+         /**
+          * A destructor.
+          * Destroys the given instance.
+         */
+         ~JDWPVector(){
+             free(elements);
+             vectorsize = 0;
+             vectorcount = 0;
+         }
+
+	 // WARNING: no check if the slot is empty
+	 void insert(int index, T* in){
+            //T* newElement = (T*)malloc(sizeof(T));
+            //memcpy(newElement,in,sizeof(T));
+	    elements[index] = in;
+	 }
+
+	 // learn from  c++ vector, clear a slot but do not delete
+	 void insertNULL(int index){
+            elements[index] = NULL;
+	 }
+
+	 T* getIndexof(int index){
+	    return elements[index];
+	 }
+
+         void clear(){
+	     free(elements);
+             vectorsize = JDWP_DEFAULT_VECTOR_SIZE;
+             vectorcount = 0;
+             elements = (T**) malloc(sizeof(T*)*vectorsize);
+         }
+
+        bool empty(){
+             return vectorcount == 0;
+        }
+
+	T* back(){
+	     return getIndexof(vectorcount-1);
+	}
+
+	iterator begin(){
+	     return iterator(this);
+	}
+
+        jint size(){
+            return vectorcount;
+        }
+
+        void push_back(T* ec){
+           //T* newElement = (T*)malloc(sizeof(T));
+           //memcpy(newElement,ec,sizeof(T));
+           if (vectorcount >= vectorsize*0.75){
+		// vector is full, extends the vector
+                vectorsize = vectorsize << 1;
+                T** newelements = (T**) malloc(sizeof(T *)*vectorsize);
+		for (jint i = 0; i < vectorcount; i++){
+                    newelements[i] = elements[i];
+                }
+	        free(elements);
+		elements = newelements;
+           }
+           elements[vectorcount] = ec;
+           vectorcount++;
+        }
+
+	void pop_back(){
+		remove(vectorcount-1);
+	}
+
+	 // delete an vector element related to the iterator current element
+	void erase(iterator iter){
+	     jint eraseIndex = iter.getIndex();
+             remove(eraseIndex);
+        }
+
+	void remove(int eraseIndex){
+             if ((vectorcount<<2) < vectorsize && vectorsize > JDWP_DEFAULT_VECTOR_SIZE){
+		    // vector has too small elements, compact the vector
+		    vectorsize = vectorsize >> 1;
+                    T** newelements = (T**) malloc(sizeof(T *)*vectorsize);
+                    jint i = 0;
+		    for (; i < eraseIndex; i++){
+                        newelements[i] = elements[i];
+                    }
+		    for (; i < vectorcount - 1; i++){
+                        newelements[i] = elements[i+1];
+                    }
+	            free(elements);
+		    elements = newelements;
+	     } else {
+		    for (jint i = eraseIndex ; i < vectorcount - 1; i++){
+                        elements[i] = elements[i+1];
+                    }
+	     }
+             vectorcount--;
+	 }
+     };
+}
+#endif //_UTIL_H_

Propchange: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/Util.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/jdwpTypes.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/jdwpTypes.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/jdwpTypes.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/jdwpTypes.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 Pavel N. Vyssotski
- * @version $Revision: 1.7.2.1 $
- */
-
 /**
  * @file
  * jdwpTypes.h
@@ -33,9 +27,6 @@
 #include "jni.h"
 #include "jdwp.h"
 
-// Defined to parse bytes order for x86 platform
-#define IS_BIG_ENDIAN_PLATFORM 1
-
 namespace jdwp {
 
     typedef jlong FieldID;

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/generic/jdwp.h Thu Jul 16 15:57:37 2009
@@ -32,7 +32,7 @@
 
 /* JDWP Version */
 #define JDWP_VERSION_MAJOR 1
-#define JDWP_VERSION_MINOR 5
+#define JDWP_VERSION_MINOR 6
 
 /* General JDWP constants */
 #define JDWP_FLAG_REPLY_PACKET ((jbyte)0x80)

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.cpp?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.cpp (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.cpp Thu Jul 16 15:57:37 2009
@@ -16,18 +16,41 @@
  *  limitations under the License.
  */
 
-/**
- * @author Viacheslav G. Rybalov
- * @version $Revision: 1.6 $
- */
+#ifndef USING_VMI
+#define USING_VMI
+#endif
+
 #include "LastTransportError.h"
+#include "hyport.h"
+#include "vmi.h"
+#include "hythread.h"
+
+#include <string.h>
 
 void (*LastTransportError::m_free)(void *buffer) = 0;
 
-LastTransportError::LastTransportError(const char* messagePtr, int errorStatus, 
+static inline ThreadId_t
+_GetCurrentThreadId(JavaVM *jvm)
+{
+    ThreadId_t tid;
+#ifdef HY_NO_THR
+    THREAD_ACCESS_FROM_JAVAVM(jvm);
+#endif /* HY_NO_THR */
+    hythread_attach(&tid);
+    return tid;
+} // GetCurrentThreadId()
+
+
+static inline bool ThreadId_equal(ThreadId_t treadId1, ThreadId_t treadId2)
+{
+    return (treadId1 == treadId2);
+} // ThreadId_equal()
+
+LastTransportError::LastTransportError(JavaVM *jvm, const char* messagePtr, int errorStatus, 
         void* (*alloc)(jint numBytes), void (*free)(void *buffer))
 {
-    m_treadId = GetCurrentThreadId();
+    m_jvm = jvm;
+    m_treadId = _GetCurrentThreadId(m_jvm);
     m_lastErrorMessage = messagePtr;
     m_lastErrorMessagePrefix = "";
     m_lastErrorStatus = errorStatus;
@@ -65,14 +88,15 @@
 jdwpTransportError
 LastTransportError::insertError(const char* messagePtr, int errorStatus)
 {
-    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+
+    if (ThreadId_equal(m_treadId, _GetCurrentThreadId(m_jvm))) {
         m_lastErrorMessage = messagePtr;
         m_lastErrorStatus = errorStatus;
         m_lastErrorMessagePrefix = "";
     } else if (m_next != 0) {
         return m_next->insertError(messagePtr, errorStatus);
     } else {
-        m_next = new(m_alloc, m_free) LastTransportError(messagePtr, errorStatus, m_alloc, m_free);
+        m_next = new(m_alloc, m_free) LastTransportError(m_jvm, messagePtr, errorStatus, m_alloc, m_free);
         if (m_next == 0) {
             return JDWPTRANSPORT_ERROR_OUT_OF_MEMORY;
         }
@@ -83,7 +107,7 @@
 jdwpTransportError 
 LastTransportError::addErrorMessagePrefix(const char* prefixPtr)
 {
-    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+    if (ThreadId_equal(m_treadId, _GetCurrentThreadId(m_jvm))) {
         m_lastErrorMessagePrefix = (prefixPtr == 0 ? "" : prefixPtr);
     } else if (m_next != 0) {
         return m_next->addErrorMessagePrefix(prefixPtr);
@@ -94,7 +118,7 @@
 int 
 LastTransportError::GetLastErrorStatus()
 {
-    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+    if (ThreadId_equal(m_treadId, _GetCurrentThreadId(m_jvm))) {
         return m_lastErrorStatus;
     } else if (m_next != 0) {
         return m_next->GetLastErrorStatus();
@@ -105,9 +129,11 @@
 char* 
 LastTransportError::GetLastErrorMessage() 
 {
-    if (ThreadId_equal(m_treadId, GetCurrentThreadId())) {
+    PORT_ACCESS_FROM_JAVAVM(m_jvm);
+
+    if (ThreadId_equal(m_treadId, _GetCurrentThreadId(m_jvm))) {
         char buf[32];
-        sprintf(buf, "%d", m_lastErrorStatus);
+        hystr_printf(privatePortLibrary, buf, 32, "%d", m_lastErrorStatus);
 
         size_t strLength = (m_lastErrorStatus == 0) ? 
             strlen(m_lastErrorMessagePrefix) + strlen(m_lastErrorMessage) + 1 :
@@ -119,9 +145,9 @@
         }
 
         if (m_lastErrorStatus == 0) {
-            sprintf(message, "%s%s", m_lastErrorMessagePrefix, m_lastErrorMessage);
+            hystr_printf(privatePortLibrary, message, (U_32)strLength, "%s%s", m_lastErrorMessagePrefix, m_lastErrorMessage);
         } else {
-            sprintf(message, "%s%s (error code: %s)", m_lastErrorMessagePrefix, m_lastErrorMessage, buf);
+            hystr_printf(privatePortLibrary, message, (U_32)strLength, "%s%s (error code: %s)", m_lastErrorMessagePrefix, m_lastErrorMessage, buf);
         }
         return message;
 

Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.h?rev=794726&r1=794725&r2=794726&view=diff
==============================================================================
--- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.h (original)
+++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/transport/common/LastTransportError.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 Viacheslav G. Rybalov
- * @version $Revision: 1.9.2.1 $
- */
-
 /**
  * @file
  * LastTransportError.h
@@ -29,9 +23,15 @@
 
 #ifndef _LASTTRANSPORTERROR_H
 #define _LASTTRANSPORTERROR_H
-
+#if defined(ZOS)
+#define _XOPEN_SOURCE  500
+#endif
+
+#include "jni.h"
+#include "jvmti.h"
+#include "hythread.h"
 #include "jdwpTransport.h"
-#include "LastTransportError_pd.h"
+typedef hythread_t ThreadId_t;
 
 /**
  * The given class is a container for message and status code of the last 
@@ -51,7 +51,7 @@
      * @param free        - the pointer to the function deallocating the memory 
      *                      area 
      */
-    LastTransportError(const char* messagePtr, int errorStatus, 
+    LastTransportError(JavaVM *jvm, const char* messagePtr, int errorStatus, 
         void* (*alloc)(jint numBytes), void (*free)(void *buffer));
 
     /**
@@ -103,6 +103,7 @@
     void operator delete(void* address, void* (*alloc)(jint numBytes), void (*free)(void *buffer));
 
 private:
+    JavaVM *m_jvm;
     ThreadId_t m_treadId;             // the thread Id
     const char* m_lastErrorMessage;   // diagnostics for the last failed operation 
     const char* m_lastErrorMessagePrefix;   // diagnostics prefix for the last failed operation