diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-16 22:32:14 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-16 22:32:14 +0000 |
commit | 71fb13330dc1c2838b609fb8535479e535ebf2bd (patch) | |
tree | af0b45d502c8478314520a00452fa43f5e005c13 /chrome/browser/sync/js_transaction_observer.cc | |
parent | e9f1520b42f2219ff5136f80c434cd9c4073b77b (diff) | |
download | chromium_src-71fb13330dc1c2838b609fb8535479e535ebf2bd.zip chromium_src-71fb13330dc1c2838b609fb8535479e535ebf2bd.tar.gz chromium_src-71fb13330dc1c2838b609fb8535479e535ebf2bd.tar.bz2 |
[Sync] Split DirectoryChangeListener for thread-safety
Split DirectoryChangeListener into DirectoryChangeDelegate and
TransactionObserver classes. This removes a remove/notify race
condition with the DirectoryChange events.
Make syncable::{Read,Write}Transaction take Locations instead of
file/line pairs.
Move construction of sync_manager_ into sync thread.
Add logging utils in sync/logging.{h,cc}.
Add overloads to ObserverListThreadSafe::Notify for 2, 3, and 4
arguments.
Fixed 'Inital' misspelling in SyncBackendHost (finally).
BUG=85656
TEST=
Review URL: http://codereview.chromium.org/7190001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89413 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sync/js_transaction_observer.cc')
-rw-r--r-- | chrome/browser/sync/js_transaction_observer.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/chrome/browser/sync/js_transaction_observer.cc b/chrome/browser/sync/js_transaction_observer.cc new file mode 100644 index 0000000..b640931 --- /dev/null +++ b/chrome/browser/sync/js_transaction_observer.cc @@ -0,0 +1,77 @@ +// Copyright (c) 2011 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. + +#include "chrome/browser/sync/js_transaction_observer.h" + +#include <sstream> +#include <string> + +#include "base/logging.h" +#include "base/tracked.h" +#include "base/values.h" +#include "chrome/browser/sync/js_event_details.h" +#include "chrome/browser/sync/js_event_router.h" + +namespace browser_sync { + +JsTransactionObserver::JsTransactionObserver( + JsEventRouter* parent_router) + : parent_router_(parent_router) { + DCHECK(parent_router_); +} + +JsTransactionObserver::~JsTransactionObserver() { + DCHECK(non_thread_safe_.CalledOnValidThread()); +} + +namespace { + +std::string GetLocationString(const tracked_objects::Location& location) { + std::ostringstream oss; + oss << location.function_name() << "@" + << location.file_name() << ":" << location.line_number(); + return oss.str(); +} + +} // namespace + +void JsTransactionObserver::OnTransactionStart( + const tracked_objects::Location& location, + const syncable::WriterTag& writer) { + DCHECK(non_thread_safe_.CalledOnValidThread()); + DictionaryValue details; + details.SetString("location", GetLocationString(location)); + details.SetString("writer", syncable::WriterTagToString(writer)); + parent_router_->RouteJsEvent("onTransactionStart", + JsEventDetails(&details)); +} + +void JsTransactionObserver::OnTransactionMutate( + const tracked_objects::Location& location, + const syncable::WriterTag& writer, + const syncable::OriginalEntries& originals, + const syncable::ModelTypeBitSet& models_with_changes) { + DCHECK(non_thread_safe_.CalledOnValidThread()); + DictionaryValue details; + details.SetString("location", GetLocationString(location)); + details.SetString("writer", syncable::WriterTagToString(writer)); + details.Set("originals", syncable::OriginalEntriesToValue(originals)); + details.Set("modelsWithChanges", + syncable::ModelTypeBitSetToValue(models_with_changes)); + parent_router_->RouteJsEvent("onTransactionMutate", + JsEventDetails(&details)); +} + +void JsTransactionObserver::OnTransactionEnd( + const tracked_objects::Location& location, + const syncable::WriterTag& writer) { + DCHECK(non_thread_safe_.CalledOnValidThread()); + DictionaryValue details; + details.SetString("location", GetLocationString(location)); + details.SetString("writer", syncable::WriterTagToString(writer)); + parent_router_->RouteJsEvent("onTransactionEnd", + JsEventDetails(&details)); +} + +} // namespace browser_sync |