Fix several memory leaks. Also, use monitors around sensetive structures.
git-svn-id: svn://10.0.0.236/trunk@169795 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -60,8 +60,8 @@ nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject,
|
||||
mIInfo->GetInterfaceIID(&iid);
|
||||
char* iid_str = iid->ToString();
|
||||
LOG(("+ nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
|
||||
aJavaEnv->CallIntMethod(aJavaObject, hashCodeMID),
|
||||
(int) this, iid_str));
|
||||
(PRUint32) aJavaEnv->CallIntMethod(aJavaObject, hashCodeMID),
|
||||
(PRUint32) this, iid_str));
|
||||
PR_Free(iid_str);
|
||||
nsMemory::Free(iid);
|
||||
#endif
|
||||
@@ -71,33 +71,6 @@ nsJavaXPTCStub::~nsJavaXPTCStub()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
nsJavaXPTCStub::Destroy()
|
||||
{
|
||||
#ifdef DEBUG_JAVAXPCOM
|
||||
nsIID* iid;
|
||||
mIInfo->GetInterfaceIID(&iid);
|
||||
char* iid_str = iid->ToString();
|
||||
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
|
||||
LOG(("- nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
|
||||
mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
|
||||
(int) this, iid_str));
|
||||
PR_Free(iid_str);
|
||||
nsMemory::Free(iid);
|
||||
#endif
|
||||
|
||||
if (!mMaster) {
|
||||
// delete each child stub
|
||||
for (PRInt32 i = 0; i < mChildren.Count(); i++) {
|
||||
delete (nsJavaXPTCStub*) mChildren[i];
|
||||
}
|
||||
|
||||
gJavaToXPTCStubMap->Remove(mJavaEnv, mJavaStrongRef);
|
||||
}
|
||||
|
||||
mJavaEnv->DeleteWeakGlobalRef(mJavaWeakRef);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP_(nsrefcnt)
|
||||
nsJavaXPTCStub::AddRefInternal()
|
||||
{
|
||||
@@ -177,6 +150,35 @@ nsJavaXPTCStub::Release()
|
||||
return master->ReleaseInternal();
|
||||
}
|
||||
|
||||
void
|
||||
nsJavaXPTCStub::Destroy()
|
||||
{
|
||||
#ifdef DEBUG_JAVAXPCOM
|
||||
nsIID* iid;
|
||||
mIInfo->GetInterfaceIID(&iid);
|
||||
char* iid_str = iid->ToString();
|
||||
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
|
||||
LOG(("- nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
|
||||
(PRUint32) mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
|
||||
(PRUint32) this, iid_str));
|
||||
PR_Free(iid_str);
|
||||
nsMemory::Free(iid);
|
||||
#endif
|
||||
|
||||
if (!mMaster) {
|
||||
// delete each child stub
|
||||
for (PRInt32 i = 0; i < mChildren.Count(); i++) {
|
||||
delete (nsJavaXPTCStub*) mChildren[i];
|
||||
}
|
||||
|
||||
if (gJavaXPCOMMonitor) { // if Javaconnect is still initialized
|
||||
gJavaToXPTCStubMap->Remove(mJavaEnv, mJavaStrongRef);
|
||||
}
|
||||
}
|
||||
|
||||
mJavaEnv->DeleteWeakGlobalRef(mJavaWeakRef);
|
||||
}
|
||||
|
||||
void
|
||||
nsJavaXPTCStub::ReleaseWeakRef()
|
||||
{
|
||||
@@ -196,6 +198,13 @@ nsJavaXPTCStub::ReleaseWeakRef()
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsJavaXPTCStub::DeleteStrongRef()
|
||||
{
|
||||
mJavaEnv->DeleteGlobalRef(mJavaStrongRef);
|
||||
mJavaStrongRef = nsnull;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
|
||||
{
|
||||
@@ -1440,6 +1449,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
}
|
||||
NS_RELEASE(xpcom_obj);
|
||||
xpcom_obj = weakref;
|
||||
NS_ADDREF(xpcom_obj);
|
||||
} else { // if is native XPCOM object
|
||||
@@ -1448,6 +1458,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
|
||||
if (supportsweak) {
|
||||
nsWeakPtr weakref;
|
||||
supportsweak->GetWeakReference(getter_AddRefs(weakref));
|
||||
NS_RELEASE(xpcom_obj);
|
||||
xpcom_obj = weakref;
|
||||
NS_ADDREF(xpcom_obj);
|
||||
} else {
|
||||
@@ -1629,8 +1640,8 @@ nsJavaXPTCStub::GetJavaObject()
|
||||
mIInfo->GetInterfaceIID(&iid);
|
||||
char* iid_str = iid->ToString();
|
||||
LOG(("< nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
|
||||
mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
|
||||
(int) this, iid_str));
|
||||
(PRUint32) mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
|
||||
(PRUint32) this, iid_str));
|
||||
PR_Free(iid_str);
|
||||
nsMemory::Free(iid);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user