OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |