void* DatabaseThread::databaseThread() { LOG(StorageAPI, "Starting DatabaseThread %p", this); AutodrainedPool pool; while (true) { RefPtr<DatabaseTask> task; if (!m_queue.waitForMessage(task)) break; task->performTask(); pool.cycle(); } LOG(StorageAPI, "About to detach thread %i and clear the ref to DatabaseThread %p, which currently has %i ref(s)", m_threadID, this, refCount()); // Detach the thread so its resources are no longer of any concern to anyone else detachThread(m_threadID); // Clear the self refptr, possibly resulting in deletion m_selfRef = 0; return 0; }
void StorageThread::threadEntryPoint() { ASSERT(!isMainThread()); AutodrainedPool pool; while (OwnPtr<StorageTask> task = m_queue.waitForMessage()) { task->performTask(); pool.cycle(); } }
void* DatabaseThread::databaseThread() { { // Wait for DatabaseThread::start() to complete. MutexLocker lock(m_threadCreationMutex); LOG(StorageAPI, "Started DatabaseThread %p", this); } AutodrainedPool pool; while (OwnPtr<DatabaseTask> task = m_queue.waitForMessage()) { task->performTask(); pool.cycle(); } // Clean up the list of all pending transactions on this database thread m_transactionCoordinator->shutdown(); LOG(StorageAPI, "About to detach thread %i and clear the ref to DatabaseThread %p, which currently has %i ref(s)", m_threadID, this, refCount()); // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don't leave the database in an // inconsistent or locked state. if (m_openDatabaseSet.size() > 0) { // As the call to close will modify the original set, we must take a copy to iterate over. DatabaseSet openSetCopy; openSetCopy.swap(m_openDatabaseSet); DatabaseSet::iterator end = openSetCopy.end(); for (DatabaseSet::iterator it = openSetCopy.begin(); it != end; ++it) (*it)->close(Database::RemoveDatabaseFromContext); } // Detach the thread so its resources are no longer of any concern to anyone else detachThread(m_threadID); DatabaseTaskSynchronizer* cleanupSync = m_cleanupSync; // Clear the self refptr, possibly resulting in deletion m_selfRef = 0; if (cleanupSync) // Someone wanted to know when we were done cleaning up. cleanupSync->taskCompleted(); return 0; }
void* DatabaseThread::databaseThread() { { // Wait for DatabaseThread::start() to complete. MutexLocker lock(m_threadCreationMutex); LOG(StorageAPI, "Started DatabaseThread %p", this); } AutodrainedPool pool; while (true) { RefPtr<DatabaseTask> task; if (!m_queue.waitForMessage(task)) break; task->performTask(); pool.cycle(); } LOG(StorageAPI, "About to detach thread %i and clear the ref to DatabaseThread %p, which currently has %i ref(s)", m_threadID, this, refCount()); // Close the databases that we ran transactions on. This ensures that if any transactions are still open, they are rolled back and we don't leave the database in an // inconsistent or locked state. if (m_openDatabaseSet.size() > 0) { // As the call to close will modify the original set, we must take a copy to iterate over. DatabaseSet openSetCopy; openSetCopy.swap(m_openDatabaseSet); DatabaseSet::iterator end = openSetCopy.end(); for (DatabaseSet::iterator it = openSetCopy.begin(); it != end; ++it) (*it)->close(); } // Detach the thread so its resources are no longer of any concern to anyone else detachThread(m_threadID); // Clear the self refptr, possibly resulting in deletion m_selfRef = 0; return 0; }