browser_thread_model_worker.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/syncer_error.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A syncer::ModelSafeWorker for models that accept requests from the
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syncapi that need to be fulfilled on a browser thread, for example
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autofill on the DB thread.  TODO(sync): Try to generalize other
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ModelWorkers (e.g. history, etc).
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserThreadModelWorker : public syncer::ModelSafeWorker {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThreadModelWorker(content::BrowserThread::ID thread,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           syncer::ModelSafeGroup group);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // syncer::ModelSafeWorker implementation. Called on the sync thread.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::SyncerError DoWorkAndWaitUntilDone(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserThreadModelWorker();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marked pure virtual so subclasses have to override, but there is
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an implementation that subclasses should use.  This is so that
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (subclass)::CallDoWorkAndSignalTask shows up in callstacks.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::BrowserThread::ID thread_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelSafeGroup group_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserThreadModelWorker);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass BrowserThreadModelWorker so that we can distinguish them
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from stack traces alone.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DatabaseModelWorker : public BrowserThreadModelWorker {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DatabaseModelWorker();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DatabaseModelWorker();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileModelWorker : public BrowserThreadModelWorker {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileModelWorker();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallDoWorkAndSignalTask(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const syncer::WorkCallback& work,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WaitableEvent* done,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncerError* error) OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FileModelWorker();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace browser_sync
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_GLUE_BROWSER_THREAD_MODEL_WORKER_H_
87