Chromium Code Reviews| 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..27c327adf87b726b0fbdee5b354deaf89b9465eb 100644 |
| --- a/components/dom_distiller/core/dom_distiller_database.cc |
| +++ b/components/dom_distiller/core/dom_distiller_database.cc |
| @@ -23,11 +23,15 @@ using base::SequencedTaskRunner; |
| namespace dom_distiller { |
| -DomDistillerDatabase::LevelDB::LevelDB() {} |
| +DomDistillerDatabase::LevelDB::LevelDB() { |
| + thread_checker_.DetachFromThread(); |
| +} |
| DomDistillerDatabase::LevelDB::~LevelDB() {} |
|
Nico
2013/11/03 23:29:52
should the destructor check too? (the class has a
cjhopman
2013/11/04 18:40:59
Done.
|
| bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
| + thread_checker_.CalledOnValidThread(); |
|
Nico
2013/11/03 23:29:52
This does nothing as is. The function just returns
cjhopman
2013/11/04 18:40:59
Ha, that's amusing. Done.
|
| + |
| leveldb::Options options; |
| options.create_if_missing = true; |
| options.max_open_files = 0; // Use minimum. |
| @@ -54,6 +58,8 @@ bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
| } |
| bool DomDistillerDatabase::LevelDB::Save(const EntryVector& entries) { |
| + thread_checker_.CalledOnValidThread(); |
| + |
| leveldb::WriteBatch updates; |
| for (EntryVector::const_iterator it = entries.begin(); it != entries.end(); |
| ++it) { |
| @@ -72,6 +78,8 @@ bool DomDistillerDatabase::LevelDB::Save(const EntryVector& entries) { |
| } |
| bool DomDistillerDatabase::LevelDB::Load(EntryVector* entries) { |
| + 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()) { |
| @@ -88,26 +96,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 +114,59 @@ void RunLoadCallback(DomDistillerDatabaseInterface::LoadCallback callback, |
| callback.Run(*success, entries.Pass()); |
| } |
| +void InitFromTaskRunner(DomDistillerDatabase::Database* database, |
| + const base::FilePath& database_dir, |
| + bool* success) { |
| + DCHECK(success); |
| + |
| + VLOG(1) << "Opening " << database_dir.value(); |
|
Nico
2013/11/03 23:29:52
Is this useful? In general, stuff shouldn't log st
cjhopman
2013/11/04 18:40:59
I've gone over the LOG/VLOG and removed/quieted th
|
| + |
| + // TODO(cjhopman): Histogram for database size. |
| + *success = database->Init(database_dir); |
| +} |
| + |
| +void SaveEntriesFromTaskRunner(DomDistillerDatabase::Database* database, |
| + scoped_ptr<EntryVector> entries, |
| + bool* success) { |
| + DCHECK(success); |
| + VLOG(1) << "Saving " << entries->size() << " entry(ies) to database "; |
| + *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) { |
| + 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) { |
|
Nico
2013/11/03 23:29:52
Does this intentionally not use thread_checker_ ?
cjhopman
2013/11/04 18:40:59
Hm. I was using thread_checker_ to enforce that us
|
| - DCHECK(IsRunOnMainLoop()); |
| 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()); |
| + 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()); |
| - |
| + 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,10 @@ 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() { |
| + if (!task_runner_->DeleteSoon(FROM_HERE, db_.release())) { |
| + LOG(WARNING) << "DOM distiller database will not be deleted."; |
| + } |
| } |
| } // namespace dom_distiller |