| 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 |