Index: components/dom_distiller/core/dom_distiller_database.cc |
diff --git a/components/dom_distiller/core/dom_distiller_database.cc b/components/dom_distiller/core/dom_distiller_database.cc |
index a4d599c3401be6d189bb1527d99a42bfe844beb4..cda79fb86c47242ef6d11d687e41421b2c86e7a0 100644 |
--- a/components/dom_distiller/core/dom_distiller_database.cc |
+++ b/components/dom_distiller/core/dom_distiller_database.cc |
@@ -23,11 +23,17 @@ using base::SequencedTaskRunner; |
namespace dom_distiller { |
-DomDistillerDatabase::LevelDB::LevelDB() {} |
+DomDistillerDatabase::LevelDB::LevelDB() { |
+ thread_checker_.DetachFromThread(); |
+} |
-DomDistillerDatabase::LevelDB::~LevelDB() {} |
+DomDistillerDatabase::LevelDB::~LevelDB() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+} |
bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
leveldb::Options options; |
options.create_if_missing = true; |
options.max_open_files = 0; // Use minimum. |
@@ -37,7 +43,6 @@ bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
leveldb::DB* db = NULL; |
leveldb::Status status = leveldb::DB::Open(options, path, &db); |
if (status.IsCorruption()) { |
- LOG(WARNING) << "Deleting possibly-corrupt database"; |
base::DeleteFile(database_dir, true); |
status = leveldb::DB::Open(options, path, &db); |
} |
@@ -54,6 +59,8 @@ bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
} |
bool DomDistillerDatabase::LevelDB::Save(const EntryVector& entries) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
leveldb::WriteBatch updates; |
for (EntryVector::const_iterator it = entries.begin(); it != entries.end(); |
++it) { |
@@ -67,11 +74,14 @@ bool DomDistillerDatabase::LevelDB::Save(const EntryVector& entries) { |
if (status.ok()) |
return true; |
- LOG(WARNING) << "Failed writing dom_distiller entries: " << status.ToString(); |
+ DLOG(WARNING) << "Failed writing dom_distiller entries: " |
+ << status.ToString(); |
return false; |
} |
bool DomDistillerDatabase::LevelDB::Load(EntryVector* entries) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
leveldb::ReadOptions options; |
scoped_ptr<leveldb::Iterator> db_iterator(db_->NewIterator(options)); |
for (db_iterator->SeekToFirst(); db_iterator->Valid(); db_iterator->Next()) { |
@@ -79,8 +89,8 @@ bool DomDistillerDatabase::LevelDB::Load(EntryVector* entries) { |
ArticleEntry entry; |
if (!entry.ParseFromArray(value_slice.data(), value_slice.size())) { |
- LOG(WARNING) << "Unable to parse dom_distiller entry " |
- << db_iterator->key().ToString(); |
+ DLOG(WARNING) << "Unable to parse dom_distiller entry " |
+ << db_iterator->key().ToString(); |
// TODO(cjhopman): Decide what to do about un-parseable entries. |
} |
entries->push_back(entry); |
@@ -88,26 +98,6 @@ bool DomDistillerDatabase::LevelDB::Load(EntryVector* entries) { |
return true; |
} |
-DomDistillerDatabase::DomDistillerDatabase( |
- scoped_refptr<base::SequencedTaskRunner> task_runner) |
- : task_runner_(task_runner), weak_ptr_factory_(this) { |
- main_loop_ = MessageLoop::current(); |
-} |
- |
-void DomDistillerDatabase::Destroy() { |
- DCHECK(IsRunOnMainLoop()); |
- weak_ptr_factory_.InvalidateWeakPtrs(); |
- task_runner_->PostNonNestableTask( |
- FROM_HERE, |
- base::Bind(&DomDistillerDatabase::DestroyFromTaskRunner, |
- base::Unretained(this))); |
-} |
- |
-void DomDistillerDatabase::Init(const base::FilePath& database_dir, |
- InitCallback callback) { |
- InitWithDatabase(scoped_ptr<Database>(new LevelDB()), database_dir, callback); |
-} |
- |
namespace { |
void RunInitCallback(DomDistillerDatabaseInterface::InitCallback callback, |
@@ -126,20 +116,57 @@ void RunLoadCallback(DomDistillerDatabaseInterface::LoadCallback callback, |
callback.Run(*success, entries.Pass()); |
} |
+void InitFromTaskRunner(DomDistillerDatabase::Database* database, |
+ const base::FilePath& database_dir, |
+ bool* success) { |
+ DCHECK(success); |
+ |
+ // TODO(cjhopman): Histogram for database size. |
+ *success = database->Init(database_dir); |
+} |
+ |
+void SaveEntriesFromTaskRunner(DomDistillerDatabase::Database* database, |
+ scoped_ptr<EntryVector> entries, |
+ bool* success) { |
+ DCHECK(success); |
+ *success = database->Save(*entries); |
+} |
+ |
+void LoadEntriesFromTaskRunner(DomDistillerDatabase::Database* database, |
+ EntryVector* entries, |
+ bool* success) { |
+ DCHECK(success); |
+ DCHECK(entries); |
+ |
+ entries->clear(); |
+ *success = database->Load(entries); |
+} |
+ |
} // namespace |
+DomDistillerDatabase::DomDistillerDatabase( |
+ scoped_refptr<base::SequencedTaskRunner> task_runner) |
+ : task_runner_(task_runner) { |
+} |
+ |
+void DomDistillerDatabase::Init(const base::FilePath& database_dir, |
+ InitCallback callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ InitWithDatabase(scoped_ptr<Database>(new LevelDB()), database_dir, callback); |
+} |
+ |
void DomDistillerDatabase::InitWithDatabase(scoped_ptr<Database> database, |
const base::FilePath& database_dir, |
InitCallback callback) { |
- DCHECK(IsRunOnMainLoop()); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(!db_); |
DCHECK(database); |
db_.reset(database.release()); |
bool* success = new bool(false); |
task_runner_->PostTaskAndReply( |
FROM_HERE, |
- base::Bind(&DomDistillerDatabase::InitFromTaskRunner, |
- base::Unretained(this), |
+ base::Bind(InitFromTaskRunner, |
+ base::Unretained(db_.get()), |
database_dir, |
success), |
base::Bind(RunInitCallback, callback, base::Owned(success))); |
@@ -147,20 +174,19 @@ void DomDistillerDatabase::InitWithDatabase(scoped_ptr<Database> database, |
void DomDistillerDatabase::SaveEntries(scoped_ptr<EntryVector> entries, |
SaveCallback callback) { |
- DCHECK(IsRunOnMainLoop()); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
bool* success = new bool(false); |
task_runner_->PostTaskAndReply( |
FROM_HERE, |
- base::Bind(&DomDistillerDatabase::SaveEntriesFromTaskRunner, |
- base::Unretained(this), |
+ base::Bind(SaveEntriesFromTaskRunner, |
+ base::Unretained(db_.get()), |
base::Passed(&entries), |
success), |
base::Bind(RunSaveCallback, callback, base::Owned(success))); |
} |
void DomDistillerDatabase::LoadEntries(LoadCallback callback) { |
- DCHECK(IsRunOnMainLoop()); |
- |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
bool* success = new bool(false); |
scoped_ptr<EntryVector> entries(new EntryVector()); |
@@ -169,8 +195,8 @@ void DomDistillerDatabase::LoadEntries(LoadCallback callback) { |
task_runner_->PostTaskAndReply( |
FROM_HERE, |
- base::Bind(&DomDistillerDatabase::LoadEntriesFromTaskRunner, |
- base::Unretained(this), |
+ base::Bind(LoadEntriesFromTaskRunner, |
+ base::Unretained(db_.get()), |
entries_ptr, |
success), |
base::Bind(RunLoadCallback, |
@@ -179,50 +205,11 @@ void DomDistillerDatabase::LoadEntries(LoadCallback callback) { |
base::Passed(&entries))); |
} |
-DomDistillerDatabase::~DomDistillerDatabase() { DCHECK(IsRunByTaskRunner()); } |
- |
-bool DomDistillerDatabase::IsRunByTaskRunner() const { |
- return task_runner_->RunsTasksOnCurrentThread(); |
-} |
- |
-bool DomDistillerDatabase::IsRunOnMainLoop() const { |
- return MessageLoop::current() == main_loop_; |
-} |
- |
-void DomDistillerDatabase::DestroyFromTaskRunner() { |
- DCHECK(IsRunByTaskRunner()); |
- delete this; |
-} |
- |
-void DomDistillerDatabase::InitFromTaskRunner( |
- const base::FilePath& database_dir, |
- bool* success) { |
- DCHECK(IsRunByTaskRunner()); |
- DCHECK(success); |
- |
- VLOG(1) << "Opening " << database_dir.value(); |
- |
- // TODO(cjhopman): Histogram for database size. |
- *success = db_->Init(database_dir); |
-} |
- |
-void DomDistillerDatabase::SaveEntriesFromTaskRunner( |
- scoped_ptr<EntryVector> entries, |
- bool* success) { |
- DCHECK(IsRunByTaskRunner()); |
- DCHECK(success); |
- VLOG(1) << "Saving " << entries->size() << " entry(ies) to database "; |
- *success = db_->Save(*entries); |
-} |
- |
-void DomDistillerDatabase::LoadEntriesFromTaskRunner(EntryVector* entries, |
- bool* success) { |
- DCHECK(IsRunByTaskRunner()); |
- DCHECK(success); |
- DCHECK(entries); |
- |
- entries->clear(); |
- *success = db_->Load(entries); |
+DomDistillerDatabase::~DomDistillerDatabase() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!task_runner_->DeleteSoon(FROM_HERE, db_.release())) { |
+ DLOG(WARNING) << "DOM distiller database will not be deleted."; |
+ } |
} |
} // namespace dom_distiller |