Chromium Code Reviews| Index: chrome/browser/sync/engine/syncer_thread.cc |
| =================================================================== |
| --- chrome/browser/sync/engine/syncer_thread.cc (revision 71618) |
| +++ chrome/browser/sync/engine/syncer_thread.cc (working copy) |
| @@ -7,6 +7,8 @@ |
| #include <algorithm> |
| #include <map> |
| #include <queue> |
| +#include <string> |
| +#include <vector> |
|
akalin
2011/01/21 19:50:09
no need for this anymore
Nicolas Zea
2011/01/21 21:57:44
There is still use of vector for the model type wo
|
| #include "base/rand_util.h" |
| #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| @@ -54,6 +56,18 @@ |
| const int SyncerThread::kMaxBackoffSeconds = 60 * 60 * 4; // 4 hours. |
| +void SyncerThread::NudgeSyncerWithPayloads( |
| + int milliseconds_from_now, |
| + NudgeSource source, |
| + const SyncSourceInfo::ModelTypeMap& model_types_with_payloads) { |
| + base::AutoLock lock(lock_); |
| + if (vault_.syncer_ == NULL) { |
| + return; |
| + } |
| + |
| + NudgeSyncImpl(milliseconds_from_now, source, model_types_with_payloads); |
| +} |
| + |
| void SyncerThread::NudgeSyncerWithDataTypes( |
| int milliseconds_from_now, |
| NudgeSource source, |
| @@ -63,7 +77,16 @@ |
| return; |
| } |
| - NudgeSyncImpl(milliseconds_from_now, source, model_types); |
| + SyncSourceInfo::ModelTypeMap model_types_with_payloads; |
|
akalin
2011/01/21 19:50:09
Could use utility function here, too
Nicolas Zea
2011/01/21 21:57:44
Done.
|
| + for (size_t i = syncable::FIRST_REAL_MODEL_TYPE; |
| + i < syncable::MODEL_TYPE_COUNT; |
| + ++i) { |
| + if (model_types[i]) { |
| + model_types_with_payloads[syncable::ModelTypeFromInt(i)] = |
| + std::string(""); |
|
akalin
2011/01/21 19:50:09
can be just std::string()
Nicolas Zea
2011/01/21 21:57:44
Done.
|
| + } |
| + } |
| + NudgeSyncImpl(milliseconds_from_now, source, model_types_with_payloads); |
| } |
| void SyncerThread::NudgeSyncer( |
| @@ -74,8 +97,15 @@ |
| return; |
| } |
| - syncable::ModelTypeBitSet model_types; // All false by default. |
| - NudgeSyncImpl(milliseconds_from_now, source, model_types); |
| + // Set all enabled datatypes. |
| + SyncSourceInfo::ModelTypeMap model_types_with_payloads; |
| + ModelSafeRoutingInfo routes; |
| + session_context_->registrar()->GetModelSafeRoutingInfo(&routes); |
| + for (ModelSafeRoutingInfo::const_iterator i = routes.begin(); |
|
akalin
2011/01/21 19:50:09
Room for another util. function to go from ModelSa
Nicolas Zea
2011/01/21 21:57:44
Done.
|
| + i != routes.end(); ++i) { |
| + model_types_with_payloads[i->first] = std::string(""); |
| + } |
| + NudgeSyncImpl(milliseconds_from_now, source, model_types_with_payloads); |
| } |
| SyncerThread::SyncerThread(sessions::SyncSessionContext* context) |
| @@ -342,11 +372,12 @@ |
| // Update timing information for how often these datatypes are triggering |
| // nudges. |
| base::TimeTicks now = TimeTicks::Now(); |
| - for (size_t i = syncable::FIRST_REAL_MODEL_TYPE; |
| - i < session->source().second.size(); |
| - ++i) { |
| - if (session->source().second[i]) { |
| - syncable::PostTimeToTypeHistogram(syncable::ModelType(i), |
| + if (!last_sync_time.is_null()) { |
| + SyncSourceInfo::ModelTypeMap::const_iterator iter; |
| + for (iter = session->source().types.begin(); |
| + iter != session->source().types.end(); |
| + ++iter) { |
| + syncable::PostTimeToTypeHistogram(iter->first, |
| now - last_sync_time); |
| } |
| } |
| @@ -574,7 +605,7 @@ |
| bool* was_nudged) { |
| bool nudged = false; |
| NudgeSource nudge_source = kUnknown; |
| - syncable::ModelTypeBitSet model_types; |
| + SyncSourceInfo::ModelTypeMap model_types; |
| // Has the previous sync cycle completed? |
| if (continue_sync_cycle) |
| nudge_source = kContinuation; |
| @@ -589,7 +620,7 @@ |
| VLOG(1) << "Clearing pending nudge from " << vault_.pending_nudge_source_ |
| << " at tick " << vault_.pending_nudge_time_.ToInternalValue(); |
| vault_.pending_nudge_source_ = kUnknown; |
| - vault_.pending_nudge_types_.reset(); |
| + vault_.pending_nudge_types_.clear(); |
| vault_.pending_nudge_time_ = base::TimeTicks(); |
| } |
| @@ -603,7 +634,8 @@ |
| } |
| SyncSourceInfo SyncerThread::MakeSyncSourceInfo(bool nudged, |
| - NudgeSource nudge_source, const syncable::ModelTypeBitSet& nudge_types, |
| + NudgeSource nudge_source, |
| + const SyncSourceInfo::ModelTypeMap& nudge_types, |
| bool* initial_sync) { |
| sync_pb::GetUpdatesCallerInfo::GetUpdatesSource updates_source = |
| sync_pb::GetUpdatesCallerInfo::UNKNOWN; |
| @@ -632,7 +664,21 @@ |
| break; |
| } |
| } |
| - return SyncSourceInfo(updates_source, nudge_types); |
| + |
| + SyncSourceInfo::ModelTypeMap sync_source_types; |
| + if (nudge_types.empty()) { |
| + // No datatypes requested. This must be a poll so set all enabled datatypes. |
| + ModelSafeRoutingInfo routes; |
| + session_context_->registrar()->GetModelSafeRoutingInfo(&routes); |
| + for (ModelSafeRoutingInfo::const_iterator i = routes.begin(); |
| + i != routes.end(); ++i) { |
| + sync_source_types[i->first] = std::string(""); |
| + } |
| + } else { |
| + sync_source_types = nudge_types; |
| + } |
| + |
| + return SyncSourceInfo(updates_source, sync_source_types); |
| } |
| void SyncerThread::CreateSyncer(const std::string& dirname) { |
| @@ -734,9 +780,10 @@ |
| } |
| // Called with mutex_ already locked. |
| -void SyncerThread::NudgeSyncImpl(int milliseconds_from_now, |
| - NudgeSource source, |
| - const syncable::ModelTypeBitSet& model_types) { |
| +void SyncerThread::NudgeSyncImpl( |
| + int milliseconds_from_now, |
| + NudgeSource source, |
| + const SyncSourceInfo::ModelTypeMap& model_types_with_payloads) { |
| // TODO(sync): Add the option to reset the backoff state machine. |
| // This is needed so nudges that are a result of the user's desire |
| // to download updates for a new data type can be satisfied quickly. |
| @@ -747,11 +794,22 @@ |
| return; |
| } |
| - // Union the current bitset with any from nudges that may have already |
| + // Union the current ModelTypeMap with any from nudges that may have already |
| // posted (coalesce the nudge datatype information). |
| // TODO(tim): It seems weird to do this if the sources don't match up (e.g. |
| // if pending_source is kLocal and |source| is kClearPrivateData). |
| - vault_.pending_nudge_types_ |= model_types; |
| + for (SyncSourceInfo::ModelTypeMap::const_iterator i = |
| + model_types_with_payloads.begin(); |
| + i != model_types_with_payloads.end(); |
| + ++i) { |
| + if (vault_.pending_nudge_types_.count(i->first) == 0) { |
| + // If this datatype isn't already in our map, add it. |
| + vault_.pending_nudge_types_[i->first] = i->second; |
| + } else if (i->second.length() > 0) { |
| + // If it is, we only overwrite the payload if the new one is non-empty. |
| + vault_.pending_nudge_types_[i->first] = i->second; |
| + } |
| + } |
| const TimeTicks nudge_time = TimeTicks::Now() + |
| TimeDelta::FromMilliseconds(milliseconds_from_now); |