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 |