Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: content/browser/indexed_db/indexed_db_active_blob_registry.cc

Issue 18023022: Blob support for IDB [Chromium] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Settle on one name for the live blob journal. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 #include "base/bind.h"
6 #include "base/location.h"
7 #include "base/task_runner.h"
8 #include "content/browser/indexed_db/indexed_db_active_blob_registry.h"
9 #include "content/browser/indexed_db/indexed_db_backing_store.h"
10 #include "content/browser/indexed_db/indexed_db_factory.h"
11 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
12
13 namespace content {
14
15 IndexedDBActiveBlobRegistry::IndexedDBActiveBlobRegistry(
16 IndexedDBBackingStore* backing_store)
17 : backing_store_(backing_store),
18 weak_factory_(this) {
19 }
20
21 IndexedDBActiveBlobRegistry::~IndexedDBActiveBlobRegistry() {
22 DCHECK(use_tracker_.empty());
23 }
24
25 void IndexedDBActiveBlobRegistry::AddBlobRef(
26 int64 database_id, int64 blob_key) {
27 DCHECK(backing_store_->task_runner()->RunsTasksOnCurrentThread());
28 DCHECK(KeyPrefix::IsValidDatabaseId(database_id));
29 DCHECK(DatabaseMetaDataKey::IsValidBlobKey(blob_key));
30 DCHECK(deleted_dbs_.end() == deleted_dbs_.find(database_id));
31 bool need_ref = use_tracker_.empty();
32 SingleDBMap& single_db_map = use_tracker_[database_id];
33 SingleDBMap::iterator iter = single_db_map.find(blob_key);
34 if (iter == single_db_map.end()) {
35 single_db_map[blob_key] = false;
36 if (need_ref)
37 backing_store_->AddRef();
38 } else {
39 DCHECK(!need_ref);
40 DCHECK(!iter->second); // You can't add a reference once it's been deleted.
41 }
42 }
43
44 void IndexedDBActiveBlobRegistry::ReleaseBlobRef(
45 int64 database_id, int64 blob_key) {
46 DCHECK(backing_store_->task_runner()->RunsTasksOnCurrentThread());
47 DCHECK(KeyPrefix::IsValidDatabaseId(database_id));
48 DCHECK(DatabaseMetaDataKey::IsValidBlobKey(blob_key));
49 AllDBsMap::iterator db_pair = use_tracker_.find(database_id);
50 if (db_pair == use_tracker_.end()) {
51 NOTREACHED();
52 return;
53 }
54 SingleDBMap& single_db = db_pair->second;
55 SingleDBMap::iterator blob_pair = single_db.find(blob_key);
56 if (blob_pair == single_db.end()) {
57 NOTREACHED();
58 return;
59 }
60 bool delete_in_backend = false;
61 DeletedDBSet::iterator db_to_delete = deleted_dbs_.find(database_id);
62 bool db_marked_for_deletion = db_to_delete != deleted_dbs_.end();
63 // Don't bother deleting the file if we're going to delete its whole
64 // database directory soon.
65 delete_in_backend = blob_pair->second && !db_marked_for_deletion;
66 single_db.erase(blob_pair);
67 if (single_db.empty()) {
68 use_tracker_.erase(db_pair);
69 if (db_marked_for_deletion) {
70 delete_in_backend = true;
71 blob_key = DatabaseMetaDataKey::kAllBlobsKey;
72 deleted_dbs_.erase(db_to_delete);
73 }
74 }
75 if (delete_in_backend)
76 backing_store_->ReportBlobUnused(database_id, blob_key);
77 if (use_tracker_.empty()) {
78 backing_store_->task_runner()->PostTask(
79 FROM_HERE,
80 base::Bind(
81 &IndexedDBFactory::ReleaseBackingStore, backing_store_->factory(),
82 backing_store_->origin_url(), false));
83 backing_store_->Release();
84 }
85 }
86
87 bool IndexedDBActiveBlobRegistry::MarkDeletedCheckIfUsed(
88 int64 database_id, int64 blob_key) {
89 DCHECK(backing_store_->task_runner()->RunsTasksOnCurrentThread());
90 DCHECK(KeyPrefix::IsValidDatabaseId(database_id));
91 AllDBsMap::iterator db_pair = use_tracker_.find(database_id);
92 if (db_pair == use_tracker_.end())
93 return false;
94
95 if (blob_key == DatabaseMetaDataKey::kAllBlobsKey) {
96 deleted_dbs_.insert(database_id);
97 return true;
98 }
99
100 SingleDBMap& single_db = db_pair->second;
101 SingleDBMap::iterator iter = single_db.find(blob_key);
102 if (iter == single_db.end())
103 return false;
104
105 iter->second = true;
106 return true;
107 }
108
109 void IndexedDBActiveBlobRegistry::ReleaseBlobRefThreadSafe(
110 scoped_refptr<base::TaskRunner> task_runner,
111 base::WeakPtr<IndexedDBActiveBlobRegistry> weak_ptr, int64 database_id,
112 int64 blob_key, const base::FilePath& unused) {
113 task_runner->PostTask(
114 FROM_HERE,
115 base::Bind(
116 &IndexedDBActiveBlobRegistry::ReleaseBlobRef, weak_ptr,
117 database_id, blob_key));
118 }
119
120 webkit_blob::ShareableFileReference::FinalReleaseCallback
121 IndexedDBActiveBlobRegistry::GetFinalReleaseCallback(
122 int64 database_id, int64 blob_key) {
123 return base::Bind(
124 &IndexedDBActiveBlobRegistry::ReleaseBlobRefThreadSafe,
125 scoped_refptr<base::TaskRunner>(backing_store_->task_runner()),
126 weak_factory_.GetWeakPtr(), database_id, blob_key);
127 }
128
129 base::Closure IndexedDBActiveBlobRegistry::GetAddBlobRefCallback(
130 int64 database_id, int64 blob_key) {
131 return base::Bind(
132 &IndexedDBActiveBlobRegistry::AddBlobRef,
133 weak_factory_.GetWeakPtr(), database_id, blob_key);
134 }
135
136 void IndexedDBActiveBlobRegistry::ForceShutdown() {
137 weak_factory_.InvalidateWeakPtrs();
138 if (!use_tracker_.empty()) {
139 backing_store_->task_runner()->PostTask(
140 FROM_HERE,
141 base::Bind(
142 &IndexedDBFactory::ReleaseBackingStore, backing_store_->factory(),
143 backing_store_->origin_url(), true));
144 backing_store_->Release();
145 use_tracker_.clear();
146 }
147 }
148
149 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698