From 2f0ba6e0db87f9de06018bb94d23320da538da75 Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Wed, 15 Sep 2004 19:21:08 +0000 Subject: [PATCH] Remove nsJavaXPTCStub from hash table on destruction. Fix ref counting. Clean up logging. Not part of default build. git-svn-id: svn://10.0.0.236/trunk@162389 18797224-902f-48f8-a5cc-f745e15eee43 --- .../extensions/java/xpcom/nsJavaWrapper.cpp | 11 +++---- .../java/xpcom/nsJavaXPCOMBindingUtils.cpp | 30 ++++++++++++++----- .../java/xpcom/nsJavaXPCOMBindingUtils.h | 13 ++++---- .../extensions/java/xpcom/nsJavaXPTCStub.cpp | 16 ++++++---- .../extensions/java/xpcom/nsJavaXPTCStub.h | 17 ++++++----- 5 files changed, 57 insertions(+), 30 deletions(-) diff --git a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp index 4159d04dd40..8cb816158b6 100644 --- a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp @@ -340,7 +340,6 @@ SetupParams(JNIEnv *env, const jobject aParam, // Create XPCOM stub nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(env, data, iinfo); - NS_ADDREF(xpcomStub); inst = SetAsXPTCStub(xpcomStub); AddJavaXPCOMBinding(env, data, inst); } @@ -371,9 +370,11 @@ SetupParams(JNIEnv *env, const jobject aParam, } #endif - if (IsXPTCStub(inst)) - aVariant.val.p = aVariant.ptr = (void*) GetXPTCStubAddr(inst); - else { + if (IsXPTCStub(inst)) { + nsJavaXPTCStub* xpcomStub = GetXPTCStubAddr(inst); + NS_ADDREF(xpcomStub); + aVariant.val.p = aVariant.ptr = (void*) xpcomStub; + } else { JavaXPCOMInstance* xpcomInst = (JavaXPCOMInstance*) inst; aVariant.val.p = aVariant.ptr = (void*) xpcomInst->GetInstance(); } @@ -654,7 +655,7 @@ FinalizeParams(JNIEnv *env, const jobject aParam, case nsXPTType::T_INTERFACE_IS: { if (aVariant.val.p && aParamInfo.IsOut()) { - jobject java_obj = GetMatchingJavaObject(aVariant.val.p); + jobject java_obj = GetMatchingJavaObject(env, aVariant.val.p); if (java_obj == nsnull) { // wrap xpcom instance diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp index 2fa42b05ed3..dc89139e0a0 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp @@ -157,8 +157,8 @@ AddJavaXPCOMBinding(JNIEnv* env, jobject aJavaObject, void* aXPCOMObject) PL_DHASH_ADD)); entry->mJavaObject = aJavaObject; -// LOG("+ Adding Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", -// hash, (int) aXPCOMObject); + LOG("+ Adding Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", + hash, (int) aXPCOMObject); } nsISupports* @@ -172,6 +172,9 @@ RemoveXPCOMBinding(JNIEnv* env, jobject aJavaObject) PL_DHASH_REMOVE); PL_DHashTableOperate(gXPCOMtoJAVABindings, xpcomObj, PL_DHASH_REMOVE); + LOG("- Removing Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", + hash, (int) xpcomObj); + if (IsXPTCStub(xpcomObj)) { return (nsISupports*) GetXPTCStubAddr(xpcomObj); } else { @@ -185,6 +188,19 @@ RemoveXPCOMBinding(JNIEnv* env, jobject aJavaObject) } } +void +RemoveJavaXPCOMBinding(JNIEnv* env, jobject aJavaObject, void* aXPCOMObject) +{ + // Remove both instances from stores + jint hash = env->CallIntMethod(aJavaObject, hashCodeMID); + PL_DHashTableOperate(gJAVAtoXPCOMBindings, NS_INT32_TO_PTR(hash), + PL_DHASH_REMOVE); + PL_DHashTableOperate(gXPCOMtoJAVABindings, aXPCOMObject, PL_DHASH_REMOVE); + + LOG("- Removing Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", + hash, (int) aXPCOMObject); +} + void* GetMatchingXPCOMObject(JNIEnv* env, jobject aJavaObject) { @@ -197,8 +213,8 @@ GetMatchingXPCOMObject(JNIEnv* env, jobject aJavaObject) PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_BUSY(entry)) { -// LOG("< Get Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", -// (int) aJavaObject, (int) entry->mXPCOMInstance); + LOG("< Get Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", + hash, (int) entry->mXPCOMInstance); return entry->mXPCOMInstance; } @@ -206,7 +222,7 @@ GetMatchingXPCOMObject(JNIEnv* env, jobject aJavaObject) } jobject -GetMatchingJavaObject(void* aXPCOMObject) +GetMatchingJavaObject(JNIEnv* env, void* aXPCOMObject) { JavaXPCOMBindingEntry *entry = NS_STATIC_CAST(JavaXPCOMBindingEntry*, @@ -214,8 +230,8 @@ GetMatchingJavaObject(void* aXPCOMObject) PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_BUSY(entry)) { -// LOG("< Get Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", -// (int) entry->mJavaObject, (int) aXPCOMObject); + LOG("< Get Java<->XPCOM binding (Java=0x%08x | XPCOM=0x%08x)\n", + env->CallIntMethod(entry->mJavaObject, hashCodeMID), (int) aXPCOMObject); return entry->mJavaObject; } diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h index d47c51cc306..7dcc87ff8b9 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h @@ -42,7 +42,7 @@ #include "xptcall.h" #include "nsCOMPtr.h" -#ifdef DEBUG +#ifdef DEBUG_pedemonte #define LOG(...) printf(__VA_ARGS__) #else #define LOG(format, ...) @@ -134,10 +134,13 @@ JavaXPCOMInstance* CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, /************************************** * Java<->XPCOM binding stores **************************************/ -void AddJavaXPCOMBinding(JNIEnv* env, jobject aJavaStub, void* aXPCOMObject); -nsISupports* RemoveXPCOMBinding(JNIEnv* env, jobject aJavaObject); -void* GetMatchingXPCOMObject(JNIEnv* env, jobject aJavaObject); -jobject GetMatchingJavaObject(void* aXPCOMObject); +void AddJavaXPCOMBinding(JNIEnv* env, jobject aJavaStub, + void* aXPCOMObject); +nsISupports* RemoveXPCOMBinding(JNIEnv* env, jobject aJavaObject); +void RemoveJavaXPCOMBinding(JNIEnv* env, jobject aJavaObject, + void* aXPCOMObject); +void* GetMatchingXPCOMObject(JNIEnv* env, jobject aJavaObject); +jobject GetMatchingJavaObject(JNIEnv* env, void* aXPCOMObject); void ThrowXPCOMException(JNIEnv* env, int aFailureCode); diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp index b54a549adb0..d643dcb5618 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp @@ -61,7 +61,8 @@ nsJavaXPTCStub::~nsJavaXPTCStub() jclass clazz = mJavaEnv->GetObjectClass(mJavaObject); jstring name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID); const char* javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy); - fprintf(stderr, "*** ~nsJavaXPTCStub(java_obj=%s)\n", javaObjectName); + LOG("*** ~nsJavaXPTCStub(this=0x%08x java_obj=0x%08x %s)\n", (int) this, + mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), javaObjectName); if (isCopy) mJavaEnv->ReleaseStringUTFChars(name, javaObjectName); #endif @@ -73,6 +74,8 @@ nsJavaXPTCStub::~nsJavaXPTCStub() } } + RemoveJavaXPCOMBinding(mJavaEnv, mJavaObject, this); + mJavaEnv->DeleteGlobalRef(mJavaObject); } @@ -573,7 +576,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, { jobject java_stub; if (aVariant.val.p) { - java_stub = GetMatchingJavaObject(aVariant.val.p); + java_stub = GetMatchingJavaObject(mJavaEnv, aVariant.val.p); if (java_stub == nsnull) { // wrap xpcom instance @@ -1051,7 +1054,6 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, // Create XPCOM stub nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(mJavaEnv, java_obj, iinfo); - NS_ADDREF(xpcomStub); inst = SetAsXPTCStub(xpcomStub); AddJavaXPCOMBinding(mJavaEnv, java_obj, inst); } @@ -1083,9 +1085,11 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, } #endif - if (IsXPTCStub(inst)) - *((void **) aVariant.val.p) = (void*) GetXPTCStubAddr(inst); - else { + if (IsXPTCStub(inst)) { + nsJavaXPTCStub* xpcomStub = GetXPTCStubAddr(inst); + NS_ADDREF(xpcomStub); + *((void **) aVariant.val.p) = (void*) xpcomStub; + } else { JavaXPCOMInstance* xpcomInst = (JavaXPCOMInstance*) inst; *((void **) aVariant.val.p) = (void*) xpcomInst->GetInstance(); } diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.h b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.h index 81759e1bf80..53e76725a76 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.h +++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.h @@ -99,12 +99,15 @@ private: }; inline void* SetAsXPTCStub(nsJavaXPTCStub* ptr) - { return (void*) (((unsigned long) ptr) | 0x1); } - -inline PRBool IsXPTCStub(void* ptr) - { return ((unsigned long) ptr) & 0x1; } - -inline nsJavaXPTCStub* GetXPTCStubAddr(void* ptr) - { return (nsJavaXPTCStub*) (((unsigned long) ptr) & ~0x1); } + { NS_PRECONDITION(ptr, "null pointer"); + return (void*) (((unsigned long) ptr) | 0x1); } + + inline PRBool IsXPTCStub(void* ptr) + { NS_PRECONDITION(ptr, "null pointer"); + return ((unsigned long) ptr) & 0x1; } + + inline nsJavaXPTCStub* GetXPTCStubAddr(void* ptr) + { NS_PRECONDITION(ptr, "null pointer"); + return (nsJavaXPTCStub*) (((unsigned long) ptr) & ~0x1); } #endif // _nsJavaXPTCStub_h_