diff --git a/mozilla/xpcom/threads/nsTimerImpl.cpp b/mozilla/xpcom/threads/nsTimerImpl.cpp index 9bf17a9c0f5..c8cf98847a4 100644 --- a/mozilla/xpcom/threads/nsTimerImpl.cpp +++ b/mozilla/xpcom/threads/nsTimerImpl.cpp @@ -177,10 +177,7 @@ nsTimerImpl::nsTimerImpl() : nsTimerImpl::~nsTimerImpl() { - if (mCallbackType == CALLBACK_TYPE_INTERFACE) - NS_RELEASE(mCallback.i); - else if (mCallbackType == CALLBACK_TYPE_OBSERVER) - NS_RELEASE(mCallback.o); + ReleaseCallback(); } @@ -241,6 +238,7 @@ NS_IMETHODIMP nsTimerImpl::InitWithFuncCallback(nsTimerCallbackFunc aFunc, if (!gThread) return NS_ERROR_FAILURE; + ReleaseCallback(); mCallbackType = CALLBACK_TYPE_FUNC; mCallback.c = aFunc; mClosure = aClosure; @@ -255,6 +253,7 @@ NS_IMETHODIMP nsTimerImpl::InitWithCallback(nsITimerCallback *aCallback, if (!gThread) return NS_ERROR_FAILURE; + ReleaseCallback(); mCallbackType = CALLBACK_TYPE_INTERFACE; mCallback.i = aCallback; NS_ADDREF(mCallback.i); @@ -269,6 +268,7 @@ NS_IMETHODIMP nsTimerImpl::Init(nsIObserver *aObserver, if (!gThread) return NS_ERROR_FAILURE; + ReleaseCallback(); mCallbackType = CALLBACK_TYPE_OBSERVER; mCallback.o = aObserver; NS_ADDREF(mCallback.o); diff --git a/mozilla/xpcom/threads/nsTimerImpl.h b/mozilla/xpcom/threads/nsTimerImpl.h index 90733deeda7..dce1abfe7fd 100644 --- a/mozilla/xpcom/threads/nsTimerImpl.h +++ b/mozilla/xpcom/threads/nsTimerImpl.h @@ -42,6 +42,7 @@ #include "nsVoidArray.h" #include "nsIThread.h" #include "nsITimerInternal.h" +#include "nsIObserver.h" #include "nsCOMPtr.h" @@ -103,6 +104,14 @@ public: private: nsresult InitCommon(PRUint32 aType, PRUint32 aDelay); + void ReleaseCallback() + { + if (mCallbackType == CALLBACK_TYPE_INTERFACE) + NS_RELEASE(mCallback.i); + else if (mCallbackType == CALLBACK_TYPE_OBSERVER) + NS_RELEASE(mCallback.o); + } + nsCOMPtr mCallingThread; void * mClosure;