Bug 712363, Part 1: Make SyncRunnableBase work without deadlocking when run on the main thread, r=honzab

This commit is contained in:
Honza Bambas 2012-01-31 08:04:53 -08:00
Родитель 6651530141
Коммит 4a19ec5655
3 изменённых файлов: 12 добавлений и 17 удалений

Просмотреть файл

@ -46,14 +46,18 @@ SyncRunnableBase::SyncRunnableBase()
nsresult
SyncRunnableBase::DispatchToMainThreadAndWait()
{
NS_ASSERTION(!NS_IsMainThread(),
"DispatchToMainThreadAndWait called on the main thread.");
mozilla::MonitorAutoLock lock(monitor);
nsresult rv = NS_DispatchToMainThread(this);
if (NS_SUCCEEDED(rv)) {
lock.Wait();
nsresult rv;
if (NS_IsMainThread()) {
RunOnTargetThread();
rv = NS_OK;
} else {
mozilla::MonitorAutoLock lock(monitor);
rv = NS_DispatchToMainThread(this);
if (NS_SUCCEEDED(rv)) {
lock.Wait();
}
}
return rv;
}

Просмотреть файл

@ -815,11 +815,7 @@ PK11PasswordPrompt(PK11SlotInfo* slot, PRBool retry, void* arg)
nsRefPtr<PK11PasswordPromptRunnable> runnable =
new PK11PasswordPromptRunnable(slot,
static_cast<nsIInterfaceRequestor*>(arg));
if (NS_IsMainThread()) {
runnable->RunOnTargetThread();
} else {
runnable->DispatchToMainThreadAndWait();
}
runnable->DispatchToMainThreadAndWait();
return runnable->mResult;
}

Просмотреть файл

@ -944,11 +944,6 @@ void nsNSSSocketInfo::GetPreviousCert(nsIX509Cert** _result)
NS_ASSERTION(_result, "_result parameter to GetPreviousCert is null");
*_result = nsnull;
if (NS_IsMainThread()) {
NS_ERROR("nsNSSSocketInfo::GetPreviousCert called on the main thread");
return;
}
nsRefPtr<PreviousCertRunnable> runnable = new PreviousCertRunnable(mCallbacks);
nsresult rv = runnable->DispatchToMainThreadAndWait();
NS_ASSERTION(NS_SUCCEEDED(rv), "runnable->DispatchToMainThreadAndWait() failed");