1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_TRANSACTION_COORDINATOR_H_ 6#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_TRANSACTION_COORDINATOR_H_ 7 8#include <map> 9#include <set> 10#include <vector> 11 12#include "base/memory/ref_counted.h" 13#include "base/memory/scoped_ptr.h" 14#include "content/browser/indexed_db/list_set.h" 15 16namespace content { 17 18class IndexedDBTransaction; 19 20// Transactions are executed in the order the were created. 21class IndexedDBTransactionCoordinator { 22 public: 23 IndexedDBTransactionCoordinator(); 24 ~IndexedDBTransactionCoordinator(); 25 26 // Called by transactions as they start and finish. 27 void DidCreateTransaction(scoped_refptr<IndexedDBTransaction> transaction); 28 void DidFinishTransaction(IndexedDBTransaction* transaction); 29 30 bool IsRunningVersionChangeTransaction() const; 31 32#ifndef NDEBUG 33 bool IsActive(IndexedDBTransaction* transaction); 34#endif 35 36 // Makes a snapshot of the transaction queue. For diagnostics only. 37 std::vector<const IndexedDBTransaction*> GetTransactions() const; 38 39 private: 40 typedef list_set<scoped_refptr<IndexedDBTransaction> > TransactionSet; 41 42 void ProcessQueuedTransactions(); 43 bool CanStartTransaction(IndexedDBTransaction* const transaction, 44 const std::set<int64>& locked_scope) const; 45 46 // Transactions in different states are grouped below. 47 // list_set is used to provide stable ordering; required by spec 48 // for the queue, convenience for diagnostics for the rest. 49 TransactionSet queued_transactions_; 50 TransactionSet started_transactions_; 51 52 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionCoordinator); 53}; 54 55} // namespace content 56 57#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_TRANSACTION_COORDINATOR_H_ 58