Add proper locking around between threads shared variables and the calls to signal() and wait().

This commit is contained in:
Aleric Inglewood
2011-08-01 23:46:54 +02:00
parent 313e008f61
commit 13be594651
2 changed files with 16 additions and 10 deletions

View File

@@ -432,18 +432,8 @@ LLCondition::~LLCondition()
mAPRCondp = NULL; mAPRCondp = NULL;
} }
void LLCondition::wait() void LLCondition::wait()
{ {
if (!isLocked())
{ //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
apr_thread_mutex_lock(mAPRMutexp);
#if MUTEX_DEBUG
// avoid asserts on destruction in non-release builds
U32 id = LLThread::currentID();
mIsLocked[id] = TRUE;
#endif
}
apr_thread_cond_wait(mAPRCondp, mAPRMutexp); apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
} }

View File

@@ -722,14 +722,17 @@ CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
void LLCurl::Multi::perform() void LLCurl::Multi::perform()
{ {
mSignal->lock();
if (mPerformState == PERFORM_STATE_READY) if (mPerformState == PERFORM_STATE_READY)
{ {
mSignal->signal(); mSignal->signal();
} }
mSignal->unlock();
} }
void LLCurl::Multi::run() void LLCurl::Multi::run()
{ {
mSignal->lock();
while (!mQuitting) while (!mQuitting)
{ {
mSignal->wait(); mSignal->wait();
@@ -753,6 +756,7 @@ void LLCurl::Multi::run()
mPerformState = PERFORM_STATE_COMPLETED; mPerformState = PERFORM_STATE_COMPLETED;
} }
} }
mSignal->unlock();
} }
S32 LLCurl::Multi::process() S32 LLCurl::Multi::process()
@@ -879,12 +883,16 @@ LLCurlRequest::~LLCurlRequest()
for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter) for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter)
{ {
LLCurl::Multi* multi = *iter; LLCurl::Multi* multi = *iter;
multi->mSignal->lock();
multi->mQuitting = true; multi->mQuitting = true;
while (!multi->isStopped()) while (!multi->isStopped())
{ {
multi->mSignal->signal(); multi->mSignal->signal();
multi->mSignal->unlock();
apr_sleep(1000); apr_sleep(1000);
multi->mSignal->lock();
} }
multi->mSignal->unlock();
} }
for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer()); for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer());
} }
@@ -1023,12 +1031,16 @@ S32 LLCurlRequest::process()
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0) if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{ {
mMultiSet.erase(curiter); mMultiSet.erase(curiter);
multi->mSignal->lock();
multi->mQuitting = true; multi->mQuitting = true;
while (!multi->isStopped()) while (!multi->isStopped())
{ {
multi->mSignal->signal(); multi->mSignal->signal();
multi->mSignal->unlock();
apr_sleep(1000); apr_sleep(1000);
multi->mSignal->unlock();
} }
multi->mSignal->unlock();
delete multi; delete multi;
} }
@@ -1071,12 +1083,16 @@ LLCurlEasyRequest::LLCurlEasyRequest()
LLCurlEasyRequest::~LLCurlEasyRequest() LLCurlEasyRequest::~LLCurlEasyRequest()
{ {
mMulti->mSignal->lock();
mMulti->mQuitting = true; mMulti->mQuitting = true;
while (!mMulti->isStopped()) while (!mMulti->isStopped())
{ {
mMulti->mSignal->signal(); mMulti->mSignal->signal();
mMulti->mSignal->unlock();
apr_sleep(1000); apr_sleep(1000);
mMulti->mSignal->lock();
} }
mMulti->mSignal->unlock();
delete mMulti; delete mMulti;
} }