1 // Copyright (c) 2012 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 "chrome/browser/sync/glue/browser_thread_model_worker.h" 6 7 #include "base/bind.h" 8 #include "base/synchronization/waitable_event.h" 9 #include "content/public/browser/browser_thread.h" 10 11 using base::WaitableEvent; 12 using content::BrowserThread; 13 14 namespace browser_sync { 15 16 BrowserThreadModelWorker::BrowserThreadModelWorker( 17 BrowserThread::ID thread, syncer::ModelSafeGroup group, 18 syncer::WorkerLoopDestructionObserver* observer) 19 : ModelSafeWorker(observer), 20 thread_(thread), group_(group) { 21 } 22 23 syncer::SyncerError BrowserThreadModelWorker::DoWorkAndWaitUntilDoneImpl( 24 const syncer::WorkCallback& work) { 25 syncer::SyncerError error = syncer::UNSET; 26 if (BrowserThread::CurrentlyOn(thread_)) { 27 DLOG(WARNING) << "Already on thread " << thread_; 28 return work.Run(); 29 } 30 31 if (!BrowserThread::PostTask( 32 thread_, 33 FROM_HERE, 34 base::Bind(&BrowserThreadModelWorker::CallDoWorkAndSignalTask, 35 this, work, 36 work_done_or_stopped(), &error))) { 37 DLOG(WARNING) << "Failed to post task to thread " << thread_; 38 error = syncer::CANNOT_DO_WORK; 39 return error; 40 } 41 work_done_or_stopped()->Wait(); 42 return error; 43 } 44 45 syncer::ModelSafeGroup BrowserThreadModelWorker::GetModelSafeGroup() { 46 return group_; 47 } 48 49 BrowserThreadModelWorker::~BrowserThreadModelWorker() {} 50 51 void BrowserThreadModelWorker::RegisterForLoopDestruction() { 52 if (BrowserThread::CurrentlyOn(thread_)) { 53 SetWorkingLoopToCurrent(); 54 } else { 55 BrowserThread::PostTask( 56 thread_, FROM_HERE, 57 Bind(&BrowserThreadModelWorker::RegisterForLoopDestruction, this)); 58 } 59 } 60 61 void BrowserThreadModelWorker::CallDoWorkAndSignalTask( 62 const syncer::WorkCallback& work, 63 WaitableEvent* done, 64 syncer::SyncerError* error) { 65 DCHECK(BrowserThread::CurrentlyOn(thread_)); 66 if (!IsStopped()) 67 *error = work.Run(); 68 done->Signal(); 69 } 70 71 DatabaseModelWorker::DatabaseModelWorker( 72 syncer::WorkerLoopDestructionObserver* observer) 73 : BrowserThreadModelWorker(BrowserThread::DB, syncer::GROUP_DB, observer) { 74 } 75 76 void DatabaseModelWorker::CallDoWorkAndSignalTask( 77 const syncer::WorkCallback& work, 78 WaitableEvent* done, 79 syncer::SyncerError* error) { 80 BrowserThreadModelWorker::CallDoWorkAndSignalTask(work, done, error); 81 } 82 83 DatabaseModelWorker::~DatabaseModelWorker() {} 84 85 FileModelWorker::FileModelWorker( 86 syncer::WorkerLoopDestructionObserver* observer) 87 : BrowserThreadModelWorker(BrowserThread::FILE, syncer::GROUP_FILE, 88 observer) { 89 } 90 91 void FileModelWorker::CallDoWorkAndSignalTask( 92 const syncer::WorkCallback& work, 93 WaitableEvent* done, 94 syncer::SyncerError* error) { 95 BrowserThreadModelWorker::CallDoWorkAndSignalTask(work, done, error); 96 } 97 98 FileModelWorker::~FileModelWorker() {} 99 100 } // namespace browser_sync 101