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

Side by Side Diff: mojo/edk/system/data_pipe_consumer_dispatcher.cc

Issue 2725133002: Mojo: Armed Watchers (Closed)
Patch Set: . Created 3 years, 9 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/edk/system/data_pipe_consumer_dispatcher.h" 5 #include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 Dispatcher::Type DataPipeConsumerDispatcher::GetType() const { 90 Dispatcher::Type DataPipeConsumerDispatcher::GetType() const {
91 return Type::DATA_PIPE_CONSUMER; 91 return Type::DATA_PIPE_CONSUMER;
92 } 92 }
93 93
94 MojoResult DataPipeConsumerDispatcher::Close() { 94 MojoResult DataPipeConsumerDispatcher::Close() {
95 base::AutoLock lock(lock_); 95 base::AutoLock lock(lock_);
96 DVLOG(1) << "Closing data pipe consumer " << pipe_id_; 96 DVLOG(1) << "Closing data pipe consumer " << pipe_id_;
97 return CloseNoLock(); 97 return CloseNoLock();
98 } 98 }
99 99
100 100 MojoResult DataPipeConsumerDispatcher::RegisterWatcher(
101 MojoResult DataPipeConsumerDispatcher::Watch(
102 MojoHandleSignals signals, 101 MojoHandleSignals signals,
103 const Watcher::WatchCallback& callback, 102 const Watcher::WatchCallback& callback,
104 uintptr_t context) { 103 uintptr_t context) {
105 base::AutoLock lock(lock_); 104 base::AutoLock lock(lock_);
106 105
107 if (is_closed_ || in_transit_) 106 if (is_closed_ || in_transit_)
108 return MOJO_RESULT_INVALID_ARGUMENT; 107 return MOJO_RESULT_INVALID_ARGUMENT;
109 108
110 return awakable_list_.AddWatcher( 109 return watchers_.Add(signals, callback, context,
111 signals, callback, context, GetHandleSignalsStateNoLock()); 110 GetHandleSignalsStateNoLock());
112 } 111 }
113 112
114 MojoResult DataPipeConsumerDispatcher::CancelWatch(uintptr_t context) { 113 MojoResult DataPipeConsumerDispatcher::ArmWatcher(uintptr_t context) {
115 base::AutoLock lock(lock_); 114 base::AutoLock lock(lock_);
116 115
117 if (is_closed_ || in_transit_) 116 if (is_closed_ || in_transit_)
118 return MOJO_RESULT_INVALID_ARGUMENT; 117 return MOJO_RESULT_INVALID_ARGUMENT;
119 118
120 return awakable_list_.RemoveWatcher(context); 119 return watchers_.Arm(context, GetHandleSignalsStateNoLock());
120 }
121
122 MojoResult DataPipeConsumerDispatcher::UnregisterWatcher(uintptr_t context) {
123 base::AutoLock lock(lock_);
124
125 if (is_closed_ || in_transit_)
126 return MOJO_RESULT_INVALID_ARGUMENT;
127
128 return watchers_.Remove(context);
121 } 129 }
122 130
123 MojoResult DataPipeConsumerDispatcher::ReadData(void* elements, 131 MojoResult DataPipeConsumerDispatcher::ReadData(void* elements,
124 uint32_t* num_bytes, 132 uint32_t* num_bytes,
125 MojoReadDataFlags flags) { 133 MojoReadDataFlags flags) {
126 base::AutoLock lock(lock_); 134 base::AutoLock lock(lock_);
127 if (!shared_ring_buffer_ || in_transit_) 135 if (!shared_ring_buffer_ || in_transit_)
128 return MOJO_RESULT_INVALID_ARGUMENT; 136 return MOJO_RESULT_INVALID_ARGUMENT;
129 137
130 if (in_two_phase_read_) 138 if (in_two_phase_read_)
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 bytes_available_ -= num_bytes_read; 269 bytes_available_ -= num_bytes_read;
262 270
263 base::AutoUnlock unlock(lock_); 271 base::AutoUnlock unlock(lock_);
264 NotifyRead(num_bytes_read); 272 NotifyRead(num_bytes_read);
265 } 273 }
266 274
267 in_two_phase_read_ = false; 275 in_two_phase_read_ = false;
268 two_phase_max_bytes_read_ = 0; 276 two_phase_max_bytes_read_ = 0;
269 277
270 HandleSignalsState new_state = GetHandleSignalsStateNoLock(); 278 HandleSignalsState new_state = GetHandleSignalsStateNoLock();
271 if (!new_state.equals(old_state)) 279 if (!new_state.equals(old_state)) {
272 awakable_list_.AwakeForStateChange(new_state); 280 awakable_list_.AwakeForStateChange(new_state);
281 watchers_.NotifyState(new_state);
282 }
273 283
274 return rv; 284 return rv;
275 } 285 }
276 286
277 HandleSignalsState DataPipeConsumerDispatcher::GetHandleSignalsState() const { 287 HandleSignalsState DataPipeConsumerDispatcher::GetHandleSignalsState() const {
278 base::AutoLock lock(lock_); 288 base::AutoLock lock(lock_);
279 return GetHandleSignalsStateNoLock(); 289 return GetHandleSignalsStateNoLock();
280 } 290 }
281 291
282 MojoResult DataPipeConsumerDispatcher::AddAwakable( 292 MojoResult DataPipeConsumerDispatcher::AddAwakable(
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 463
454 MojoResult DataPipeConsumerDispatcher::CloseNoLock() { 464 MojoResult DataPipeConsumerDispatcher::CloseNoLock() {
455 lock_.AssertAcquired(); 465 lock_.AssertAcquired();
456 if (is_closed_ || in_transit_) 466 if (is_closed_ || in_transit_)
457 return MOJO_RESULT_INVALID_ARGUMENT; 467 return MOJO_RESULT_INVALID_ARGUMENT;
458 is_closed_ = true; 468 is_closed_ = true;
459 ring_buffer_mapping_.reset(); 469 ring_buffer_mapping_.reset();
460 shared_ring_buffer_ = nullptr; 470 shared_ring_buffer_ = nullptr;
461 471
462 awakable_list_.CancelAll(); 472 awakable_list_.CancelAll();
473 watchers_.NotifyClosed();
463 if (!transferred_) { 474 if (!transferred_) {
464 base::AutoUnlock unlock(lock_); 475 base::AutoUnlock unlock(lock_);
465 node_controller_->ClosePort(control_port_); 476 node_controller_->ClosePort(control_port_);
466 } 477 }
467 478
468 return MOJO_RESULT_OK; 479 return MOJO_RESULT_OK;
469 } 480 }
470 481
471 HandleSignalsState 482 HandleSignalsState
472 DataPipeConsumerDispatcher::GetHandleSignalsStateNoLock() const { 483 DataPipeConsumerDispatcher::GetHandleSignalsStateNoLock() const {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 << m->num_bytes << " bytes were written. [control_port=" 569 << m->num_bytes << " bytes were written. [control_port="
559 << control_port_.name() << "]"; 570 << control_port_.name() << "]";
560 571
561 bytes_available_ += m->num_bytes; 572 bytes_available_ += m->num_bytes;
562 } 573 }
563 } while (message); 574 } while (message);
564 } 575 }
565 576
566 if (peer_closed_ != was_peer_closed || 577 if (peer_closed_ != was_peer_closed ||
567 bytes_available_ != previous_bytes_available) { 578 bytes_available_ != previous_bytes_available) {
568 awakable_list_.AwakeForStateChange(GetHandleSignalsStateNoLock()); 579 HandleSignalsState state = GetHandleSignalsStateNoLock();
580 awakable_list_.AwakeForStateChange(state);
581 watchers_.NotifyState(state);
569 } 582 }
570 } 583 }
571 584
572 } // namespace edk 585 } // namespace edk
573 } // namespace mojo 586 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698