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

Unified Diff: chrome/browser/sync/glue/browser_thread_model_worker.cc

Issue 14046031: Worker changes to prepare for lock-free shutdown. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/glue/browser_thread_model_worker.cc
diff --git a/chrome/browser/sync/glue/browser_thread_model_worker.cc b/chrome/browser/sync/glue/browser_thread_model_worker.cc
index f92b6885f7e905cf6aef42f359bbfbea901c1b54..6bed55907c23d8f0ae31d995e337a74ce76dbb9d 100644
--- a/chrome/browser/sync/glue/browser_thread_model_worker.cc
+++ b/chrome/browser/sync/glue/browser_thread_model_worker.cc
@@ -14,28 +14,31 @@ using content::BrowserThread;
namespace browser_sync {
BrowserThreadModelWorker::BrowserThreadModelWorker(
- BrowserThread::ID thread, syncer::ModelSafeGroup group)
- : thread_(thread), group_(group) {
+ BrowserThread::ID thread, syncer::ModelSafeGroup group,
+ syncer::WorkerObserver* observer)
+ : ModelSafeWorker(observer),
+ thread_(thread), group_(group) {
}
syncer::SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDone(
- const syncer::WorkCallback& work) {
+ const syncer::WorkCallback& work,
+ base::WaitableEvent* done) {
syncer::SyncerError error = syncer::UNSET;
if (BrowserThread::CurrentlyOn(thread_)) {
DLOG(WARNING) << "Already on thread " << thread_;
return work.Run();
}
- WaitableEvent done(false, false);
+
if (!BrowserThread::PostTask(
thread_,
FROM_HERE,
- base::Bind(&BrowserThreadModelWorker::CallDoWorkAndSignalTask, this,
- work, &done, &error))) {
+ base::Bind(&BrowserThreadModelWorker::CallDoWorkAndSignalTask,
+ this, work, done, &error))) {
DLOG(WARNING) << "Failed to post task to thread " << thread_;
error = syncer::CANNOT_DO_WORK;
return error;
}
- done.Wait();
+ done->Wait();
return error;
}
@@ -45,17 +48,28 @@ syncer::ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() {
BrowserThreadModelWorker::~BrowserThreadModelWorker() {}
+void BrowserThreadModelWorker::RegisterForLoopDestruction() {
+ if (BrowserThread::CurrentlyOn(thread_)) {
+ MessageLoop::current()->AddDestructionObserver(this);
+ } else {
+ BrowserThread::PostTask(
+ thread_, FROM_HERE,
+ Bind(&BrowserThreadModelWorker::RegisterForLoopDestruction, this));
+ }
+}
+
void BrowserThreadModelWorker::CallDoWorkAndSignalTask(
const syncer::WorkCallback& work,
WaitableEvent* done,
syncer::SyncerError* error) {
DCHECK(BrowserThread::CurrentlyOn(thread_));
- *error = work.Run();
+ if (!Stopped())
+ *error = work.Run();
done->Signal();
}
-DatabaseModelWorker::DatabaseModelWorker()
- : BrowserThreadModelWorker(BrowserThread::DB, syncer::GROUP_DB) {
+DatabaseModelWorker::DatabaseModelWorker(syncer::WorkerObserver* observer)
+ : BrowserThreadModelWorker(BrowserThread::DB, syncer::GROUP_DB, observer) {
}
void DatabaseModelWorker::CallDoWorkAndSignalTask(
@@ -67,8 +81,9 @@ void DatabaseModelWorker::CallDoWorkAndSignalTask(
DatabaseModelWorker::~DatabaseModelWorker() {}
-FileModelWorker::FileModelWorker()
- : BrowserThreadModelWorker(BrowserThread::FILE, syncer::GROUP_FILE) {
+FileModelWorker::FileModelWorker(syncer::WorkerObserver* observer)
+ : BrowserThreadModelWorker(BrowserThread::FILE, syncer::GROUP_FILE,
+ observer) {
}
void FileModelWorker::CallDoWorkAndSignalTask(

Powered by Google App Engine
This is Rietveld 408576698