1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/database_model_worker.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::WaitableEvent;
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DatabaseModelWorker::DoWorkAndWaitUntilDone(Callback0::Type* work) {
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (BrowserThread::CurrentlyOn(BrowserThread::DB)) {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DLOG(WARNING) << "DoWorkAndWaitUntilDone called from the DB thread.";
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    work->Run();
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WaitableEvent done(false, false);
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableMethod(this, &DatabaseModelWorker::CallDoWorkAndSignalTask,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        work, &done))) {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED() << "Failed to post task to the db thread.";
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  done.Wait();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DatabaseModelWorker::CallDoWorkAndSignalTask(Callback0::Type* work,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                  WaitableEvent* done) {
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  work->Run();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  done->Signal();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenModelSafeGroup DatabaseModelWorker::GetModelSafeGroup() {
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return GROUP_DB;
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool DatabaseModelWorker::CurrentThreadIsWorkThread() {
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return BrowserThread::CurrentlyOn(BrowserThread::DB);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser_sync
46