Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1078)

Unified Diff: chrome/browser/sync/glue/bookmark_model_worker.h

Issue 160598: Add files to browser/sync. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sync/engine/syncapi.h ('k') | chrome/browser/sync/glue/bookmark_model_worker.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/glue/bookmark_model_worker.h
===================================================================
--- chrome/browser/sync/glue/bookmark_model_worker.h (revision 0)
+++ chrome/browser/sync/glue/bookmark_model_worker.h (revision 0)
@@ -0,0 +1,134 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifdef CHROME_PERSONALIZATION
+
+#ifndef CHROME_BROWSER_SYNC_GLUE_BOOKMARK_MODEL_WORKER_H_
+#define CHROME_BROWSER_SYNC_GLUE_BOOKMARK_MODEL_WORKER_H_
+
+#include "base/lock.h"
+#include "base/task.h"
+#include "base/waitable_event.h"
+#include "chrome/browser/sync/engine/syncapi.h"
+
+class MessageLoop;
+
+namespace browser_sync {
+
+// A ModelSafeWorker for bookmarks that accepts work requests from the syncapi
+// that need to be fulfilled from the MessageLoop home to the BookmarkModel
+// (this is typically the "main" UI thread).
+//
+// Lifetime note: Instances of this class will generally be owned by the
+// SyncerThread. When the SyncerThread _object_ is destroyed, the
+// BookmarkModelWorker will be destroyed. The SyncerThread object is destroyed
+// after the actual syncer pthread has exited.
+class BookmarkModelWorker
+ : public sync_api::ModelSafeWorkerInterface {
+ public:
+ explicit BookmarkModelWorker(MessageLoop* bookmark_model_loop)
+ : state_(WORKING),
+ pending_work_(NULL),
+ syncapi_has_shutdown_(false),
+ bookmark_model_loop_(bookmark_model_loop),
+ syncapi_event_(false, false) {
+ }
+ virtual ~BookmarkModelWorker();
+
+ // A simple task to signal a waitable event after calling DoWork on a visitor.
+ class CallDoWorkAndSignalTask : public Task {
+ public:
+ CallDoWorkAndSignalTask(ModelSafeWorkerInterface::Visitor* visitor,
+ base::WaitableEvent* work_done,
+ BookmarkModelWorker* scheduler)
+ : visitor_(visitor), work_done_(work_done), scheduler_(scheduler) {
+ }
+ virtual ~CallDoWorkAndSignalTask() { }
+
+ // Task implementation.
+ virtual void Run();
+
+ private:
+ // Task data - a visitor that knows how to DoWork, and a waitable event
+ // to signal after the work has been done.
+ ModelSafeWorkerInterface::Visitor* visitor_;
+ base::WaitableEvent* work_done_;
+
+ // The BookmarkModelWorker responsible for scheduling us.
+ BookmarkModelWorker* const scheduler_;
+
+ DISALLOW_COPY_AND_ASSIGN(CallDoWorkAndSignalTask);
+ };
+
+ // Called by the UI thread on shutdown of the sync service. Blocks until
+ // the BookmarkModelWorker has safely met termination conditions, namely that
+ // no task scheduled by CallDoWorkFromModelSafeThreadAndWait remains un-
+ // processed and that syncapi will not schedule any further work for us to do.
+ void Stop();
+
+ // ModelSafeWorkerInterface implementation. Called on syncapi SyncerThread.
+ virtual void CallDoWorkFromModelSafeThreadAndWait(
+ ModelSafeWorkerInterface::Visitor* visitor);
+
+ // Upon receiving this idempotent call, the ModelSafeWorkerInterface can
+ // assume no work will ever be scheduled again from now on. If it has any work
+ // that it has not yet completed, it must make sure to run it as soon as
+ // possible as the Syncer is trying to shut down. Called from the CoreThread.
+ void OnSyncerShutdownComplete();
+
+ // Callback from |pending_work_| to notify us that it has been run.
+ // Called on |bookmark_model_loop_|.
+ void OnTaskCompleted() { pending_work_ = NULL; }
+
+ private:
+ // The life-cycle of a BookmarkModelWorker in three states.
+ enum State {
+ // We hit the ground running in this state and remain until
+ // the UI loop calls Stop().
+ WORKING,
+ // Stop() sequence has been initiated, but we have not received word that
+ // the SyncerThread has terminated and doesn't need us anymore. Since the
+ // UI MessageLoop is not running at this point, we manually process any
+ // last pending_task_ that the Syncer throws at us, effectively dedicating
+ // the UI thread to terminating the Syncer.
+ RUNNING_MANUAL_SHUTDOWN_PUMP,
+ // We have come to a complete stop, no scheduled work remains, and no work
+ // will be scheduled from now until our destruction.
+ STOPPED,
+ };
+
+ // This is set by the UI thread, but is not explicitly thread safe, so only
+ // read this value from other threads when you know it is absolutely safe (e.g
+ // there is _no_ way we can be in CallDoWork with state_ = STOPPED, so it is
+ // safe to read / compare in this case).
+ State state_;
+
+ // We keep a reference to any task we have scheduled so we can gracefully
+ // force them to run if the syncer is trying to shutdown.
+ Task* pending_work_;
+ Lock pending_work_lock_;
+
+ // Set by the SyncCoreThread when Syncapi shutdown has completed and the
+ // SyncerThread has terminated, so no more work will be scheduled. Read by
+ // the UI thread in Stop().
+ bool syncapi_has_shutdown_;
+
+ // The BookmarkModel's home-sweet-home MessageLoop.
+ MessageLoop* const bookmark_model_loop_;
+
+ // Used as a barrier at shutdown to ensure the SyncerThread terminates before
+ // we allow the UI thread to return from Stop(). This gets signalled whenever
+ // one of two events occur: a new pending_work_ task was scheduled, or the
+ // SyncerThread has terminated. We only care about (1) when we are in Stop(),
+ // because we have to manually Run() the task.
+ base::WaitableEvent syncapi_event_;
+
+ DISALLOW_COPY_AND_ASSIGN(BookmarkModelWorker);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_GLUE_BOOKMARK_MODEL_WORKER_H_
+
+#endif // CHROME_PERSONALIZATION
Property changes on: chrome\browser\sync\glue\bookmark_model_worker.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/sync/engine/syncapi.h ('k') | chrome/browser/sync/glue/bookmark_model_worker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698