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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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_
|
||||
|
||||
Reference in New Issue
Block a user