Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 25833 invoked from network); 16 Jul 2009 15:57:42 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 Jul 2009 15:57:42 -0000 Received: (qmail 10007 invoked by uid 500); 16 Jul 2009 15:58:48 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 9977 invoked by uid 500); 16 Jul 2009 15:58:48 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 9775 invoked by uid 99); 16 Jul 2009 15:58:47 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jul 2009 15:58:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jul 2009 15:58:33 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 5BEDE23889B4; Thu, 16 Jul 2009 15:57:47 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r794726 [9/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... Date: Thu, 16 Jul 2009 15:57:41 -0000 To: commits@harmony.apache.org From: odeakin@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090716155747.5BEDE23889B4@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.cpp?rev=794726&r1=794725&r2=794726&view=diff ============================================================================== --- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.cpp (original) +++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.cpp Thu Jul 16 15:57:37 2009 @@ -16,16 +16,7 @@ * limitations under the License. */ -/** - * @author Anatoly F. Bondarenko - * @version $Revision: 1.17 $ - */ - -// ObjectManager.cpp - implementation of 'class ObjectManager :public AgentBase' // Provide mapping between JDWP IDs and corresponding JVMTI, JNI data types - -#include - #include "jni.h" #include "jvmti.h" #include "jdwp.h" @@ -33,11 +24,13 @@ #include "AgentBase.h" #include "AgentEnv.h" #include "MemoryManager.h" -#include "AgentException.h" +#include "ExceptionManager.h" #include "Log.h" #include "ObjectManager.h" +#include + using namespace jdwp; // ============================================================================= @@ -64,19 +57,56 @@ const ObjectID FREE_OBJECTID_SIGN = -1; const ObjectID OBJECTID_MINIMUM = 1; -ObjectID ObjectManager::MapToObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject) throw (AgentException) { - JDWP_TRACE_ENTRY("MapToObjectID(" << JNIEnvPtr << ',' << jvmObject << ')'); +jboolean ObjectManager::FindObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject, ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "FindObjectID(%p,%p,%lld)", JNIEnvPtr, jvmObject, objectID)); if (jvmObject == NULL) { - JDWP_TRACE_MAP("## MapToObjectID: map NULL jobject"); + JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "## FindObjectID: find NULL jobject")); + return false; + } + + // get object HASH CODE + jint hashCode = -1; + if (GetObjectHashCode(jvmObject, &hashCode) != JVMTI_ERROR_NONE) { + JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "## FindObjectID: GetObjectHashCode failed")); + return false; + } + + // get HASH INDEX + size_t idx = size_t(hashCode) & HASH_TABLE_MSK; + + // LOCK objectID table + MonitorAutoLock objectIDTableLock(m_objectIDTableMonitor JDWP_FILE_LINE); + + // find EXISTING objectID + ObjectIDItem* objectIDItem = m_objectIDTable[idx]; + ObjectIDItem* objectIDItemEnd = objectIDItem + m_maxAllocatedObjectID[idx]; + while (objectIDItem != objectIDItemEnd) { + if (objectIDItem->objectID != FREE_OBJECTID_SIGN && + JNIEnvPtr->IsSameObject(objectIDItem->mapObjectIDItem.jvmObject, jvmObject) == JNI_TRUE && + objectID == objectIDItem->objectID) { + JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "FindObjectID: find object, it is a valid object id")); + return true; + } + objectIDItem++; + } + return false; +} + + +ObjectID ObjectManager::MapToObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapToObjectID(%p,%p)", JNIEnvPtr, jvmObject)); + + if (jvmObject == NULL) { + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToObjectID: map NULL jobject")); return JDWP_OBJECT_ID_NULL; } // get object HASH CODE jint hashCode = -1; if (GetObjectHashCode(jvmObject, &hashCode) != JVMTI_ERROR_NONE) { - JDWP_TRACE_MAP("## MapToObjectID: GetObjectHashCode failed"); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToObjectID: GetObjectHashCode failed")); + return JDWP_OBJECT_ID_NULL; } // get HASH INDEX @@ -112,8 +142,8 @@ * suppose just this case is here */ JNIEnvPtr->ExceptionClear(); - JDWP_TRACE_MAP("## MapToObjectID: NewWeakGlobalRef returned NULL"); - throw OutOfMemoryException(); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToObjectID: NewWeakGlobalRef returned NULL")); + return JDWP_OBJECT_ID_NULL; } if (m_freeObjectIDItems[idx] == NULL) { // expand table @@ -148,8 +178,8 @@ return objectID; } // MapToObjectID() -jobject ObjectManager::MapFromObjectID(JNIEnv* JNIEnvPtr, ObjectID objectID) throw (AgentException) { - JDWP_TRACE_ENTRY("MapFromObjectID(" << JNIEnvPtr << ',' << objectID << ')'); +jobject ObjectManager::MapFromObjectID(JNIEnv* JNIEnvPtr, ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapFromObjectID(%p,%lld)", JNIEnvPtr, objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -158,8 +188,8 @@ // check decoded object ID if (objectID <= 0 || objectID > m_maxAllocatedObjectID[idx]) { // It is DEBUGGER ERROR: request for ObjectID which was never allocated - JDWP_TRACE_MAP("## MapFromObjectID: invalid object ID: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromObjectID: invalid object ID: %lld", objectID)); + return NULL; } // take object from table @@ -170,8 +200,8 @@ ObjectIDItem* objectIDItem = m_objectIDTable[idx] + objectID - 1; if (objectIDItem->objectID == FREE_OBJECTID_SIGN) { // It is DEBUGGER ERROR: Corresponding jobject is DISPOSED - JDWP_TRACE_MAP("## MapFromObjectID: corresponding jobject has been disposed: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromObjectID: corresponding jobject has been disposed: %lld", objectID)); + return NULL; } jvmObject = objectIDItem->mapObjectIDItem.jvmObject; } // synchronized block: objectIDTableLock @@ -179,15 +209,15 @@ // Check if corresponding jobject has been Garbage collected*/ if (JNIEnvPtr->IsSameObject(jvmObject, NULL) == JNI_TRUE) { // Corresponding jobject is Garbage collected - JDWP_TRACE_MAP("## MapFromObjectID: corresponding jobject has been Garbage collected: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromObjectID: corresponding jobject has been Garbage collected: %lld", objectID)); + return NULL; } return jvmObject; } // MapFromObjectID() -jboolean ObjectManager::IsValidObjectID(ObjectID objectID) throw () { - JDWP_TRACE_ENTRY("IsValidObjectID(" << objectID << ')'); +jboolean ObjectManager::IsValidObjectID(JNIEnv* JNIEnvPtr,ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "IsValidObjectID(%lld)", objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -199,20 +229,29 @@ return JNI_FALSE; } + jobject jvmObject; { // synchronized block: objectIDTableLock MonitorAutoLock objectIDTableLock(m_objectIDTableMonitor JDWP_FILE_LINE); ObjectIDItem* objectIDItem = m_objectIDTable[idx] + objectID - 1; if (objectIDItem->objectID == FREE_OBJECTID_SIGN) { - // this ObjectID is DISPOSED + // this ObjectID is DISPOSED + return JNI_FALSE; + } + jvmObject = objectIDItem->mapObjectIDItem.jvmObject; + } // synchronized block: objectIDTableLock + + // Check if corresponding jobject has been Garbage collected*/ + if (JNIEnvPtr->IsSameObject(jvmObject, NULL) == JNI_TRUE) { + // Corresponding jobject is Garbage collected + JDWP_TRACE(LOG_RELEASE, (LOG_DATA_FL, "## IsValidObjectID: corresponding jobject has been Garbage collected: %lld", objectID)); return JNI_FALSE; } - } // synchronized block: objectIDTableLock - + return JNI_TRUE; } // IsValidObjectID() -void ObjectManager::DisableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) throw (AgentException) { - JDWP_TRACE_ENTRY("DisableCollection(" << JNIEnvPtr << ',' << objectID << ')'); +int ObjectManager::DisableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "DisableCollection(%p,%lld)", JNIEnvPtr, objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -221,8 +260,10 @@ // check decoded object ID if (objectID <= 0 || objectID > m_maxAllocatedObjectID[idx]) { // It is DEBUGGER ERROR: request for ObjectID which was never allocated - JDWP_TRACE_MAP("## DisableCollection: invalid object ID: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisableCollection: invalid object ID: %lld", objectID)); + AgentException ex(JDWP_ERROR_INVALID_OBJECT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_INVALID_OBJECT; } { // synchronized block: objectIDTableLock @@ -230,36 +271,43 @@ ObjectIDItem* objectIDItem = m_objectIDTable[idx] + objectID - 1; if (objectIDItem->objectID == FREE_OBJECTID_SIGN) { // It is DEBUGGER ERROR: Corresponding jobject is DISPOSED - JDWP_TRACE_MAP("## DisableCollection: corresponding jobject has been disposed: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisableCollection: corresponding jobject has been disposed: %lld", objectID)); + AgentException ex(JDWP_ERROR_INVALID_OBJECT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_INVALID_OBJECT; } jobject jvmObject = objectIDItem->mapObjectIDItem.jvmObject; if (JNIEnvPtr->IsSameObject(jvmObject, NULL) == JNI_TRUE) { // Corresponding jobject is Garbage collected - JDWP_TRACE_MAP("## DisableCollection: corresponding jobject has been Garbage collected: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisableCollection: corresponding jobject has been Garbage collected: %lld", objectID)); + AgentException ex(JDWP_ERROR_INVALID_OBJECT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_INVALID_OBJECT; } if (objectIDItem->mapObjectIDItem.globalRefKind == NORMAL_GLOBAL_REF) { // Repeated request for DisableCollection - JDWP_TRACE_MAP("<= DisableCollection: corresponding jobject has a global reference"); - return; + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= DisableCollection: corresponding jobject has a global reference")); + return JDWP_ERROR_NONE; } jobject newGlobRef = JNIEnvPtr->NewGlobalRef(jvmObject); if (newGlobRef == NULL) { - JDWP_TRACE_MAP("## DisableCollection: NewGlobalRef returned NULL"); - throw OutOfMemoryException(); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisableCollection: NewGlobalRef returned NULL")); + AgentException ex(JDWP_ERROR_OUT_OF_MEMORY); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_OUT_OF_MEMORY; } - JNIEnvPtr->DeleteWeakGlobalRef(jvmObject); + JNIEnvPtr->DeleteWeakGlobalRef((jweak)jvmObject); objectIDItem->mapObjectIDItem.globalRefKind = NORMAL_GLOBAL_REF; objectIDItem->mapObjectIDItem.jvmObject = newGlobRef; } // synchronized block: objectIDTableLock + return JDWP_ERROR_NONE; } // DisableCollection() -void ObjectManager::EnableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) throw (AgentException) { - JDWP_TRACE_ENTRY("EnableCollection(" << JNIEnvPtr << ',' << objectID << ')'); +int ObjectManager::EnableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "EnableCollection(%p,%lld)", JNIEnvPtr, objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -268,13 +316,13 @@ // check decoded object ID if (objectID <= 0 || objectID > m_maxAllocatedObjectID[idx]) { /* It is DEBUGGER ERROR: request for ObjectID which was never allocated - * JDWP_TRACE_MAP("## EnableCollection: throw AgentException(JDWP_ERROR_INVALID_OBJECT)#1"); + * JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## EnableCollection: throw AgentException(JDWP_ERROR_INVALID_OBJECT)#1")); * throw AgentException(JDWP_ERROR_INVALID_OBJECT); * EnableCollection Command (ObjectReference Command Set) does not * assume INVALID_OBJECT reply - so simply return: */ - JDWP_TRACE_MAP("## EnableCollection: invalid object ID: " << objectID); - return; + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## EnableCollection: invalid object ID: %lld", objectID)); + return JDWP_ERROR_NONE; } { // synchronized block: objectIDTableLock @@ -286,15 +334,15 @@ * EnableCollection Command (ObjectReference Command Set) does not * assume INVALID_OBJECT reply - so simply return: */ - JDWP_TRACE_MAP("## EnableCollection: corresponding jobject has been disposed: " << objectID); - return; + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## EnableCollection: corresponding jobject has been disposed: %lld", objectID)); + return JDWP_ERROR_NONE;; } if (objectIDItem->mapObjectIDItem.globalRefKind == WEAK_GLOBAL_REF) { // Incorrect request for EnableCollection: // ObjectID is in EnableCollection state - JDWP_TRACE_MAP("<= EnableCollection: corresponding jobject has a weak reference"); - return; + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= EnableCollection: corresponding jobject has a weak reference")); + return JDWP_ERROR_NONE;; } jobject jvmObject = objectIDItem->mapObjectIDItem.jvmObject; @@ -306,25 +354,28 @@ */ if (JNIEnvPtr->ExceptionCheck() == JNI_TRUE) { JNIEnvPtr->ExceptionClear(); - JDWP_TRACE_MAP("## EnableCollection: NewWeakGlobalRef returned NULL due to OutOfMemoryException"); - throw OutOfMemoryException(); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## EnableCollection: NewWeakGlobalRef returned NULL due to OutOfMemoryException")); + AgentException ex(JDWP_ERROR_OUT_OF_MEMORY); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_OUT_OF_MEMORY; } /* else requested jobject is garbage collected * As EnableCollection Command (ObjectReference Command Set) does not * assume INVALID_OBJECT reply - so simply return: */ - JDWP_TRACE_MAP("## EnableCollection: NewWeakGlobalRef returned NULL"); - return; + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## EnableCollection: NewWeakGlobalRef returned NULL")); + return JDWP_ERROR_NONE; } JNIEnvPtr->DeleteGlobalRef(jvmObject); objectIDItem->mapObjectIDItem.globalRefKind = WEAK_GLOBAL_REF; objectIDItem->mapObjectIDItem.jvmObject = newWeakGlobRef; } // synchronized block: objectIDTableLock + return JDWP_ERROR_NONE; } // EnableCollection() -jboolean ObjectManager::IsCollectionDisabled(ObjectID objectID) throw (AgentException) { - JDWP_TRACE_ENTRY("IsCollectionDisabled(" << objectID << ')'); +/*jboolean ObjectManager::IsCollectionDisabled(ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "IsCollectionDisabled(%lld)", objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -335,8 +386,9 @@ // check decoded object ID if (objectID <= 0 || objectID > m_maxAllocatedObjectID[idx]) { // It is DEBUGGER ERROR: request for ObjectID which was never allocated - JDWP_TRACE_MAP("## IsCollectionDisabled: invalid object ID: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IsCollectionDisabled: invalid object ID: %lld", objectID)); + AgentException ex(JDWP_ERROR_INVALID_OBJECT); + THROW(ex); } jboolean result; @@ -345,8 +397,9 @@ ObjectIDItem* objectIDItem = m_objectIDTable[idx] + objectID - 1; if ( objectIDItem->objectID == FREE_OBJECTID_SIGN ) { // It is DEBUGGER ERROR: Corresponding jobject is DISPOSED - JDWP_TRACE_MAP("## IsCollectionDisabled: corresponding jobject has been disposed: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IsCollectionDisabled: corresponding jobject has been disposed: %lld", objectID)); + AgentException ex(JDWP_ERROR_INVALID_OBJECT); + THROW(ex); } result = JNI_FALSE; if (objectIDItem->mapObjectIDItem.globalRefKind != WEAK_GLOBAL_REF) { @@ -355,10 +408,10 @@ } // synchronized block: objectIDTableLock return result; -} // IsCollectionDisabled() +} // IsCollectionDisabled() */ -jboolean ObjectManager::IsCollected(JNIEnv* JNIEnvPtr, ObjectID objectID) throw (AgentException) { - JDWP_TRACE_ENTRY("IsCollected(" << JNIEnvPtr << ',' << objectID << ')'); +jboolean ObjectManager::IsCollected(JNIEnv* JNIEnvPtr, ObjectID objectID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "IsCollected(%p,%lld)", JNIEnvPtr, objectID)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -367,8 +420,8 @@ // check decoded object ID if (objectID <= 0 || objectID > m_maxAllocatedObjectID[idx]) { // It is DEBUGGER ERROR: request for ObjectID which was never allocated - JDWP_TRACE_MAP("## IsCollected: invalid object ID: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "## IsCollected: invalid object ID: %lld", objectID)); + return JNI_FALSE; } jobject jvmObject; @@ -378,8 +431,8 @@ ObjectIDItem* objectIDItem = m_objectIDTable[idx] + objectID - 1; if ( objectIDItem->objectID == FREE_OBJECTID_SIGN) { // It is DEBUGGER ERROR: Corresponding jobject is DISPOSED - JDWP_TRACE_MAP("## IsCollected: corresponding jobject has been disposed: " << objectID); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IsCollected: corresponding jobject has been disposed: %lld", objectID)); + return JNI_FALSE; } jvmObject = objectIDItem->mapObjectIDItem.jvmObject; @@ -387,15 +440,15 @@ if (JNIEnvPtr->IsSameObject(jvmObject, NULL) == JNI_TRUE) { // Corresponding jobject has been Garbage collected - JDWP_TRACE_MAP("<= IsCollected: JNI_TRUE"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= IsCollected: JNI_TRUE")); return JNI_TRUE; } return JNI_FALSE; } // IsCollected() -void ObjectManager::DisposeObject(JNIEnv* JNIEnvPtr, ObjectID objectID, jint refCount) throw () { - JDWP_TRACE_ENTRY("DisposeObject(" << JNIEnvPtr << ',' << objectID << ',' << refCount << ')'); +void ObjectManager::DisposeObject(JNIEnv* JNIEnvPtr, ObjectID objectID, jint refCount) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "DisposeObject(%p,%lld,%d)", JNIEnvPtr, objectID, refCount)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -407,7 +460,7 @@ * JDWP spec does NOT provide to return reply for this command * so do nothing */ - JDWP_TRACE_MAP("## DisposeObject: invalid object ID: " << objectID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisposeObject: invalid object ID: %lld", objectID)); return; } @@ -417,7 +470,7 @@ if (objectIDItem->objectID == FREE_OBJECTID_SIGN) { // It may be DEBUGGER ERROR: Corresponding jobject has been disposed already // - do nothing - JDWP_TRACE_MAP("## DisposeObject: corresponding jobject has been disposed: " << objectID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DisposeObject: corresponding jobject has been disposed: %lld", objectID)); return; } @@ -425,7 +478,7 @@ if (newRefCount > 0) { // Still early to dispose ObjectID objectIDItem->mapObjectIDItem.referencesCount = newRefCount; - JDWP_TRACE_MAP("<= DisposeObject: still positive ref count: " << newRefCount); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= DisposeObject: still positive ref count: %d", newRefCount)); return; } @@ -433,7 +486,7 @@ if (objectIDItem->mapObjectIDItem.globalRefKind == NORMAL_GLOBAL_REF) { JNIEnvPtr->DeleteGlobalRef(jvmObject); } else { - JNIEnvPtr->DeleteWeakGlobalRef(jvmObject); + JNIEnvPtr->DeleteWeakGlobalRef((jweak)jvmObject); } objectIDItem->objectID = FREE_OBJECTID_SIGN; objectIDItem->nextFreeObjectIDItem = m_freeObjectIDItems[idx]; @@ -442,8 +495,8 @@ } // DisposeObject() -jint ObjectManager::IncreaseIDRefCount(ObjectID objectID, jint incrementValue) throw () { - JDWP_TRACE_ENTRY("IncreaseIDRefCount(" << objectID << ',' << incrementValue << ')'); +jint ObjectManager::IncreaseIDRefCount(ObjectID objectID, jint incrementValue) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "IncreaseIDRefCount(%lld,%d)", objectID, incrementValue)); // decode object ID size_t idx = (size_t)objectID & HASH_TABLE_MSK; @@ -453,7 +506,7 @@ JDWP_ASSERT(objectID <= m_maxAllocatedObjectID[idx]); if (objectID == JDWP_OBJECT_ID_NULL) { // returned objectID is not real - it is possibly, so do nothing: - JDWP_TRACE_MAP("## IncreaseIDRefCount: invalid object ID: " << objectID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IncreaseIDRefCount: invalid object ID: %lld", objectID)); return 0; } @@ -463,7 +516,7 @@ * JDWP spec does NOT provide to return reply for this command * so do nothing */ - JDWP_TRACE_MAP("## IncreaseIDRefCount: invalid object ID: " << objectID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IncreaseIDRefCount: invalid object ID: %lld", objectID)); return 0; } @@ -474,7 +527,7 @@ if (objectIDItem->objectID == FREE_OBJECTID_SIGN) { // Corresponding jobject is DISPOSED - unlikely but possibly theoretically // so do nothing - JDWP_TRACE_MAP("## IncreaseIDRefCount: corresponding jobject has been disposed: " << objectID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## IncreaseIDRefCount: corresponding jobject has been disposed: %lld", objectID)); return 0; } newRefCount = objectIDItem->mapObjectIDItem.referencesCount + incrementValue; @@ -484,8 +537,8 @@ return newRefCount; } // IncreaseIDRefCount() -void ObjectManager::InitObjectIDMap() throw () { - JDWP_TRACE_ENTRY("InitObjectIDMap()"); +void ObjectManager::InitObjectIDMap() { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "InitObjectIDMap()")); memset(m_objectIDTableSize, 0, sizeof(m_objectIDTableSize)); memset(m_maxAllocatedObjectID, 0, sizeof(m_maxAllocatedObjectID)); @@ -493,8 +546,8 @@ memset(m_freeObjectIDItems, 0, sizeof(m_freeObjectIDItems)); } // InitObjectIDMap() -void ObjectManager::ResetObjectIDMap(JNIEnv* JNIEnvPtr) throw (AgentException) { - JDWP_TRACE_ENTRY("ResetObjectIDMap(" << JNIEnvPtr << ')'); +void ObjectManager::ResetObjectIDMap(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "ResetObjectIDMap(%p)", JNIEnvPtr)); for (size_t idx = 0; idx < HASH_TABLE_SIZE; idx++) { if (m_objectIDTable[idx]) { @@ -505,7 +558,7 @@ if (objectIDItem->mapObjectIDItem.globalRefKind == NORMAL_GLOBAL_REF) { JNIEnvPtr->DeleteGlobalRef(objectIDItem->mapObjectIDItem.jvmObject); } else { - JNIEnvPtr->DeleteWeakGlobalRef(objectIDItem->mapObjectIDItem.jvmObject); + JNIEnvPtr->DeleteWeakGlobalRef((jweak)objectIDItem->mapObjectIDItem.jvmObject); } } objectIDItem++; @@ -521,23 +574,19 @@ // Mapping: ReferenceTypeID <-> jclass (=> jobject) // Includes JDWP types: referenceTypeID, classID, interfaceID, arrayID -// Constant defining initial value for ReferenceTypeID to be different from -// ObjectID values -const ReferenceTypeID REFTYPEID_MINIMUM = 1000000000; - -ReferenceTypeID ObjectManager::MapToReferenceTypeID(JNIEnv* JNIEnvPtr, jclass jvmClass) throw (AgentException) { - JDWP_TRACE_ENTRY("MapToReferenceTypeID(" << JNIEnvPtr << ',' << jvmClass << ')'); +ReferenceTypeID ObjectManager::MapToReferenceTypeID(JNIEnv* JNIEnvPtr, jclass jvmClass) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapToReferenceTypeID(%p,%p)", JNIEnvPtr, jvmClass)); if (jvmClass == NULL) { - JDWP_TRACE_MAP("## MapToReferenceTypeID: map NULL jclass"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToReferenceTypeID: map NULL jclass")); return JDWP_OBJECT_ID_NULL; } // get object HASH CODE jint hashCode = -1; if (GetObjectHashCode(jvmClass, &hashCode) != JVMTI_ERROR_NONE) { - JDWP_TRACE_MAP("## MapToReferenceTypeID: GetObjectHashCode failed"); - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToReferenceTypeID: GetObjectHashCode failed")); + return JDWP_OBJECT_ID_NULL; } // get HASH INDEX @@ -570,8 +619,8 @@ * suppose just this case is here */ JNIEnvPtr->ExceptionClear(); - JDWP_TRACE_MAP("## MapToReferenceTypeID: NewWeakGlobalRef returned NULL due to OutOfMemoryException"); - throw OutOfMemoryException(); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToReferenceTypeID: NewWeakGlobalRef returned NULL due to OutOfMemoryException")); + return JDWP_OBJECT_ID_NULL; } // expand table if needed if (m_refTypeIDTableUsed[idx] == m_refTypeIDTableSize[idx]) @@ -593,8 +642,8 @@ } // MapToReferenceTypeID() jclass ObjectManager::MapFromReferenceTypeID(JNIEnv* JNIEnvPtr, - ReferenceTypeID refTypeID) throw (AgentException) { - JDWP_TRACE_ENTRY("MapFromReferenceTypeID(" << JNIEnvPtr << ',' << refTypeID << ')'); + ReferenceTypeID refTypeID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapFromReferenceTypeID(%p,%lld)", JNIEnvPtr, refTypeID)); refTypeID-= REFTYPEID_MINIMUM; jclass jvmClass; @@ -611,10 +660,12 @@ // check buffer index if (item >= m_refTypeIDTableUsed[idx]) { - if ( IsValidObjectID(refTypeID + REFTYPEID_MINIMUM) ) { - throw AgentException(JDWP_ERROR_INVALID_CLASS); + if ( IsValidObjectID(JNIEnvPtr, refTypeID + REFTYPEID_MINIMUM) ) { + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "## MapFromReferenceTypeID: class is invalid")); + return NULL; } else { - throw AgentException(JDWP_ERROR_INVALID_OBJECT); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "## MapFromReferenceTypeID: object is invalid")); + return NULL; } } @@ -622,30 +673,65 @@ // check if corresponding jclass has been Garbage collected if (JNIEnvPtr->IsSameObject(jvmClass, NULL) == JNI_TRUE) { - JDWP_TRACE_MAP("## MapFromReferenceTypeID: corresponding jclass has been Garbage collected"); - throw AgentException(JDWP_ERROR_INVALID_CLASS); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromReferenceTypeID: corresponding jclass has been Garbage collected")); + return NULL; } } // UNLOCK ReferenceTypeID table return jvmClass; -} // MapFromReferenceTypeID() +} // MapFromReferenceTypeID() + +jboolean ObjectManager::IsValidReferenceTypeID(JNIEnv* JNIEnvPtr,ObjectID refTypeID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "IsValidReferenceTypeID(%p,%lld)", JNIEnvPtr, refTypeID)); + + refTypeID-= REFTYPEID_MINIMUM; + jclass jvmClass; + + { // LOCK ReferenceTypeID table + + MonitorAutoLock refTypeIDTableLock(m_refTypeIDTableMonitor JDWP_FILE_LINE); + + // calculate hash index + // masking guarantees the index will be in the range [0..HASH_TABLE_SIZE-1] + size_t idx = (size_t)refTypeID & HASH_TABLE_MSK; -void ObjectManager::InitRefTypeIDMap() throw () { - JDWP_TRACE_ENTRY("InitRefTypeIDMap()"); + // calculate buffer index + size_t item = (size_t)refTypeID >> HASH_TABLE_IDX; + + // check buffer index + if (item < 0 || item >= m_refTypeIDTableUsed[idx]) { + return JNI_FALSE; + } + + jvmClass = m_refTypeIDTable[idx][item]; + + // check if corresponding jclass has been Garbage collected + if (JNIEnvPtr->IsSameObject(jvmClass, NULL) == JNI_TRUE) { + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromReferenceTypeID: corresponding jclass has been Garbage collected")); + return JNI_FALSE; + } + + } // UNLOCK ReferenceTypeID table + + return JNI_TRUE; +} // IsValidReferenceTypeID() + +void ObjectManager::InitRefTypeIDMap() { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "InitRefTypeIDMap()")); memset(m_refTypeIDTable, 0, sizeof(m_refTypeIDTable)); memset(m_refTypeIDTableSize, 0, sizeof(m_refTypeIDTableSize)); memset(m_refTypeIDTableUsed, 0, sizeof(m_refTypeIDTableUsed)); } // InitRefTypeIDMap() -void ObjectManager::ResetRefTypeIDMap(JNIEnv* JNIEnvPtr) throw (AgentException) { - JDWP_TRACE_ENTRY("ResetRefTypeIDMap(" << JNIEnvPtr << ')'); +void ObjectManager::ResetRefTypeIDMap(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "ResetRefTypeIDMap(%p)", JNIEnvPtr)); for (size_t idx = 0; idx < HASH_TABLE_SIZE; idx++) { if (m_refTypeIDTable[idx]) { for (size_t item = 0; item < m_refTypeIDTableUsed[idx]; item++) - JNIEnvPtr->DeleteWeakGlobalRef(m_refTypeIDTable[idx][item]); + JNIEnvPtr->DeleteWeakGlobalRef((jweak)m_refTypeIDTable[idx][item]); GetMemoryManager().Free(m_refTypeIDTable[idx] JDWP_FILE_LINE); m_refTypeIDTable[idx] = NULL; m_refTypeIDTableUsed[idx] = m_refTypeIDTableSize[idx] = 0; @@ -661,17 +747,17 @@ * FieldID (jlong) <-> jfieldID (_jfieldID*) */ -FieldID ObjectManager::MapToFieldID(JNIEnv* JNIEnvPtr, jfieldID jvmFieldID) throw () { - JDWP_TRACE_ENTRY("MapToFieldID(" << JNIEnvPtr << ',' << jvmFieldID << ')'); +FieldID ObjectManager::MapToFieldID(JNIEnv* JNIEnvPtr, jfieldID jvmFieldID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapToFieldID(%p,%p)", JNIEnvPtr, jvmFieldID)); FieldID fieldID = reinterpret_cast(jvmFieldID); return fieldID; } // MapToFieldID() -jfieldID ObjectManager::MapFromFieldID(JNIEnv* JNIEnvPtr, FieldID fieldID) throw () { - JDWP_TRACE_ENTRY("MapFromFieldID(" << JNIEnvPtr << ',' << fieldID << ')'); +jfieldID ObjectManager::MapFromFieldID(JNIEnv* JNIEnvPtr, FieldID fieldID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapFromFieldID(%p,%p)", JNIEnvPtr, fieldID)); - jfieldID jvmFieldID = reinterpret_cast(static_cast(fieldID)); + jfieldID jvmFieldID = (jfieldID)(fieldID); return jvmFieldID; } // MapFromFieldID() @@ -682,17 +768,17 @@ * MethodID (jlong) <-> jmethodID (_jmethodID*) */ -MethodID ObjectManager::MapToMethodID(JNIEnv* JNIEnvPtr, jmethodID jvmMethodID) throw () { - JDWP_TRACE_ENTRY("MapToMethodID(" << JNIEnvPtr << ',' << jvmMethodID << ')'); +MethodID ObjectManager::MapToMethodID(JNIEnv* JNIEnvPtr, jmethodID jvmMethodID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapToMethodID(%p,%p)", JNIEnvPtr, jvmMethodID)); MethodID methodID = reinterpret_cast(jvmMethodID); return methodID; } // MapToMethodID() -jmethodID ObjectManager::MapFromMethodID(JNIEnv* JNIEnvPtr, MethodID methodID) throw () { - JDWP_TRACE_ENTRY("MapFromMethodID(" << JNIEnvPtr << ',' << methodID << ')'); +jmethodID ObjectManager::MapFromMethodID(JNIEnv* JNIEnvPtr, MethodID methodID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapFromMethodID(%p,%lld)", JNIEnvPtr, methodID)); - jmethodID jvmMethodID = reinterpret_cast(static_cast(methodID)); + jmethodID jvmMethodID = (jmethodID)(methodID); return jvmMethodID; } // MapFromMethodID() @@ -711,7 +797,7 @@ const jlong FRAMEID_TABLE_INIT_SIZE = 128; // in ThreadFramesItem ObjectManager::ThreadFramesItem* ObjectManager::ExpandThreadFramesTable() - throw (AgentException) { + { if ( m_frameIDTableSize == 0 ) { m_frameIDTable = reinterpret_cast @@ -742,7 +828,7 @@ ObjectManager::ThreadFramesItem* ObjectManager::NewThreadFramesItem (JNIEnv* JNIEnvPtr, jthread jvmThread, jint framesCount) - throw (AgentException) { +{ ThreadFramesItem* threadFramesItem = m_frameIDTable; if ( m_freeItemsNumberInFrameIDTable == 0 ) { threadFramesItem = ExpandThreadFramesTable(); @@ -770,8 +856,8 @@ * suppose just this case is here */ JNIEnvPtr->ExceptionClear(); - JDWP_TRACE_MAP("## NewThreadFramesItem: OutOfMemoryException"); - throw OutOfMemoryException(); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## NewThreadFramesItem: OutOfMemoryException")); + return NULL; } threadFramesItem->jvmThread = newWeakGlobRef; @@ -784,9 +870,8 @@ FrameID ObjectManager::MapToFrameID(JNIEnv* JNIEnvPtr, jthread jvmThread, jint frameDepth, jint framesCount) - throw (AgentException) { - JDWP_TRACE_ENTRY("MapToFrameID(" << JNIEnvPtr << ',' << jvmThread - << ',' << frameDepth << ',' << framesCount << ')'); + { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapToFrameID(%p,%p,%d,%d)", JNIEnvPtr, jvmThread, frameDepth, framesCount)); /* according to the JDWP agent policy it is supposed that passed jvmThread * is JNI global reference so do not check if the jvmThread is garbage @@ -816,8 +901,8 @@ if ( (frameDepth < 0) || (frameDepth >= framesCount) ) { // passed frameDepth is INVALID "); - JDWP_TRACE_MAP("## MapToFrameID: JDWP_ERROR_INVALID_LENGTH#1"); - throw AgentException(JDWP_ERROR_INVALID_LENGTH); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToFrameID: JDWP_ERROR_INVALID_LENGTH#1")); + return 0; } threadFramesItem = NewThreadFramesItem(JNIEnvPtr, jvmThread, framesCount); // can be OutOfMemoryException, InternalErrorException @@ -825,8 +910,8 @@ if ( (frameDepth < 0) || (frameDepth >= threadFramesItem->framesCountOfThread) ) { // passed frameDepth is INVALID "); - JDWP_TRACE_MAP("## MapToFrameID: JDWP_ERROR_INVALID_LENGTH#2"); - throw AgentException(JDWP_ERROR_INVALID_LENGTH); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapToFrameID: JDWP_ERROR_INVALID_LENGTH#2")); + return 0; } } frameID = threadFramesItem->currentFrameID + frameDepth; @@ -835,8 +920,8 @@ } // MapToFrameID() -jint ObjectManager::MapFromFrameID(JNIEnv* JNIEnvPtr, FrameID frameID) throw (AgentException) { - JDWP_TRACE_ENTRY("MapFromFrameID(" << JNIEnvPtr << ',' << frameID << ')'); +jint ObjectManager::MapFromFrameID(JNIEnv* JNIEnvPtr, FrameID frameID) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "MapFromFrameID(%p,%lld)", JNIEnvPtr, frameID)); // searching for threadFramesItem for given FrameID jint frameIndex; @@ -859,20 +944,20 @@ } if ( tableIndex == m_frameIDTableSize ) { // threadFramesItem for given FrameID is not found out in table*/ - JDWP_TRACE_MAP("## MapFromFrameID: JDWP_ERROR_INVALID_FRAMEID"); - throw AgentException(JDWP_ERROR_INVALID_FRAMEID); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## MapFromFrameID: JDWP_ERROR_INVALID_FRAMEID")); + return 0; } frameIndex = static_cast(frameID - threadFramesItem->currentFrameID); } // synchronized block: frameIDTableLock return frameIndex; } // MapFromFrameID() -void ObjectManager::DeleteFrameIDs(JNIEnv* JNIEnvPtr, jthread jvmThread) throw () { - JDWP_TRACE_ENTRY("DeleteFrameIDs(" << JNIEnvPtr << ',' << jvmThread << ')'); +void ObjectManager::DeleteFrameIDs(JNIEnv* JNIEnvPtr, jthread jvmThread) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "DeleteFrameIDs(%p,%p)", JNIEnvPtr, jvmThread)); if ( JNIEnvPtr->IsSameObject(jvmThread, NULL) == JNI_TRUE ) { // jvmThread object is GARBAGE COLLECTED: possible case - do nothing - JDWP_TRACE_MAP("## DeleteFrameIDs: ignore NULL jthread"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "## DeleteFrameIDs: ignore NULL jthread")); return; } @@ -905,8 +990,8 @@ } // synchronized block: frameIDTableLock } // DeleteFrameIDs() -void ObjectManager::InitFrameIDMap() throw () { - JDWP_TRACE_ENTRY("InitFrameIDMap()"); +void ObjectManager::InitFrameIDMap() { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "InitFrameIDMap()")); m_frameIDTableSize = 0; m_freeItemsNumberInFrameIDTable = 0; @@ -914,8 +999,8 @@ m_maxAllocatedFrameID = 0; } // InitFrameIDMap() -void ObjectManager::ResetFrameIDMap(JNIEnv* JNIEnvPtr) throw (AgentException) { - JDWP_TRACE_ENTRY("ResetFrameIDMap(" << JNIEnvPtr << ')'); +void ObjectManager::ResetFrameIDMap(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "ResetFrameIDMap(%p)", JNIEnvPtr)); if ( m_frameIDTable != 0 ) { // delete all weak global references from frameIDTable @@ -927,7 +1012,7 @@ threadFramesItem++; continue; } - JNIEnvPtr->DeleteWeakGlobalRef(threadFramesItem->jvmThread); + JNIEnvPtr->DeleteWeakGlobalRef((jweak)threadFramesItem->jvmThread); threadFramesItem++; } AgentBase::GetMemoryManager().Free(m_frameIDTable JDWP_FILE_LINE); @@ -938,8 +1023,8 @@ // ============================================================================= -void ObjectManager::Init(JNIEnv* JNIEnvPtr) throw (AgentException) { - JDWP_TRACE_ENTRY("Init(" << JNIEnvPtr << ')'); +void ObjectManager::Init(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Init(%p)", JNIEnvPtr)); InitObjectIDMap(); InitRefTypeIDMap(); @@ -950,36 +1035,36 @@ // can be AgentException(jvmtiError err); } // Init() -void ObjectManager::Reset(JNIEnv* JNIEnvPtr) throw (AgentException) { - JDWP_TRACE_ENTRY("Reset(" << JNIEnvPtr << ')'); +void ObjectManager::Reset(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Reset(%p)", JNIEnvPtr)); if (m_objectIDTableMonitor != 0){ - JDWP_TRACE_MAP("=> m_objectIDTableMonitor "); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "=> m_objectIDTableMonitor ")); m_objectIDTableMonitor->Enter(); - JDWP_TRACE_MAP("<= m_objectIDTableMonitor"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= m_objectIDTableMonitor")); m_objectIDTableMonitor->Exit(); ResetObjectIDMap(JNIEnvPtr); // can be InternalErrorException } if (m_refTypeIDTableMonitor != 0) { - JDWP_TRACE_MAP("=> m_refTypeIDTableMonitor"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "=> m_refTypeIDTableMonitor")); m_refTypeIDTableMonitor->Enter(); - JDWP_TRACE_MAP("<= m_refTypeIDTableMonitor"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= m_refTypeIDTableMonitor")); m_refTypeIDTableMonitor->Exit(); ResetRefTypeIDMap(JNIEnvPtr); // can be InternalErrorException } if (m_frameIDTableMonitor != 0) { - JDWP_TRACE_MAP("=> m_frameIDTableMonitor"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "=> m_frameIDTableMonitor")); m_frameIDTableMonitor->Enter(); - JDWP_TRACE_MAP("<= m_frameIDTableMonitor"); + JDWP_TRACE(LOG_RELEASE, (LOG_MAP_FL, "<= m_frameIDTableMonitor")); m_frameIDTableMonitor->Exit(); ResetFrameIDMap(JNIEnvPtr); // can be InternalErrorException } } // Reset() -void ObjectManager::Clean(JNIEnv* JNIEnvPtr) throw () { - JDWP_TRACE_ENTRY("Clean(" << JNIEnvPtr << ')'); +void ObjectManager::Clean(JNIEnv* JNIEnvPtr) { + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Clean(%p)", JNIEnvPtr)); if (m_objectIDTableMonitor != 0) delete m_objectIDTableMonitor; @@ -989,7 +1074,7 @@ delete m_frameIDTableMonitor; } // Clean() -ObjectManager::ObjectManager () throw () +ObjectManager::ObjectManager () { m_objectIDTableMonitor = 0; m_refTypeIDTableMonitor = 0; @@ -1001,7 +1086,7 @@ #endif // NDEBUG } -ObjectManager::~ObjectManager () throw () { +ObjectManager::~ObjectManager () { } // ============================================================================= Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.h URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.h?rev=794726&r1=794725&r2=794726&view=diff ============================================================================== --- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.h (original) +++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/ObjectManager.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 Anatoly F. Bondarenko - * @version $Revision: 1.9.2.1 $ - */ - /** * @file * ObjectManager.h @@ -38,8 +32,15 @@ #include "jdwpTypes.h" #include "AgentMonitor.h" +#if defined(ZOS) +#include +#endif + namespace jdwp { + // Constant defining initial value for ReferenceTypeID to be different from ObjectID values + const ReferenceTypeID REFTYPEID_MINIMUM = 1000000000; + // hash table parameters enum { // hash table buffer incrementation value @@ -81,6 +82,20 @@ // Public primitives of Mapping // ========================================================================= public: + /** + * Find the JVM object of the type jobject in map + * according to JDWP identifier of the type ObjectID + * + * @param JNIEnvPtr - the JNI interface pointer used to call + * necessary JNI functions + * @param objectID - the JDWP identifier of the ObjectID + * type to be mapped. + * + * @return Returns true when get a same object identifer as the second + * parameter according to specified jobject, + * otherwise return false. + */ + jboolean FindObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject, ObjectID objectID); // Mapping: ObjectID <-> jobject // Includes the following JDWP types: objectID, threadID, @@ -123,8 +138,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - ObjectID MapToObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject) - throw (AgentException); + ObjectID MapToObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject); /** * Maps the JDWP identifier of the type ObjectID to the @@ -143,8 +157,7 @@ * or was disposed; or corresponding jvmObject * has been unloaded and garbage-collected. */ - jobject MapFromObjectID(JNIEnv* JNIEnvPtr, ObjectID objectID) - throw (AgentException); + jobject MapFromObjectID(JNIEnv* JNIEnvPtr, ObjectID objectID); /** * Changes a condition of corresponding jvmObject so, @@ -165,8 +178,7 @@ * if out-of-memory error has occurred during execution * of the given function. */ - void DisableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) - throw (AgentException); + int DisableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID); /** * Changes a condition of corresponding jvmObject so, that @@ -183,8 +195,7 @@ * out-of-memory error has occurred during execution of the * given function. */ - void EnableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID) - throw (AgentException); + int EnableCollection(JNIEnv* JNIEnvPtr, ObjectID objectID); /** * Checks if garbage collection is disabled for corresponding @@ -201,7 +212,7 @@ * if the given ObjectID was never allocated * or was disposed. */ - jboolean IsCollectionDisabled(ObjectID objectID) throw (AgentException); + //jboolean IsCollectionDisabled(ObjectID objectID); /** * Checks if corresponding jvmObject has been @@ -220,8 +231,7 @@ * if the given ObjectID was never allocated * or was disposed. */ - jboolean IsCollected(JNIEnv* JNIEnvPtr, ObjectID objectID) - throw (AgentException); + jboolean IsCollected(JNIEnv* JNIEnvPtr, ObjectID objectID); /** * Disposes corresponding jvmObject defining by given @@ -248,8 +258,7 @@ * enables to avoid a situation when the used * ObjectID can be disposed. */ - void DisposeObject(JNIEnv* JNIEnvPtr, ObjectID objectID, jint refCount) - throw (); + void DisposeObject(JNIEnv* JNIEnvPtr, ObjectID objectID, jint refCount); /** * Increases the count of references to given ObjectID @@ -265,8 +274,7 @@ * @return Returns the new value of the references count after * increasing. */ - jint IncreaseIDRefCount(ObjectID objectID, jint incrementValue = 1) - throw (); + jint IncreaseIDRefCount(ObjectID objectID, jint incrementValue = 1); // ========================================================================= // Mapping: ReferenceTypeID <-> jclass (=> jobject) @@ -308,8 +316,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - ReferenceTypeID MapToReferenceTypeID(JNIEnv* JNIEnvPtr, jclass jvmClass) - throw (AgentException); + ReferenceTypeID MapToReferenceTypeID(JNIEnv* JNIEnvPtr, jclass jvmClass); /** * Maps the JDWP identifier of the type ReferenceTypeID to @@ -330,8 +337,23 @@ * type or a corresponding JVM jclass has been unloaded and * garbage-collected. */ - jclass MapFromReferenceTypeID(JNIEnv* JNIEnvPtr, ReferenceTypeID refTypeID) - throw (AgentException); + jclass MapFromReferenceTypeID(JNIEnv* JNIEnvPtr, ReferenceTypeID refTypeID); + + /** + * Checks if the passed objID of JDWP identifier is a valid + * ReferenceTypeID, that is currently it represents in the JDI + * level the JVM reference type. + * + * @param JNIEnvPtr - the JNI interface pointer used to call + * necessary JNI functions + * @param objID - the JDWP identifier of the type + * ObjectID to be checked + * + * @return Returns the JNI_TRUE value if the passed + * objID is a valid ReferenceTypeID, + * JNI_FALSE otherwise. + */ + jboolean IsValidReferenceTypeID(JNIEnv* JNIEnvPtr,ObjectID objID); // ========================================================================= // Mapping: FieldID <-> jfieldID @@ -350,7 +372,7 @@ * @return Returns the JDWP identifier of the type FieldID * to which jvmFieldID is mapped. */ - FieldID MapToFieldID(JNIEnv* JNIEnvPtr, jfieldID jvmFieldID) throw (); + FieldID MapToFieldID(JNIEnv* JNIEnvPtr, jfieldID jvmFieldID); /** * Maps the JDWP identifier of the type FieldID to the @@ -364,7 +386,7 @@ * @return Returns the JVM identifier of the type jfieldID * to which fieldID is mapped. */ - jfieldID MapFromFieldID(JNIEnv* JNIEnvPtr, FieldID fieldID) throw (); + jfieldID MapFromFieldID(JNIEnv* JNIEnvPtr, FieldID fieldID); // ========================================================================= // Mapping: MethodID <-> jmethodID @@ -383,8 +405,7 @@ * @return Returns the JDWP identifier of the type MethodID to which * jvmMethodID is mapped. */ - MethodID MapToMethodID(JNIEnv* JNIEnvPtr, jmethodID jvmMethodID) - throw (); + MethodID MapToMethodID(JNIEnv* JNIEnvPtr, jmethodID jvmMethodID); /** * Maps the JDWP identifier of the type MethodID to the @@ -398,8 +419,7 @@ * @return Returns the JVM identifier of the type jmethodID to * which methodID is mapped to. */ - jmethodID MapFromMethodID(JNIEnv* JNIEnvPtr, MethodID methodID) - throw (); + jmethodID MapFromMethodID(JNIEnv* JNIEnvPtr, MethodID methodID); // ========================================================================= // Mapping: FrameID <-> jthread + depth (jint) @@ -439,8 +459,7 @@ * current stack frames. */ FrameID MapToFrameID(JNIEnv* JNIEnvPtr, jthread jvmThread, - jint frameDepth, jint framesCount) - throw (AgentException); + jint frameDepth, jint framesCount); /** * Maps the JDWP identifier of the type FrameID to the @@ -459,8 +478,7 @@ * identifier, that is it does not identify any stack frame * at the current moment. */ - jint MapFromFrameID(JNIEnv* JNIEnvPtr, FrameID frameID) - throw (AgentException); + jint MapFromFrameID(JNIEnv* JNIEnvPtr, FrameID frameID); /** * Deletes all JDWP frames' identifiers registered at present for the @@ -475,8 +493,7 @@ * defining the JVM thread, which FrameIDs * have to be deleted for */ - void DeleteFrameIDs(JNIEnv* JNIEnvPtr, jthread jvmThread) - throw (); + void DeleteFrameIDs(JNIEnv* JNIEnvPtr, jthread jvmThread); // ========================================================================= /** @@ -493,7 +510,7 @@ * @exception AgentException(jvmtiError) that * may be thrown by the AgentMonitor constructor. */ - void Init(JNIEnv* JNIEnvPtr) throw (AgentException); + void Init(JNIEnv* JNIEnvPtr); /** * Releases resources of the ObjectManager class instance @@ -509,7 +526,7 @@ * is the same as AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - void Reset(JNIEnv* JNIEnvPtr) throw (AgentException); + void Reset(JNIEnv* JNIEnvPtr); /** * Releases resources of the ObjectManager class instance @@ -519,17 +536,17 @@ * @param JNIEnvPtr - the JNI interface pointer used to call * necessary JNI functions */ - void Clean(JNIEnv* JNIEnvPtr) throw (); + void Clean(JNIEnv* JNIEnvPtr); /** * Constructor for the ObjectManager class instance. */ - ObjectManager() throw (); + ObjectManager(); /** * Destructor for the ObjectManager class instance. */ - ~ObjectManager () throw (); + ~ObjectManager (); // ========================================================================= @@ -635,7 +652,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - void ExpandObjectIDTable() throw (AgentException); + void ExpandObjectIDTable(); /** * Maps the JVM object of the type jobject to the JDWP @@ -658,14 +675,15 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - ObjectID MapToNewObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject) - throw (AgentException); + ObjectID MapToNewObjectID(JNIEnv* JNIEnvPtr, jobject jvmObject); /** * Checks if the passed ObjectID JDWP identifier is valid * ObjectID, that is currently it represents in the JDI * level the JVM object of the jobject type. * + * @param JNIEnvPtr - the JNI interface pointer used to call + * necessary JNI functions * @param objectID - the JDWP identifier of the type * ObjectID to be checked * @@ -673,14 +691,14 @@ * objectID is valid, JNI_FALSE * otherwise. */ - jboolean IsValidObjectID(ObjectID objectID) throw (); + jboolean IsValidObjectID(JNIEnv* JNIEnvPtr, ObjectID objectID); /** * Initializes the fields of the ObjectManager class used * for ObjectID values mapping. It is called by the * Init() function. */ - void InitObjectIDMap() throw (); + void InitObjectIDMap(); /** * Disposes all allocated ObjectID values and releases memory @@ -696,7 +714,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - void ResetObjectIDMap(JNIEnv* JNIEnvPtr) throw (AgentException); + void ResetObjectIDMap(JNIEnv* JNIEnvPtr); // ========================================================================= // Mapping: ReferenceTypeID <-> jclass @@ -728,7 +746,7 @@ * for ReferenceTypeIDs mapping. It is called by the * Init() function. */ - void InitRefTypeIDMap() throw (); + void InitRefTypeIDMap(); /** * Deletes all weak Global References for allocated @@ -744,7 +762,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - void ResetRefTypeIDMap(JNIEnv* JNIEnvPtr) throw (AgentException); + void ResetRefTypeIDMap(JNIEnv* JNIEnvPtr); // ========================================================================= // Mapping: FrameID <-> jthread + depth (jint) @@ -826,7 +844,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - ThreadFramesItem* ExpandThreadFramesTable() throw (AgentException); + ThreadFramesItem* ExpandThreadFramesTable(); /** * Allocates the new ThreadFramesItem to map the stack @@ -854,14 +872,13 @@ * unexpected internal JDWP agent error has occurred. */ ThreadFramesItem* NewThreadFramesItem(JNIEnv* JNIEnvPtr, - jthread jvmThread, jint framesCount) - throw (AgentException); + jthread jvmThread, jint framesCount); /** * Initializes the fields of the ObjectManager class used for * FrameIDs mapping. It is called by the Init() function. */ - void InitFrameIDMap() throw (); + void InitFrameIDMap(); /** * Releases memory from under the table of FrameIDs. @@ -876,7 +893,7 @@ * AgentException(JDWP_ERROR_INTERNAL) - if an * unexpected internal JDWP agent error has occurred. */ - void ResetFrameIDMap(JNIEnv* JNIEnvPtr) throw (AgentException); + void ResetFrameIDMap(JNIEnv* JNIEnvPtr); // ========================================================================= // ========================================================================= Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.cpp?rev=794726&r1=794725&r2=794726&view=diff ============================================================================== --- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.cpp (original) +++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.cpp Thu Jul 16 15:57:37 2009 @@ -15,31 +15,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @author Pavel N. Vyssotski - * @version $Revision: 1.7 $ - */ -// OptionParser.cpp - -#include - #include "AgentBase.h" #include "MemoryManager.h" -#include "AgentException.h" +#include "ExceptionManager.h" #include "Log.h" #include "OptionParser.h" +#include + using namespace jdwp; -using namespace std; -OptionParser::OptionParser() throw() +OptionParser::OptionParser() { m_optionCount = 0; m_optionString = 0; m_options = 0; m_help = false; + m_version = false; m_suspend = true; m_server = false; m_timeout = 0; @@ -53,28 +46,38 @@ m_launch = 0; } -bool OptionParser::AsciiToBool(const char *str) throw(IllegalArgumentException) +bool OptionParser::IsValidBool(const char *str) { - if (strcmp("y", str) == 0) { + if (strcmp("y", str) == 0 + || strcmp("n", str) == 0) { return true; - } else if (strcmp("n", str) == 0) { + } else { + AgentException ex(JDWP_ERROR_ILLEGAL_ARGUMENT); + JDWP_SET_EXCEPTION(ex); return false; + } +} + +bool OptionParser::AsciiToBool(const char *str) +{ + if (*str == 'y') { + return true; } else { - throw IllegalArgumentException(); + return false; } } -void OptionParser::Parse(const char* str) throw(AgentException) +int OptionParser::Parse(const char* str) { size_t i; int k; if (str == 0) - return; + return JDWP_ERROR_NONE; const size_t len = strlen(str); if (len == 0) - return; + return JDWP_ERROR_NONE; for (i = 0; i < len; i++) { if (str[i] == ',') { @@ -82,14 +85,18 @@ } else if (str[i] == '"' || str[i] == '\'') { char quote = str[i]; if (i > 0 && str[i-1] != '=') { - throw IllegalArgumentException(); + AgentException ex(JDWP_ERROR_ILLEGAL_ARGUMENT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_ILLEGAL_ARGUMENT; } i++; while (i < len && str[i] != quote) { i++; } if (i+1 < len && str[i+1] != ',') { - throw IllegalArgumentException(); + AgentException ex(JDWP_ERROR_ILLEGAL_ARGUMENT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_ILLEGAL_ARGUMENT; } } } @@ -139,36 +146,43 @@ } else if (strcmp("timeout", m_options[k].name) == 0) { m_timeout = atol(m_options[k].value); } else if (strcmp("suspend", m_options[k].name) == 0) { + if (!IsValidBool(m_options[k].value)) return JDWP_ERROR_ILLEGAL_ARGUMENT; m_suspend = AsciiToBool(m_options[k].value); } else if (strcmp("server", m_options[k].name) == 0) { + if (!IsValidBool(m_options[k].value)) return JDWP_ERROR_ILLEGAL_ARGUMENT; m_server = AsciiToBool(m_options[k].value); } else if (strcmp("launch", m_options[k].name) == 0) { m_launch = m_options[k].value; } else if (strcmp("onuncaught", m_options[k].name) == 0) { + if (!IsValidBool(m_options[k].value)) return JDWP_ERROR_ILLEGAL_ARGUMENT; m_onuncaught = AsciiToBool(m_options[k].value); } else if (strcmp("onthrow", m_options[k].name) == 0) { m_onthrow = m_options[k].value; } else if (strcmp("help", m_options[k].name) == 0) { m_help = true; -#ifndef NDEBUG + } else if (strcmp("version", m_options[k].name) == 0) { + m_version = true; } else if (strcmp("log", m_options[k].name) == 0) { m_log = m_options[k].value; } else if (strcmp("trace", m_options[k].name) == 0) { m_kindFilter = m_options[k].value; } else if (strcmp("src", m_options[k].name) == 0) { m_srcFilter = m_options[k].value; -#endif // NDEBUG } } if ((m_onthrow != 0) || (m_onuncaught != 0)) { if (m_launch == 0) { - JDWP_ERROR("Specify launch= when using onthrow or onuncaught option"); - throw IllegalArgumentException(); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Specify launch= when using onthrow or onuncaught option")); + AgentException ex(JDWP_ERROR_ILLEGAL_ARGUMENT); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_ILLEGAL_ARGUMENT; } } + + return JDWP_ERROR_NONE; } -OptionParser::~OptionParser() throw() +OptionParser::~OptionParser() { if (m_optionString != 0) AgentBase::GetMemoryManager().Free(m_optionString JDWP_FILE_LINE); @@ -176,7 +190,7 @@ AgentBase::GetMemoryManager().Free(m_options JDWP_FILE_LINE); } -const char *OptionParser::FindOptionValue(const char *name) const throw() +const char *OptionParser::FindOptionValue(const char *name) const { for (int i = 0; i < m_optionCount; i++) { if (strcmp(name, m_options[i].name) == 0) { Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.h URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.h?rev=794726&r1=794725&r2=794726&view=diff ============================================================================== --- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.h (original) +++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/OptionParser.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.8.2.1 $ - */ - /** * @file * OptionParser.h @@ -33,6 +27,7 @@ #define _OPTION_PARSER_H_ #include "AgentBase.h" +#include "ExceptionManager.h" namespace jdwp { @@ -47,24 +42,24 @@ /** * A constructor. */ - OptionParser() throw(); + OptionParser(); /** * A destructor. */ - ~OptionParser() throw(); + ~OptionParser(); /** * Parses the input string containing the arguments passed to the agent. * * @param str - the string containing agent arguments */ - void Parse(const char* str) throw(AgentException); + int Parse(const char* str); /** * Returns a number of parsed options. */ - int GetOptionCount() const throw() { + int GetOptionCount() const { return m_optionCount; } @@ -75,38 +70,52 @@ * @param name - the option name * @param value - the option value */ - void GetOptionByIndex(int i, const char *&name, const char *&value) - const throw(InvalidIndexException) { +#ifndef NDEBUG + int GetOptionByIndex(int i, const char *&name, const char *&value) + const { if (i < m_optionCount) { name = m_options[i].name; value = m_options[i].value; + return JDWP_ERROR_NONE; } else { - throw InvalidIndexException(); + AgentException ex(JDWP_ERROR_INVALID_INDEX); + JDWP_SET_EXCEPTION(ex); + return JDWP_ERROR_INVALID_INDEX; } } +#endif /* NDEBUG */ /** * Looks for an option with the given name. * * @param name - the option name */ - const char *FindOptionValue(const char *name) const throw(); + const char *FindOptionValue(const char *name) const; /** * Returns a value for the agent's help option. * * @return Boolean. */ - bool GetHelp() const throw() { + bool GetHelp() const { return m_help; } /** + * Returns a value for the agent's version option. + * + * @return Boolean. + */ + bool GetVersion() const { + return m_version; + } + + /** * Returns a value for the agent's suspend option. * * @return Boolean. */ - bool GetSuspend() const throw() { + bool GetSuspend() const { return m_suspend; } @@ -115,7 +124,7 @@ * * @return Boolean. */ - bool GetServer() const throw() { + bool GetServer() const { return m_server; } @@ -124,7 +133,7 @@ * * @return Boolean. */ - bool GetOnuncaught() const throw() { + bool GetOnuncaught() const { return m_onuncaught; } @@ -133,7 +142,7 @@ * * @return Java long value. */ - jlong GetTimeout() const throw() { + jlong GetTimeout() const { return m_timeout; } @@ -142,7 +151,7 @@ * * @return Zero-terminated string. */ - const char *GetTransport() const throw() { + const char *GetTransport() const { return m_transport; } @@ -151,7 +160,7 @@ * * @return Zero-terminated string. */ - const char *GetAddress() const throw() { + const char *GetAddress() const { return m_address; } @@ -160,7 +169,7 @@ * * @return Zero-terminated string. */ - const char *GetLog() const throw() { + const char *GetLog() const { return m_log; } @@ -169,7 +178,7 @@ * * @return Zero-terminated string. */ - const char *GetTraceKindFilter() const throw() { + const char *GetTraceKindFilter() const { return m_kindFilter; } @@ -178,7 +187,7 @@ * * @return Zero-terminated string. */ - const char *GetTraceSrcFilter() const throw() { + const char *GetTraceSrcFilter() const { return m_srcFilter; } @@ -187,7 +196,7 @@ * * @return Zero-terminated string. */ - const char *GetOnthrow() const throw() { + const char *GetOnthrow() const { return m_onthrow; } @@ -196,7 +205,7 @@ * * @return Zero-terminated string. */ - const char *GetLaunch() const throw() { + const char *GetLaunch() const { return m_launch; } @@ -211,19 +220,27 @@ }; /** - * The helper converting string to boolean. + * Checks if the input string is "y" or "n" * * @param str - the input null-terminated string * * @exception IllegalArgumentException. */ - bool AsciiToBool(const char *str) throw(IllegalArgumentException); + bool IsValidBool(const char *str); + + /** + * The helper converting string to boolean. + * + * @param str - the input null-terminated string + */ + bool AsciiToBool(const char *str); int m_optionCount; char *m_optionString; Option *m_options; bool m_help; + bool m_version; bool m_suspend; bool m_server; bool m_onuncaught; Modified: harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/PacketDispatcher.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/PacketDispatcher.cpp?rev=794726&r1=794725&r2=794726&view=diff ============================================================================== --- harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/PacketDispatcher.cpp (original) +++ harmony/enhanced/jdktools/branches/java6/modules/jpda/src/main/native/jdwp/common/agent/core/PacketDispatcher.cpp Thu Jul 16 15:57:37 2009 @@ -15,11 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/** - * @author Vitaly A. Provodin - * @version $Revision: 1.22 $ - */ #include "PacketDispatcher.h" #include "TransportManager.h" #include "AgentException.h" @@ -29,12 +24,13 @@ #include "ClassManager.h" #include "RequestManager.h" #include "OptionParser.h" +#include "ExceptionManager.h" using namespace jdwp; //----------------------------------------------------------------------------- -PacketDispatcher::PacketDispatcher() throw() +PacketDispatcher::PacketDispatcher() :AgentBase() { m_isProcessed = false; @@ -46,34 +42,28 @@ //----------------------------------------------------------------------------- void -PacketDispatcher::Init(JNIEnv *jni) throw(AgentException) +PacketDispatcher::Init(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Init(" << jni << ")"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Init(%p)", jni)); m_completionMonitor = new AgentMonitor("_agent_Packet_Dispatcher_completion"); m_executionMonitor = new AgentMonitor("_agent_Packet_Dispatcher_execution"); } -void -PacketDispatcher::Start(JNIEnv *jni) throw(AgentException) +int +PacketDispatcher::Start(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Start(" << jni << ")"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Start(%p)", jni)); JDWP_ASSERT(!m_isProcessed); - try - { - m_threadObject = jni->NewGlobalRef(GetThreadManager().RunAgentThread(jni, StartFunction, this, - JVMTI_THREAD_MAX_PRIORITY, "_jdwp_PacketDispatcher")); - } - catch (const AgentException& e) - { - JDWP_ASSERT(e.ErrCode() != JDWP_ERROR_NULL_POINTER); - JDWP_ASSERT(e.ErrCode() != JDWP_ERROR_INVALID_PRIORITY); - - throw e; + jthread thread = GetThreadManager().RunAgentThread(jni, StartFunction, this, + JVMTI_THREAD_MAX_PRIORITY, "_jdwp_PacketDispatcher"); + if (thread == 0) { + return JDWP_ERROR_INTERNAL; } - + m_threadObject = jni->NewGlobalRef(thread); + return JDWP_ERROR_NONE; } //----------------------------------------------------------------------------- @@ -81,161 +71,142 @@ void PacketDispatcher::Run(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Run(" << jni << ")"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Run(%p)", jni)); - try { - MonitorAutoLock lock(m_completionMonitor JDWP_FILE_LINE); - TransportManager &transport = GetTransportManager(); - - try - { - // run multiplle sessions in a loop - for (; ;) - { - // connect for new session - JDWP_TRACE_PROG("Run: start new session"); - try - { - transport.Connect(); - } - catch (const TransportException& e) - { - JDWP_TRACE_PROG("Run: Exception in connection: " - << e.what() << " [" << e.ErrCode() - << "/" << e.TransportErrorCode() << "]"); - if (!IsDead()) { - JDWP_DIE(e.what() << " [" << e.ErrCode() << "/" - << e.TransportErrorCode() << "]: " - << GetTransportManager().GetLastTransportError()); - } - break; - } - - // start session and execute commands - try - { - // inform that new session started - GetEventDispatcher().NewSession(); - - // add internal request for automatic VMDeath event with no modifiers - GetRequestManager().AddInternalRequest(jni, - new AgentEventRequest(JDWP_EVENT_VM_DEATH, JDWP_SUSPEND_NONE)); - - // release events - GetEventDispatcher().ReleaseEvents(); - - // read and execute commands - m_isProcessed = true; - while (m_isProcessed) - { - // read command - try { - JDWP_TRACE_PROG("Run: handle next command"); - m_cmdParser.ReadCommand(); - if (m_cmdParser.command.GetLength() == 0) - break; - } - catch (const TransportException& e) - { - JDWP_TRACE_PROG("Run: Exception in reading command: " - << e.what() << " [" << e.ErrCode() - << "/" << e.TransportErrorCode() << "]"); - if (m_isProcessed && !IsDead()) - { - char* msg = GetTransportManager().GetLastTransportError(); - AgentAutoFree af(msg JDWP_FILE_LINE); - - if (e.TransportErrorCode() == JDWPTRANSPORT_ERROR_OUT_OF_MEMORY) { - JDWP_DIE(e.what() << " [" << e.ErrCode() << "/" - << e.TransportErrorCode() << "]: " << msg); - } else { - JDWP_ERROR(e.what() << " [" << e.ErrCode() << "/" - << e.TransportErrorCode() << "]: " << msg); - } - } - break; - } - - // execute command and prevent from reset while execution - { - MonitorAutoLock lock(m_executionMonitor JDWP_FILE_LINE); - m_cmdDispatcher.ExecCommand(jni, &m_cmdParser); + int ret; + MonitorAutoLock lock(m_completionMonitor JDWP_FILE_LINE); + TransportManager &transport = GetTransportManager(); + + // run multiplle sessions in a loop + for (; ;) + { + // connect for new session + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: start new session")); + ret = transport.Connect(); + if (ret != JDWP_ERROR_NONE) { + AgentException aex = GetExceptionManager().GetLastException(); + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: Exception in connection: %s", aex.GetExceptionMessage(jni))); + if (!IsDead()) { + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Run: Exception in connection: %s", aex.GetExceptionMessage(jni))); + /* In server case, attempt to reaccept while the VM is alive */ + if (AgentBase::GetOptionParser().GetServer()) { + ret = ResetAll(jni); + if (ret != JDWP_ERROR_NONE) { + AgentException aex = GetExceptionManager().GetLastException(); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Error calling ResetAll(): %s", aex.GetExceptionMessage(jni))); + if (!IsDead()) { + ::exit(1); } + break; } + continue; } - catch (const AgentException& e) - { - JDWP_TRACE_PROG("Run: Exception in executing command: " - << e.what() << " [" << e.ErrCode() << "]"); - if (!IsDead()) { - JDWP_ERROR(e.what() << " [" << e.ErrCode() << "]"); + ::exit(1); + } + break; + } + + // inform that new session started + GetEventDispatcher().NewSession(); + + // add internal request for automatic VMDeath event with no modifiers + ret = GetRequestManager().AddInternalRequest(jni, + new AgentEventRequest(JDWP_EVENT_VM_DEATH, JDWP_SUSPEND_NONE)); + if (ret != JDWP_ERROR_NONE) { + AgentException aex = GetExceptionManager().GetLastException(); + if (!IsDead()) { + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Run: Exception in executing command: %s", aex.GetExceptionMessage(jni))); + } + goto reset; + } + + // start session and execute commands + // release events + GetEventDispatcher().ReleaseEvents(); + + // read and execute commands + m_isProcessed = true; + while (m_isProcessed) + { + // read command + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: handle next command")); + int ret = m_cmdParser.ReadCommand(); + if (ret != JDWP_ERROR_NONE) { + if (m_isProcessed && !IsDead()) { + AgentException aex = GetExceptionManager().GetLastException(); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Run: Exception in reading command: %s", aex.GetExceptionMessage(jni))); + if (aex.ErrCode() == JDWP_ERROR_OUT_OF_MEMORY + || aex.TransportErrCode() == JDWPTRANSPORT_ERROR_OUT_OF_MEMORY) { + ::exit(1); } } - - // reset all modules after session finished - JDWP_TRACE_PROG("Run: reset session"); - ResetAll(jni); - - // no more sessions if VMDeath event occured - if (IsDead()) { - JDWP_TRACE_PROG("Run: VM is dead -> shutdown"); - break; - } - - // no more sessions in attach mode - if (!GetOptionParser().GetServer()) { - JDWP_TRACE_PROG("Run: attach mode -> shutdown"); + break; + } + + if (m_cmdParser.command.GetLength() == 0) + break; + + // execute command and prevent from reset while execution + { + MonitorAutoLock lock(m_executionMonitor JDWP_FILE_LINE); + ret = m_cmdDispatcher.ExecCommand(jni, &m_cmdParser); + if (ret != JDWP_ERROR_NONE) { + AgentException aex = GetExceptionManager().GetLastException(); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Run: Exception in executing command: %s", aex.GetExceptionMessage(jni))); break; } } } - catch (const AgentException& e) - { - JDWP_TRACE_PROG("Run: Exception in PacketDispatcher: " - << e.what() << " [" << e.ErrCode() << "]"); - if (!IsDead()) { - JDWP_DIE(e.what() << " [" << e.ErrCode() << "]"); + +reset: + // reset all modules after session finished + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: reset session")); + ResetAll(jni); + if (ret != JDWP_ERROR_NONE) { + AgentException aex = GetExceptionManager().GetLastException(); + JDWP_TRACE(LOG_RELEASE, (LOG_ERROR_FL, "Error calling ResetAll(): %s", aex.GetExceptionMessage(jni))); + if (!IsDead()) { + ::exit(1); } + break; } - - // stop also EventDispatcher thread - try - { - JDWP_TRACE_PROG("Run: stop EventDispatcher"); - GetEventDispatcher().Stop(jni); + + // no more sessions if VMDeath event occured + if (IsDead()) { + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: VM is dead -> shutdown")); + break; } - catch (const AgentException& e) - { - // just report an error, cannot do anything else - JDWP_ERROR("Exception in stopping EventDispatcher: " - << e.what() << " [" << e.ErrCode() << "]"); + + // no more sessions in attach mode + if (!GetOptionParser().GetServer()) { + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: attach mode -> shutdown")); + break; } + } + + // stop also EventDispatcher thread + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Run: stop EventDispatcher")); + GetEventDispatcher().Stop(jni); // release completion monitor and wait forever until VM kills this thread // TODO: remove this workaround to prevent from resource leak // This is the old completion mechanism fixed in HARMONY-5019 // m_completionMonitor->Wait(0); - } - catch (const AgentException& e) - { - // just report an error, cannot do anything else - JDWP_ERROR("Exception in PacketDispatcher synchronization: " - << e.what() << " [" << e.ErrCode() << "]"); - } + } //----------------------------------------------------------------------------- void -PacketDispatcher::Stop(JNIEnv *jni) throw(AgentException) +PacketDispatcher::Stop(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Stop()"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Stop()")); // cause thread loop to break m_isProcessed = false; // close transport first, but not while executing current command - JDWP_TRACE_PROG("Stop: close agent connection"); + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Stop: close agent connection")); if (m_executionMonitor != 0) { MonitorAutoLock lock(m_executionMonitor JDWP_FILE_LINE); GetTransportManager().Clean(); @@ -253,11 +224,11 @@ } void -PacketDispatcher::Clean(JNIEnv *jni) throw(AgentException) +PacketDispatcher::Clean(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Clean(" << jni << ')'); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Clean(%p)", jni)); - JDWP_TRACE_PROG("Clean: clean internal data"); + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Clean: clean internal data")); // do not delete m_completionMonitor because thread is waiting on it // TODO: remove this workaround to prevent from resource leak @@ -274,34 +245,43 @@ } void -PacketDispatcher::Reset(JNIEnv *jni) throw(AgentException) +PacketDispatcher::Reset(JNIEnv *jni) { - JDWP_TRACE_ENTRY("Reset(" << jni << ')'); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "Reset(%p)", jni)); // cause thread loop to break - JDWP_TRACE_PROG("Reset: reset session"); + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "Reset: reset session")); m_isProcessed = false; } -void -PacketDispatcher::ResetAll(JNIEnv *jni) throw(AgentException) +int +PacketDispatcher::ResetAll(JNIEnv *jni) { - JDWP_TRACE_ENTRY("ResetAll(" << jni << ")"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "ResetAll(%p)", jni)); // reset all modules, but not while executing current command if (m_executionMonitor != 0) { MonitorAutoLock lock(m_executionMonitor JDWP_FILE_LINE); - JDWP_TRACE_PROG("ResetAll: reset all modules"); + JDWP_TRACE(LOG_RELEASE, (LOG_PROG_FL, "ResetAll: reset all modules")); + + int ret; + m_cmdParser.Reset(jni); + ret = GetThreadManager().Reset(jni); + JDWP_CHECK_RETURN(ret); - GetThreadManager().Reset(jni); GetRequestManager().Reset(jni); GetEventDispatcher().Reset(jni); - GetTransportManager().Reset(); + + ret = GetTransportManager().Reset(); + JDWP_CHECK_RETURN(ret); + GetPacketDispatcher().Reset(jni); GetClassManager().Reset(jni); GetObjectManager().Reset(jni); } + + return JDWP_ERROR_NONE; } //----------------------------------------------------------------------------- @@ -309,7 +289,7 @@ void JNICALL PacketDispatcher::StartFunction(jvmtiEnv* jvmti_env, JNIEnv* jni, void* arg) { - JDWP_TRACE_ENTRY("StartFunction(" << jvmti_env << "," << jni << "," << arg << ")"); + JDWP_TRACE_ENTRY(LOG_RELEASE, (LOG_FUNC_FL, "StartFunction(%p,%p,%p)", jvmti_env, jni, arg)); (reinterpret_cast(arg))->Run(jni); }