Bug 1233774 - fix Leak EventTokenBucket on shutdown r=dragana

This commit is contained in:
Patrick McManus 2016-01-21 12:40:15 -05:00
parent a898200615
commit 751c67ab39
4 changed files with 36 additions and 18 deletions

View File

@ -111,25 +111,35 @@ EventTokenBucket::~EventTokenBucket()
SOCKET_LOG(("EventTokenBucket::dtor %p events=%d\n",
this, mEvents.GetSize()));
if (mTimer && mTimerArmed)
mTimer->Cancel();
#ifdef XP_WIN
NormalTimers();
if (mFineGrainResetTimerArmed) {
mFineGrainResetTimerArmed = false;
mFineGrainResetTimer->Cancel();
}
#endif
CleanupTimers();
// Complete any queued events to prevent hangs
while (mEvents.GetSize()) {
RefPtr<TokenBucketCancelable> cancelable =
RefPtr<TokenBucketCancelable> cancelable =
dont_AddRef(static_cast<TokenBucketCancelable *>(mEvents.PopFront()));
cancelable->Fire();
}
}
void
EventTokenBucket::CleanupTimers()
{
if (mTimer && mTimerArmed) {
mTimer->Cancel();
}
mTimer = nullptr;
mTimerArmed = false;
#ifdef XP_WIN
NormalTimers();
if (mFineGrainResetTimer && mFineGrainResetTimerArmed) {
mFineGrainResetTimer->Cancel();
}
mFineGrainResetTimer = nullptr;
mFineGrainResetTimerArmed = false;
#endif
}
void
EventTokenBucket::SetRate(uint32_t eventsPerSecond,
uint32_t burstSize)
@ -213,9 +223,13 @@ EventTokenBucket::Stop()
MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread);
SOCKET_LOG(("EventTokenBucket::Stop %p armed=%d\n", this, mTimerArmed));
mStopped = true;
if (mTimerArmed) {
mTimer->Cancel();
mTimerArmed = false;
CleanupTimers();
// Complete any queued events to prevent hangs
while (mEvents.GetSize()) {
RefPtr<TokenBucketCancelable> cancelable =
dont_AddRef(static_cast<TokenBucketCancelable *>(mEvents.PopFront()));
cancelable->Fire();
}
}

View File

@ -93,6 +93,7 @@ public:
private:
virtual ~EventTokenBucket();
void CleanupTimers();
friend class RunNotifyEvent;
friend class SetTimerEvent;

View File

@ -385,9 +385,11 @@ nsHttpHandler::Init()
void
nsHttpHandler::MakeNewRequestTokenBucket()
{
if (!mConnMgr)
LOG(("nsHttpHandler::MakeNewRequestTokenBucket this=%p child=%d\n",
this, IsNeckoChild()));
if (!mConnMgr || IsNeckoChild()) {
return;
}
RefPtr<EventTokenBucket> tokenBucket =
new EventTokenBucket(RequestTokenBucketHz(), RequestTokenBucketBurst());
mConnMgr->UpdateRequestTokenBucket(tokenBucket);

View File

@ -568,8 +568,9 @@ public:
nsICancelable **cancel)
{
MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread);
if (!mRequestTokenBucket)
return NS_ERROR_UNEXPECTED;
if (!mRequestTokenBucket) {
return NS_ERROR_NOT_AVAILABLE;
}
return mRequestTokenBucket->SubmitEvent(event, cancel);
}