/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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/. */
/** * This class will wrap a nsIRunnable and dispatch it to the target thread * synchronously. This is different from * NS_DispatchAndSpinEventLoopUntilComplete: this class does not spin the event * loop waiting for the event to be dispatched. This means that you don't risk * reentrance from pending messages, but you must be sure that the target thread * does not ever block on this thread, or else you will deadlock. * * Typical usage: * RefPtr<SyncRunnable> sr = new SyncRunnable(new myrunnable...()); * sr->DispatchToThread(t); * * We also provide convenience wrappers: * SyncRunnable::DispatchToThread(pThread, new myrunnable...()); * SyncRunnable::DispatchToThread(pThread, NS_NewRunnableFunction(...)); *
*/ class SyncRunnable : public Runnable { public: explicit SyncRunnable(nsIRunnable* aRunnable)
: Runnable("SyncRunnable"),
mRunnable(aRunnable),
mMonitor("SyncRunnable"),
mDone(false) {}
if (!aForceDispatch) {
rv = aThread->IsOnCurrentThread(&on);
MOZ_ASSERT(NS_SUCCEEDED(rv)); if (NS_SUCCEEDED(rv) && on) {
mRunnable->Run(); return NS_OK;
}
}
rv = aThread->Dispatch(this, NS_DISPATCH_NORMAL); if (NS_SUCCEEDED(rv)) {
mozilla::MonitorAutoLock lock(mMonitor); // This could be synchronously dispatching to a thread currently waiting // for JS execution clearance. Yield JS execution.
dom::AutoYieldJSThreadExecution yield;
// Check we don't have tail dispatching here. Otherwise we will deadlock // ourself when spinning the loop below.
MOZ_ASSERT(!aThread->RequiresTailDispatchFromCurrentThread());
nsresult rv = aThread->Dispatch(RefPtr<nsIRunnable>(this).forget()); if (NS_SUCCEEDED(rv)) {
mozilla::MonitorAutoLock lock(mMonitor); while (!mDone) {
lock.Wait();
}
} return rv;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.