void IDBTransactionBackendImpl::taskTimerFired(Timer<IDBTransactionBackendImpl>*) { IDB_TRACE("IDBTransactionBackendImpl::taskTimerFired"); ASSERT(!isTaskQueueEmpty()); if (m_state == StartPending) { m_transaction.begin(); m_state = Running; } // The last reference to this object may be released while performing the // tasks. Take take a self reference to keep this object alive so that // the loop termination conditions can be checked. RefPtr<IDBTransactionBackendImpl> protect(this); TaskQueue* taskQueue = m_pendingPreemptiveEvents ? &m_preemptiveTaskQueue : &m_taskQueue; while (!taskQueue->isEmpty() && m_state != Finished) { ASSERT(m_state == Running); OwnPtr<Operation> task(taskQueue->takeFirst()); task->perform(this); // Event itself may change which queue should be processed next. taskQueue = m_pendingPreemptiveEvents ? &m_preemptiveTaskQueue : &m_taskQueue; } // If there are no pending tasks, we haven't already committed/aborted, // and the front-end requested a commit, it is now safe to do so. if (!hasPendingTasks() && m_state != Finished && m_commitPending) commit(); }
void IDBTransactionBackendImpl::taskTimerFired(Timer<IDBTransactionBackendImpl>*) { IDB_TRACE("IDBTransactionBackendImpl::taskTimerFired"); ASSERT(!isTaskQueueEmpty()); if (m_state == StartPending) { m_transaction->begin(); m_state = Running; } TaskQueue* taskQueue = m_pendingPreemptiveEvents ? &m_preemptiveTaskQueue : &m_taskQueue; while (!taskQueue->isEmpty() && m_state != Finished) { ASSERT(m_state == Running); OwnPtr<ScriptExecutionContext::Task> task(taskQueue->takeFirst()); m_pendingEvents++; task->performTask(0); // Event itself may change which queue should be processed next. taskQueue = m_pendingPreemptiveEvents ? &m_preemptiveTaskQueue : &m_taskQueue; } }