From 2ab5ff0a6f9c49122d2e1ac2b1549ef554a56ffe Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Wed, 27 Sep 2006 15:16:40 +0000 Subject: [PATCH] Remove nsJavaXPTCStub from hash table on destruction. Fix ref counting. Clean up logging. Not part of default build. Original committer: pedemont%us.ibm.com Original revision: 1.2 Original date: 2004/09/15 19:21:08 git-svn-id: svn://10.0.0.236/trunk@212558 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xpcom/src/nsJavaXPCOMBindingUtils.cpp | 30 ++++++++++++++----- .../java/xpcom/src/nsJavaXPCOMBindingUtils.h | 13 ++++---- .../java/xpcom/src/nsJavaXPTCStub.h | 17 ++++++----- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/mozilla/extensions/java/xpcom/src/nsJavaXPCOMBindingUtils.cpp b/mozilla/extensions/java/xpcom/src/nsJavaXPCOMBindingUtils.cpp index 2fa42b05ed3..dc89139e0a0 100644 --- a/mozilla/extensions/java/xpcom/src/nsJavaXPCOMBindingUtils.cpp +++ b/mozilla/extensions/java/xpcom/src/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/src/nsJavaXPCOMBindingUtils.h b/mozilla/extensions/java/xpcom/src/nsJavaXPCOMBindingUtils.h index d47c51cc306..7dcc87ff8b9 100644 --- a/mozilla/extensions/java/xpcom/src/nsJavaXPCOMBindingUtils.h +++ b/mozilla/extensions/java/xpcom/src/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/src/nsJavaXPTCStub.h b/mozilla/extensions/java/xpcom/src/nsJavaXPTCStub.h index 81759e1bf80..53e76725a76 100644 --- a/mozilla/extensions/java/xpcom/src/nsJavaXPTCStub.h +++ b/mozilla/extensions/java/xpcom/src/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_