nsresult TaskQueue::DispatchLocked(already_AddRefed<nsIRunnable> aRunnable, DispatchMode aMode, DispatchFailureHandling aFailureHandling, DispatchReason aReason) { nsCOMPtr<nsIRunnable> r = aRunnable; AbstractThread* currentThread; if (aReason != TailDispatch && (currentThread = GetCurrent()) && RequiresTailDispatch(currentThread)) { currentThread->TailDispatcher().AddTask(this, r.forget(), aFailureHandling); return NS_OK; } mQueueMonitor.AssertCurrentThreadOwns(); if (mIsFlushing && aMode == AbortIfFlushing) { return NS_ERROR_ABORT; } if (mIsShutdown) { return NS_ERROR_FAILURE; } mTasks.push(r.forget()); if (mIsRunning) { return NS_OK; } nsRefPtr<nsIRunnable> runner(new Runner(this)); nsresult rv = mPool->Dispatch(runner.forget(), NS_DISPATCH_NORMAL); if (NS_FAILED(rv)) { NS_WARNING("Failed to dispatch runnable to run TaskQueue"); return rv; } mIsRunning = true; return NS_OK; }
/** * \brief The static function representing the code executed in the thread context. * * This function just calls the run() function of the subclass. * We need this level of indirection because pthread_create() cannot accept * a method which is non static or virtual. * @param param The pointer to the concrete subclass. * @return Always zero. */ void *AbstractThread::Execute(void* param) { AbstractThread* th = reinterpret_cast<AbstractThread*>(param); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); th->run(); return 0; }
SPHERE_THREADENTRY_RETNTYPE AbstractThread::runner(void *callerThread) { AbstractThread * caller = reinterpret_cast<AbstractThread*>(callerThread); if (caller != NULL) { caller->run(); caller->terminate(true); } return 0; }
virtual void Dispatch(already_AddRefed<nsIRunnable> aRunnable, DispatchFailureHandling aFailureHandling = AssertDispatchSuccess, DispatchReason aReason = NormalDispatch) override { nsCOMPtr<nsIRunnable> r = aRunnable; AbstractThread* currentThread; if (aReason != TailDispatch && (currentThread = GetCurrent()) && currentThread->RequiresTailDispatch()) { currentThread->TailDispatcher().AddTask(this, r.forget(), aFailureHandling); return; } nsresult rv = mTarget->Dispatch(r, NS_DISPATCH_NORMAL); MOZ_DIAGNOSTIC_ASSERT(aFailureHandling == DontAssertDispatchSuccess || NS_SUCCEEDED(rv)); unused << rv; }