1
0
mirror of https://github.com/roytam1/UXP.git synced 2026-05-26 13:58:49 +00:00
Files
UXP/security/manager/ssl/PSMRunnable.cpp
T
Moonchild 69bd6af877 [security] Ensure DispatchToMainThreadAndWait isn't interrupted.
In some cases, `lock.wait()` can be interrupted by spurious wake-ups
before processing is done. To ensure things are, in fact, synchronous,
loop over `wait()` until it is actually done.
2026-04-27 10:38:27 +08:00

52 lines
991 B
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "PSMRunnable.h"
namespace mozilla { namespace psm {
SyncRunnableBase::SyncRunnableBase()
: monitor("SyncRunnableBase::monitor")
{
}
nsresult
SyncRunnableBase::DispatchToMainThreadAndWait()
{
nsresult rv;
if (NS_IsMainThread()) {
RunOnTargetThread();
rv = NS_OK;
} else {
mozilla::MonitorAutoLock lock(monitor);
rv = NS_DispatchToMainThread(this);
if (NS_SUCCEEDED(rv)) {
while (!mDone) {
lock.Wait();
}
}
}
return rv;
}
NS_IMETHODIMP
SyncRunnableBase::Run()
{
RunOnTargetThread();
mozilla::MonitorAutoLock lock(monitor);
mDone = true;
lock.Notify();
return NS_OK;
}
nsresult
NotifyObserverRunnable::Run()
{
mObserver->Observe(nullptr, mTopic, nullptr);
return NS_OK;
}
} } // namespace mozilla::psm