| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/glue/password_model_worker.h" | 5 #include "chrome/browser/sync/glue/password_model_worker.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/synchronization/waitable_event.h" | 9 #include "base/synchronization/waitable_event.h" |
| 10 #include "chrome/browser/password_manager/password_store.h" | 10 #include "chrome/browser/password_manager/password_store.h" |
| 11 | 11 |
| 12 using base::WaitableEvent; | 12 using base::WaitableEvent; |
| 13 | 13 |
| 14 namespace browser_sync { | 14 namespace browser_sync { |
| 15 | 15 |
| 16 PasswordModelWorker::PasswordModelWorker( | 16 PasswordModelWorker::PasswordModelWorker( |
| 17 const scoped_refptr<PasswordStore>& password_store, | 17 const scoped_refptr<PasswordStore>& password_store, |
| 18 syncer::WorkerLoopDestructionObserver* observer) | 18 syncer::WorkerLoopDestructionObserver* observer) |
| 19 : syncer::ModelSafeWorker(observer), | 19 : syncer::ModelSafeWorker(observer), |
| 20 password_store_(password_store) { | 20 password_store_(password_store) { |
| 21 DCHECK(password_store.get()); | 21 DCHECK(password_store.get()); |
| 22 } | 22 } |
| 23 | 23 |
| 24 void PasswordModelWorker::RegisterForLoopDestruction() { | 24 void PasswordModelWorker::RegisterForLoopDestruction() { |
| 25 base::AutoLock lock(password_store_lock_); |
| 25 password_store_->ScheduleTask( | 26 password_store_->ScheduleTask( |
| 26 base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction, | 27 base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction, |
| 27 this)); | 28 this)); |
| 28 } | 29 } |
| 29 | 30 |
| 30 syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl( | 31 syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl( |
| 31 const syncer::WorkCallback& work) { | 32 const syncer::WorkCallback& work) { |
| 32 syncer::SyncerError error = syncer::UNSET; | 33 syncer::SyncerError error = syncer::UNSET; |
| 33 if (password_store_->ScheduleTask( | 34 |
| 34 base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask, | 35 bool scheduled = false; |
| 35 this, work, work_done_or_stopped(), &error))) { | 36 { |
| 37 base::AutoLock lock(password_store_lock_); |
| 38 if (!password_store_.get()) |
| 39 return syncer::CANNOT_DO_WORK; |
| 40 |
| 41 scheduled = password_store_->ScheduleTask( |
| 42 base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask, |
| 43 this, work, work_done_or_stopped(), &error)); |
| 44 } |
| 45 |
| 46 if (scheduled) |
| 36 work_done_or_stopped()->Wait(); | 47 work_done_or_stopped()->Wait(); |
| 37 } else { | 48 else |
| 38 error = syncer::CANNOT_DO_WORK; | 49 error = syncer::CANNOT_DO_WORK; |
| 39 } | |
| 40 return error; | 50 return error; |
| 41 } | 51 } |
| 42 | 52 |
| 43 syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() { | 53 syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() { |
| 44 return syncer::GROUP_PASSWORD; | 54 return syncer::GROUP_PASSWORD; |
| 45 } | 55 } |
| 46 | 56 |
| 47 PasswordModelWorker::~PasswordModelWorker() {} | 57 PasswordModelWorker::~PasswordModelWorker() {} |
| 48 | 58 |
| 49 void PasswordModelWorker::CallDoWorkAndSignalTask( | 59 void PasswordModelWorker::CallDoWorkAndSignalTask( |
| 50 const syncer::WorkCallback& work, | 60 const syncer::WorkCallback& work, |
| 51 WaitableEvent* done, | 61 WaitableEvent* done, |
| 52 syncer::SyncerError *error) { | 62 syncer::SyncerError *error) { |
| 53 *error = work.Run(); | 63 *error = work.Run(); |
| 54 done->Signal(); | 64 done->Signal(); |
| 55 } | 65 } |
| 56 | 66 |
| 57 void PasswordModelWorker::RegisterForPasswordLoopDestruction() { | 67 void PasswordModelWorker::RegisterForPasswordLoopDestruction() { |
| 58 base::MessageLoop::current()->AddDestructionObserver(this); | 68 base::MessageLoop::current()->AddDestructionObserver(this); |
| 59 SetWorkingLoopToCurrent(); | 69 SetWorkingLoopToCurrent(); |
| 60 } | 70 } |
| 61 | 71 |
| 72 void PasswordModelWorker::RequestStop() { |
| 73 ModelSafeWorker::RequestStop(); |
| 74 |
| 75 base::AutoLock lock(password_store_lock_); |
| 76 password_store_ = NULL; |
| 77 } |
| 78 |
| 62 } // namespace browser_sync | 79 } // namespace browser_sync |
| OLD | NEW |