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
This commit is contained in:
pedemont%us.ibm.com
2004-09-15 19:21:08 +00:00
parent d0656e8867
commit 2f0ba6e0db
5 changed files with 57 additions and 30 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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_