void HRTFDatabaseLoader::waitForLoaderThreadCompletion() { if (!m_thread) return; TaskSynchronizer sync; // TODO(alexclarke): Should this be posted as a loading task? m_thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&HRTFDatabaseLoader::cleanupTask, AllowCrossThreadAccess(this), AllowCrossThreadAccess(&sync))); sync.waitForTaskCompletion(); m_thread.clear(); }
void HTMLParserThread::shutdown() { ASSERT(s_sharedThread); // currentThread will always be non-null in production, but can be null in Chromium unit tests. if (blink::Platform::current()->currentThread() && s_sharedThread->isRunning()) { TaskSynchronizer taskSynchronizer; s_sharedThread->postTask(WTF::bind(&HTMLParserThread::cleanupHTMLParserThread, s_sharedThread, &taskSynchronizer)); taskSynchronizer.waitForTaskCompletion(); } delete s_sharedThread; s_sharedThread = 0; }
bool DatabaseBackend::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) { TaskSynchronizer synchronizer; if (!databaseContext()->databaseThread() || databaseContext()->databaseThread()->terminationRequested(&synchronizer)) return false; DatabaseTracker::tracker().prepareToOpenDatabase(this); bool success = false; OwnPtr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &synchronizer, error, errorMessage, success); databaseContext()->databaseThread()->scheduleTask(task.release()); synchronizer.waitForTaskCompletion(); return success; }
Vector<String> Database::tableNames() { // FIXME: Not using isolatedCopy on these strings looks ok since threads // take strict turns in dealing with them. However, if the code changes, // this may not be true anymore. Vector<String> result; TaskSynchronizer synchronizer; if (!databaseContext()->databaseThreadAvailable()) return result; OwnPtr<DatabaseTableNamesTask> task = DatabaseTableNamesTask::create(this, &synchronizer, result); databaseContext()->databaseThread()->scheduleTask(task.release()); synchronizer.waitForTaskCompletion(); return result; }
void DatabaseContext::stopDatabases() { stopSyncDatabases(); // Though we initiate termination of the DatabaseThread here in // stopDatabases(), we can't clear the m_databaseThread ref till we get to // the destructor. This is because the Databases that are managed by // DatabaseThread still rely on this ref between the context and the thread // to execute the task for closing the database. By the time we get to the // destructor, we're guaranteed that the databases are destructed (which is // why our ref count is 0 then and we're destructing). Then, the // m_databaseThread RefPtr destructor will deref and delete the // DatabaseThread. if (m_databaseThread && !m_hasRequestedTermination) { TaskSynchronizer sync; m_databaseThread->requestTermination(&sync); m_hasRequestedTermination = true; sync.waitForTaskCompletion(); } }