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

Side by Side Diff: blimp/helium/object_sync_state.cc

Issue 2602103002: Delete blimp/helium and remove references to it from dependent targets (Closed)
Patch Set: . Created 3 years, 11 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 unified diff | Download patch
« no previous file with comments | « blimp/helium/object_sync_state.h ('k') | blimp/helium/owned_register.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "blimp/helium/object_sync_state.h"
6
7 #include <string>
8
9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h"
11 #include "blimp/helium/syncable.h"
12 #include "blimp/helium/update_scheduler.h"
13
14 namespace blimp {
15 namespace helium {
16
17 ObjectSyncState::ObjectSyncState(
18 HeliumObjectId object_id,
19 std::unique_ptr<LazySyncable<std::string>> object)
20 : object_id_(object_id), object_(std::move(object)) {
21 object_->SetLocalUpdateCallback(
22 base::Bind(&ObjectSyncState::OnLocalUpdate, base::Unretained(this)));
23 }
24
25 ObjectSyncState::~ObjectSyncState() = default;
26
27 void ObjectSyncState::OnLocalUpdate() {
28 is_dirty_ = true;
29 if (scheduler_) {
30 scheduler_->OnLocalUpdate(object_id_);
31 }
32 }
33
34 void ObjectSyncState::PrepareChangesetMessage(
35 MessagePreparedCallback callback) {
36 DCHECK(callback);
37 DCHECK(scheduler_);
38
39 // Set as not dirty now so that if there are local changes between now and
40 // when we send the Changeset, it is reflected in |is_dirty_|.
41 is_dirty_ = false;
42 prepare_callback_ = std::move(callback);
43 object_->PrepareToCreateChangeset(
44 sent_revision_, prepared_for_changeset_callback_.callback());
45 }
46
47 void ObjectSyncState::PrepareAckMessage(MessagePreparedCallback callback) {
48 DCHECK(callback);
49
50 prepare_callback_ = std::move(callback);
51 OnPreparedChangeset();
52 }
53
54 void ObjectSyncState::OnStreamConnected(UpdateScheduler* scheduler) {
55 DCHECK(scheduler);
56
57 scheduler_ = scheduler;
58 prepared_for_changeset_callback_.Reset(base::Bind(
59 &ObjectSyncState::OnPreparedChangeset, base::Unretained(this)));
60
61 // Determine if our last sent HeliumMessage was acknowledged by the peer.
62 is_confirmed_ = (sent_revision_ == acked_revision_);
63
64 // Mark the object as requiring an outgoing acknowledgement and inform
65 // |scheduler_|.
66 remote_revision_needs_ack_ = true;
67 scheduler_->OnNeedsAck(object_id_);
68
69 // Schedule an update if the object is confirmed and dirty.
70 if (is_confirmed_ && is_dirty_) {
71 scheduler_->OnLocalUpdate(object_id_);
72 }
73 }
74
75 void ObjectSyncState::OnStreamDisconnected() {
76 DCHECK(scheduler_);
77
78 prepared_for_changeset_callback_.Cancel();
79 prepare_callback_.Reset();
80 scheduler_ = nullptr;
81 }
82
83 void ObjectSyncState::OnChangesetReceived(Revision end_revision,
84 const std::string& changeset) {
85 DCHECK(scheduler_);
86
87 if (object_->ValidateChangeset(changeset)) {
88 object_->ApplyChangeset(changeset);
89 remote_revision_ = end_revision;
90 remote_revision_needs_ack_ = true;
91 scheduler_->OnNeedsAck(object_id_);
92 }
93 }
94
95 void ObjectSyncState::OnAckReceived(Revision ack_revision) {
96 DCHECK(scheduler_);
97
98 acked_revision_ = ack_revision;
99 object_->ReleaseBefore(acked_revision_);
100 if (!is_confirmed_) {
101 is_confirmed_ = true;
102 sent_revision_ = ack_revision;
103 if (is_dirty_) {
104 scheduler_->OnLocalUpdate(object_id_);
105 }
106 }
107 }
108
109 void ObjectSyncState::OnPreparedChangeset() {
110 DCHECK(prepare_callback_);
111
112 proto::HeliumMessage message;
113 message.set_object_id(object_id_);
114
115 bool has_changed = object_->GetRevision() > sent_revision_;
116 if (is_confirmed_ && has_changed) {
117 message.set_start_revision(sent_revision_);
118 message.set_end_revision(object_->GetRevision());
119
120 std::unique_ptr<std::string> changeset =
121 object_->CreateChangeset(sent_revision_);
122 message.set_changeset(*changeset);
123
124 sent_revision_ = message.end_revision();
125 }
126
127 if (remote_revision_needs_ack_) {
128 message.set_ack_revision(remote_revision_);
129 remote_revision_needs_ack_ = false;
130 }
131
132 prepare_callback_.Run(std::move(message));
133 }
134
135 } // namespace helium
136 } // namespace blimp
OLDNEW
« no previous file with comments | « blimp/helium/object_sync_state.h ('k') | blimp/helium/owned_register.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698