| 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(
|
|
|