.
// chromium/src/content/browser/indexed_db/indexed_db_transaction.cc
#include "content/browser/indexed_db/indexed_db_transaction.h"
#include "base/memory/weak_ptr.h"
void IndexedDBTransaction::RunTasks() {
// Se utiliza un WeakPtr para monitorear si 'this' (la transacción)
// es destruida durante la ejecución de una tarea.
base::WeakPtr<IndexedDBTransaction> weak_ptr = weak_factory_.GetWeakPtr(); if (is_commit_pending_) {
return;
} while (!task_queue_.empty() && state_ != FINISHED) {
DCHECK(!processing_event_queue_);
// Ejecutar la siguiente tarea en la cola
std::unique_ptr<IndexedDBRecordTask> task = std::move(task_queue_.front());
task_queue_.pop_front();
task->Run(this); // CRÍTICO: Después de que task->Run() se ejecuta, la transacción
// podría haber sido eliminada por una limpieza de conexiones.
// Verificamos si el weak_ptr sigue siendo válido antes de continuar.
if (!weak_ptr) {
return;
}
if (state_ == FINISHED) {
return;
}
} // Si la cola está vacía y estamos listos para hacer commit
if (task_queue_.empty() && state_ == COMMITTING) {
Commit();
}
}