bool GenericSchedulerThread::quitThread(bool allowRestarts) { if ( !isRunning() ) { return false; } // Disallow temporarily any thread to request a new render so that we do not end up starting the thread again // just after the abort { QMutexLocker k(&_imp->mustQuitMutex); // We already called quitThread if (_imp->mustQuit || !_imp->lastQuitThreadAllowedRestart) { return true; } _imp->mustQuit = true; _imp->startingThreadAllowed = false; _imp->lastQuitThreadAllowedRestart = allowRestarts; } if (getThreadState() == eThreadStateActive) { abortThreadedTask(); } // Clear any task enqueued and push a fake request { QMutexLocker k(&_imp->enqueuedTasksMutex); _imp->enqueuedTasks.clear(); boost::shared_ptr<GenericThreadStartArgs> stubArgs( new GenericThreadStartArgs(true) ); _imp->enqueuedTasks.push_back(stubArgs); } // Wake-up the thread with a fake request { QMutexLocker l3(&_imp->startRequestsMutex); ++_imp->startRequests; _imp->startRequestsCond.wakeOne(); } #ifdef TRACE_GENERIC_SCHEDULER_THREAD qDebug() << QThread::currentThread() << ": Termination request on " << getThreadName().c_str(); #endif onQuitRequested(allowRestarts); return true; }
void EditorApplication::quitRequested() { onQuitRequested(); }