| Index: content/browser/indexed_db/indexed_db_active_blob_registry.h
|
| diff --git a/content/browser/indexed_db/indexed_db_active_blob_registry.h b/content/browser/indexed_db/indexed_db_active_blob_registry.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a04c5a657d68c6a1524f802f9c4081fa997042dd
|
| --- /dev/null
|
| +++ b/content/browser/indexed_db/indexed_db_active_blob_registry.h
|
| @@ -0,0 +1,71 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_ACTIVE_BLOB_REGISTRY_H_
|
| +#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_ACTIVE_BLOB_REGISTRY_H_
|
| +
|
| +#include <map>
|
| +#include <set>
|
| +#include <utility>
|
| +#include "base/basictypes.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "webkit/common/blob/shareable_file_reference.h"
|
| +
|
| +namespace content {
|
| +
|
| +class IndexedDBBackingStore;
|
| +
|
| +class IndexedDBActiveBlobRegistry {
|
| +public:
|
| + IndexedDBActiveBlobRegistry(IndexedDBBackingStore* backing_store);
|
| + ~IndexedDBActiveBlobRegistry();
|
| +
|
| + // Most methods of this class, and the closure returned by
|
| + // GetAddBlobRefCallback, should only be called on the backing_store's task
|
| + // runner. The exception is the closure returned by GetFinalReleaseCallback,
|
| + // which just calls ReleaseBlobRefThreadSafe.
|
| +
|
| + // Use DatabaseMetaDataKey::AllBlobsKey for "the whole database".
|
| + bool MarkDeletedCheckIfUsed(int64 database_id, int64 blob_key);
|
| +
|
| + webkit_blob::ShareableFileReference::FinalReleaseCallback
|
| + GetFinalReleaseCallback(int64 database_id, int64 blob_key);
|
| + // This closure holds a raw pointer to the IndexedDBActiveBlobRegistry,
|
| + // and may not be called after it is deleted.
|
| + base::Closure GetAddBlobRefCallback(int64 database_id, int64 blob_key);
|
| + // Call this to force the registry to drop its reference to the backing store.
|
| + // This will also turn any outstanding callbacks into no-ops.
|
| + void ForceShutdown();
|
| +
|
| +private:
|
| + void AddBlobRef(int64 database_id, int64 blob_key);
|
| + void ReleaseBlobRef(int64 database_id, int64 blob_key);
|
| + static void ReleaseBlobRefThreadSafe(
|
| + scoped_refptr<base::TaskRunner> task_runner,
|
| + base::WeakPtr<IndexedDBActiveBlobRegistry> weak_ptr, int64 database_id,
|
| + int64 blob_key, const base::FilePath& unused);
|
| +
|
| + // Maps blob_key -> IsDeleted; if the record's absent, it's not in active use
|
| + // and we don't care if it's deleted.
|
| + typedef std::map<int64, bool> SingleDBMap;
|
| + // Maps DB ID -> SingleDBMap
|
| + typedef std::map<int64, SingleDBMap> AllDBsMap;
|
| + typedef std::set<int64> DeletedDBSet;
|
| +
|
| + AllDBsMap use_tracker_;
|
| + DeletedDBSet deleted_dbs_;
|
| + // Think of backing_store_ as a scoped_refptr, but it's manually managed.
|
| + // We'll hold a reference as long as there's a blob registered in use_counts_,
|
| + // but not otherwise. Ideally the blobs would hold the references themselves,
|
| + // but they live on the wrong thread.
|
| + IndexedDBBackingStore* backing_store_;
|
| + base::WeakPtrFactory<IndexedDBActiveBlobRegistry> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(IndexedDBActiveBlobRegistry);
|
| +};
|
| +
|
| +} // namespace content
|
| +
|
| +#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_ACTIVE_BLOB_REGISTRY_H_
|
|
|