void IDBConnectionToServer::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) { LOG(IndexedDB, "IDBConnectionToServer::didCommitTransaction"); auto transaction = m_committingTransactions.take(transactionIdentifier); ASSERT(transaction); transaction->didCommit(error); }
bool ShadowTree::tryCommit(ShadowTreeCommitTransaction transaction) const { SystraceSection s("ShadowTree::tryCommit"); auto telemetry = MountingTelemetry{}; telemetry.willCommit(); SharedRootShadowNode oldRootShadowNode; { // Reading `rootShadowNode_` in shared manner. std::shared_lock<better::shared_mutex> lock(commitMutex_); oldRootShadowNode = rootShadowNode_; } UnsharedRootShadowNode newRootShadowNode = transaction(oldRootShadowNode); if (!newRootShadowNode) { return false; } std::vector<LayoutableShadowNode const *> affectedLayoutableNodes{}; affectedLayoutableNodes.reserve(1024); telemetry.willLayout(); newRootShadowNode->layout(&affectedLayoutableNodes); telemetry.didLayout(); newRootShadowNode->sealRecursive(); auto revisionNumber = ShadowTreeRevision::Number{}; { // Updating `rootShadowNode_` in unique manner if it hasn't changed. std::unique_lock<better::shared_mutex> lock(commitMutex_); if (rootShadowNode_ != oldRootShadowNode) { return false; } rootShadowNode_ = newRootShadowNode; { std::lock_guard<std::mutex> dispatchLock(EventEmitter::DispatchMutex()); updateMountedFlag( oldRootShadowNode->getChildren(), newRootShadowNode->getChildren()); } revisionNumber_++; revisionNumber = revisionNumber_; } emitLayoutEvents(affectedLayoutableNodes); telemetry.didCommit(); mountingCoordinator_->push( ShadowTreeRevision{newRootShadowNode, revisionNumber, telemetry}); if (delegate_) { delegate_->shadowTreeDidCommit(*this, mountingCoordinator_); } return true; }