NS_IMETHODIMP AsyncExecuteStatements::Run() { // Do not run if we have been canceled. { MutexAutoLock lockedScope(mMutex); if (mCancelRequested) mState = CANCELED; } if (mState == CANCELED) return notifyComplete(); // If there is more than one statement, run it in a transaction. We assume // that we have been given write statements since getting a batch of read // statements doesn't make a whole lot of sense. // Additionally, if we have only one statement and it needs a transaction, we // will wrap it in one. if (mStatements.Length() > 1 || mStatements[0].needsTransaction()) { // We don't error if this failed because it's not terrible if it does. mTransactionManager = new mozStorageTransaction(mConnection, PR_FALSE, mozIStorageConnection::TRANSACTION_IMMEDIATE); } // Execute each statement, giving the callback results if it returns any. for (PRUint32 i = 0; i < mStatements.Length(); i++) { bool finished = (i == (mStatements.Length() - 1)); // If we have parameters to bind, bind them, execute, and process. if (mStatements[i].hasParametersToBeBound()) { if (!bindExecuteAndProcessStatement(mStatements[i], finished)) break; } // Otherwise, just execute and process the statement. else if (!executeAndProcessStatement(mStatements[i], finished)) { break; } } // If we still have results that we haven't notified about, take care of // them now. if (mResultSet) (void)notifyResults(); // Notify about completion return notifyComplete(); }
void OfflineAudioDestinationNode::offlineRender() { ASSERT(!isMainThread()); ASSERT(m_renderBus.get()); if (!m_renderBus.get()) return; bool isAudioContextInitialized = context().isInitialized(); ASSERT(isAudioContextInitialized); if (!isAudioContextInitialized) return; bool channelsMatch = m_renderBus->numberOfChannels() == m_renderTarget->numberOfChannels(); ASSERT(channelsMatch); if (!channelsMatch) return; bool isRenderBusAllocated = m_renderBus->length() >= renderQuantumSize; ASSERT(isRenderBusAllocated); if (!isRenderBusAllocated) return; // Break up the render target into smaller "render quantize" sized pieces. // Render until we're finished. size_t framesToProcess = m_renderTarget->length(); unsigned numberOfChannels = m_renderTarget->numberOfChannels(); unsigned n = 0; while (framesToProcess > 0) { // Render one render quantum. render(0, m_renderBus.get(), renderQuantumSize); size_t framesAvailableToCopy = std::min(framesToProcess, renderQuantumSize); for (unsigned channelIndex = 0; channelIndex < numberOfChannels; ++channelIndex) { const float* source = m_renderBus->channel(channelIndex)->data(); float* destination = m_renderTarget->getChannelData(channelIndex)->data(); memcpy(destination + n, source, sizeof(float) * framesAvailableToCopy); } n += framesAvailableToCopy; framesToProcess -= framesAvailableToCopy; } // Our work is done. Let the AudioContext know. callOnMainThread([this] { notifyComplete(); deref(); }); }
void AsyncAudioDecoder::DecodingTask::decode() { ASSERT(m_audioData.get()); if (!m_audioData.get()) return; // Do the actual decoding and invoke the callback. m_audioBuffer = AudioBuffer::createFromAudioFileData(m_audioData->data(), m_audioData->byteLength(), false, sampleRate()); // Decoding is finished, but we need to do the callbacks on the main thread. callOnMainThread([this] { notifyComplete(); }); }
//-------------------------------------------------------------- void Wait::checkComplete() { bool isCompleted = false; if (isFrameBased) { if (ofGetFrameNum() >= startTime + duration) { isCompleted = true; } } else { if (ofGetElapsedTimef() >= startTime + duration) { isCompleted = true; } } if (isCompleted) { ofRemoveListener(ofEvents().update, this, &Wait::update); notifyComplete(); } }
NS_IMETHODIMP AsyncExecuteStatements::Run() { MOZ_ASSERT(!mConnection->isClosed()); // Do not run if we have been canceled. { MutexAutoLock lockedScope(mMutex); if (mCancelRequested) mState = CANCELED; } if (mState == CANCELED) return notifyComplete(); if (statementsNeedTransaction() && mConnection->getAutocommit()) { if (NS_SUCCEEDED(mConnection->beginTransactionInternal(mNativeConnection, mozIStorageConnection::TRANSACTION_IMMEDIATE))) { mHasTransaction = true; } #ifdef DEBUG else { NS_WARNING("Unable to create a transaction for async execution."); } #endif } // Execute each statement, giving the callback results if it returns any. for (uint32_t i = 0; i < mStatements.Length(); i++) { bool finished = (i == (mStatements.Length() - 1)); sqlite3_stmt *stmt; { // lock the sqlite mutex so sqlite3_errmsg cannot change SQLiteMutexAutoLock lockedScope(mDBMutex); int rc = mStatements[i].getSqliteStatement(&stmt); if (rc != SQLITE_OK) { // Set our error state. mState = ERROR; // Build the error object; can't call notifyError with the lock held nsCOMPtr<mozIStorageError> errorObj( new Error(rc, ::sqlite3_errmsg(mNativeConnection)) ); { // We cannot hold the DB mutex and call notifyError. SQLiteMutexAutoUnlock unlockedScope(mDBMutex); (void)notifyError(errorObj); } break; } } // If we have parameters to bind, bind them, execute, and process. if (mStatements[i].hasParametersToBeBound()) { if (!bindExecuteAndProcessStatement(mStatements[i], finished)) break; } // Otherwise, just execute and process the statement. else if (!executeAndProcessStatement(stmt, finished)) { break; } } // If we still have results that we haven't notified about, take care of // them now. if (mResultSet) (void)notifyResults(); // Notify about completion return notifyComplete(); }
NS_IMETHODIMP AsyncExecuteStatements::Run() { // Do not run if we have been canceled. { MutexAutoLock lockedScope(mMutex); if (mCancelRequested) mState = CANCELED; } if (mState == CANCELED) return notifyComplete(); if (statementsNeedTransaction()) { mTransactionManager = new mozStorageTransaction(mConnection, false, mozIStorageConnection::TRANSACTION_IMMEDIATE); } // Execute each statement, giving the callback results if it returns any. for (PRUint32 i = 0; i < mStatements.Length(); i++) { bool finished = (i == (mStatements.Length() - 1)); sqlite3_stmt *stmt; { // lock the sqlite mutex so sqlite3_errmsg cannot change SQLiteMutexAutoLock lockedScope(mDBMutex); int rc = mStatements[i].getSqliteStatement(&stmt); if (rc != SQLITE_OK) { // Set our error state. mState = ERROR; // Build the error object; can't call notifyError with the lock held sqlite3 *db = mConnection->GetNativeConnection(); nsCOMPtr<mozIStorageError> errorObj( new Error(rc, ::sqlite3_errmsg(db)) ); { // We cannot hold the DB mutex and call notifyError. SQLiteMutexAutoUnlock unlockedScope(mDBMutex); (void)notifyError(errorObj); } break; } } // If we have parameters to bind, bind them, execute, and process. if (mStatements[i].hasParametersToBeBound()) { if (!bindExecuteAndProcessStatement(mStatements[i], finished)) break; } // Otherwise, just execute and process the statement. else if (!executeAndProcessStatement(stmt, finished)) { break; } } // If we still have results that we haven't notified about, take care of // them now. if (mResultSet) (void)notifyResults(); // Notify about completion return notifyComplete(); }
//-------------------------------------------------------------- void Function::runFunction(Command* command) { if (f != NULL) { f(); } notifyComplete(); }