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

Side by Side Diff: mojo/system/data_pipe.cc

Issue 339193005: Mojo: Rename (Mojo)WaitFlagsState -> (Mojo)HandleSignalsState. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « mojo/system/data_pipe.h ('k') | mojo/system/handle_signals_state.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/system/data_pipe.h" 5 #include "mojo/system/data_pipe.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <limits> 10 #include <limits>
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 base::AutoLock locker(lock_); 83 base::AutoLock locker(lock_);
84 DCHECK(producer_open_); 84 DCHECK(producer_open_);
85 producer_open_ = false; 85 producer_open_ = false;
86 DCHECK(has_local_producer_no_lock()); 86 DCHECK(has_local_producer_no_lock());
87 producer_waiter_list_.reset(); 87 producer_waiter_list_.reset();
88 // Not a bug, except possibly in "user" code. 88 // Not a bug, except possibly in "user" code.
89 DVLOG_IF(2, producer_in_two_phase_write_no_lock()) 89 DVLOG_IF(2, producer_in_two_phase_write_no_lock())
90 << "Producer closed with active two-phase write"; 90 << "Producer closed with active two-phase write";
91 producer_two_phase_max_num_bytes_written_ = 0; 91 producer_two_phase_max_num_bytes_written_ = 0;
92 ProducerCloseImplNoLock(); 92 ProducerCloseImplNoLock();
93 AwakeConsumerWaitersForStateChangeNoLock(ConsumerGetWaitFlagsStateNoLock()); 93 AwakeConsumerWaitersForStateChangeNoLock(
94 ConsumerGetHandleSignalsStateNoLock());
94 } 95 }
95 96
96 MojoResult DataPipe::ProducerWriteData(const void* elements, 97 MojoResult DataPipe::ProducerWriteData(const void* elements,
97 uint32_t* num_bytes, 98 uint32_t* num_bytes,
98 bool all_or_none) { 99 bool all_or_none) {
99 base::AutoLock locker(lock_); 100 base::AutoLock locker(lock_);
100 DCHECK(has_local_producer_no_lock()); 101 DCHECK(has_local_producer_no_lock());
101 102
102 if (producer_in_two_phase_write_no_lock()) 103 if (producer_in_two_phase_write_no_lock())
103 return MOJO_RESULT_BUSY; 104 return MOJO_RESULT_BUSY;
104 if (!consumer_open_no_lock()) 105 if (!consumer_open_no_lock())
105 return MOJO_RESULT_FAILED_PRECONDITION; 106 return MOJO_RESULT_FAILED_PRECONDITION;
106 107
107 // Returning "busy" takes priority over "invalid argument". 108 // Returning "busy" takes priority over "invalid argument".
108 if (*num_bytes % element_num_bytes_ != 0) 109 if (*num_bytes % element_num_bytes_ != 0)
109 return MOJO_RESULT_INVALID_ARGUMENT; 110 return MOJO_RESULT_INVALID_ARGUMENT;
110 111
111 if (*num_bytes == 0) 112 if (*num_bytes == 0)
112 return MOJO_RESULT_OK; // Nothing to do. 113 return MOJO_RESULT_OK; // Nothing to do.
113 114
114 WaitFlagsState old_consumer_state = ConsumerGetWaitFlagsStateNoLock(); 115 HandleSignalsState old_consumer_state = ConsumerGetHandleSignalsStateNoLock();
115 MojoResult rv = ProducerWriteDataImplNoLock(elements, num_bytes, all_or_none); 116 MojoResult rv = ProducerWriteDataImplNoLock(elements, num_bytes, all_or_none);
116 WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); 117 HandleSignalsState new_consumer_state = ConsumerGetHandleSignalsStateNoLock();
117 if (!new_consumer_state.equals(old_consumer_state)) 118 if (!new_consumer_state.equals(old_consumer_state))
118 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); 119 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state);
119 return rv; 120 return rv;
120 } 121 }
121 122
122 MojoResult DataPipe::ProducerBeginWriteData(void** buffer, 123 MojoResult DataPipe::ProducerBeginWriteData(void** buffer,
123 uint32_t* buffer_num_bytes, 124 uint32_t* buffer_num_bytes,
124 bool all_or_none) { 125 bool all_or_none) {
125 base::AutoLock locker(lock_); 126 base::AutoLock locker(lock_);
126 DCHECK(has_local_producer_no_lock()); 127 DCHECK(has_local_producer_no_lock());
(...skipping 20 matching lines...) Expand all
147 148
148 MojoResult DataPipe::ProducerEndWriteData(uint32_t num_bytes_written) { 149 MojoResult DataPipe::ProducerEndWriteData(uint32_t num_bytes_written) {
149 base::AutoLock locker(lock_); 150 base::AutoLock locker(lock_);
150 DCHECK(has_local_producer_no_lock()); 151 DCHECK(has_local_producer_no_lock());
151 152
152 if (!producer_in_two_phase_write_no_lock()) 153 if (!producer_in_two_phase_write_no_lock())
153 return MOJO_RESULT_FAILED_PRECONDITION; 154 return MOJO_RESULT_FAILED_PRECONDITION;
154 // Note: Allow successful completion of the two-phase write even if the 155 // Note: Allow successful completion of the two-phase write even if the
155 // consumer has been closed. 156 // consumer has been closed.
156 157
157 WaitFlagsState old_consumer_state = ConsumerGetWaitFlagsStateNoLock(); 158 HandleSignalsState old_consumer_state = ConsumerGetHandleSignalsStateNoLock();
158 MojoResult rv; 159 MojoResult rv;
159 if (num_bytes_written > producer_two_phase_max_num_bytes_written_ || 160 if (num_bytes_written > producer_two_phase_max_num_bytes_written_ ||
160 num_bytes_written % element_num_bytes_ != 0) { 161 num_bytes_written % element_num_bytes_ != 0) {
161 rv = MOJO_RESULT_INVALID_ARGUMENT; 162 rv = MOJO_RESULT_INVALID_ARGUMENT;
162 producer_two_phase_max_num_bytes_written_ = 0; 163 producer_two_phase_max_num_bytes_written_ = 0;
163 } else { 164 } else {
164 rv = ProducerEndWriteDataImplNoLock(num_bytes_written); 165 rv = ProducerEndWriteDataImplNoLock(num_bytes_written);
165 } 166 }
166 // Two-phase write ended even on failure. 167 // Two-phase write ended even on failure.
167 DCHECK(!producer_in_two_phase_write_no_lock()); 168 DCHECK(!producer_in_two_phase_write_no_lock());
168 // If we're now writable, we *became* writable (since we weren't writable 169 // If we're now writable, we *became* writable (since we weren't writable
169 // during the two-phase write), so awake producer waiters. 170 // during the two-phase write), so awake producer waiters.
170 WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); 171 HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
171 if (new_producer_state.satisfies(MOJO_HANDLE_SIGNAL_WRITABLE)) 172 if (new_producer_state.satisfies(MOJO_HANDLE_SIGNAL_WRITABLE))
172 AwakeProducerWaitersForStateChangeNoLock(new_producer_state); 173 AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
173 WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); 174 HandleSignalsState new_consumer_state = ConsumerGetHandleSignalsStateNoLock();
174 if (!new_consumer_state.equals(old_consumer_state)) 175 if (!new_consumer_state.equals(old_consumer_state))
175 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); 176 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state);
176 return rv; 177 return rv;
177 } 178 }
178 179
179 MojoResult DataPipe::ProducerAddWaiter(Waiter* waiter, 180 MojoResult DataPipe::ProducerAddWaiter(Waiter* waiter,
180 MojoHandleSignals signals, 181 MojoHandleSignals signals,
181 uint32_t context) { 182 uint32_t context) {
182 base::AutoLock locker(lock_); 183 base::AutoLock locker(lock_);
183 DCHECK(has_local_producer_no_lock()); 184 DCHECK(has_local_producer_no_lock());
184 185
185 WaitFlagsState producer_state = ProducerGetWaitFlagsStateNoLock(); 186 HandleSignalsState producer_state = ProducerGetHandleSignalsStateNoLock();
186 if (producer_state.satisfies(signals)) 187 if (producer_state.satisfies(signals))
187 return MOJO_RESULT_ALREADY_EXISTS; 188 return MOJO_RESULT_ALREADY_EXISTS;
188 if (!producer_state.can_satisfy(signals)) 189 if (!producer_state.can_satisfy(signals))
189 return MOJO_RESULT_FAILED_PRECONDITION; 190 return MOJO_RESULT_FAILED_PRECONDITION;
190 191
191 producer_waiter_list_->AddWaiter(waiter, signals, context); 192 producer_waiter_list_->AddWaiter(waiter, signals, context);
192 return MOJO_RESULT_OK; 193 return MOJO_RESULT_OK;
193 } 194 }
194 195
195 void DataPipe::ProducerRemoveWaiter(Waiter* waiter) { 196 void DataPipe::ProducerRemoveWaiter(Waiter* waiter) {
(...skipping 17 matching lines...) Expand all
213 base::AutoLock locker(lock_); 214 base::AutoLock locker(lock_);
214 DCHECK(consumer_open_); 215 DCHECK(consumer_open_);
215 consumer_open_ = false; 216 consumer_open_ = false;
216 DCHECK(has_local_consumer_no_lock()); 217 DCHECK(has_local_consumer_no_lock());
217 consumer_waiter_list_.reset(); 218 consumer_waiter_list_.reset();
218 // Not a bug, except possibly in "user" code. 219 // Not a bug, except possibly in "user" code.
219 DVLOG_IF(2, consumer_in_two_phase_read_no_lock()) 220 DVLOG_IF(2, consumer_in_two_phase_read_no_lock())
220 << "Consumer closed with active two-phase read"; 221 << "Consumer closed with active two-phase read";
221 consumer_two_phase_max_num_bytes_read_ = 0; 222 consumer_two_phase_max_num_bytes_read_ = 0;
222 ConsumerCloseImplNoLock(); 223 ConsumerCloseImplNoLock();
223 AwakeProducerWaitersForStateChangeNoLock(ProducerGetWaitFlagsStateNoLock()); 224 AwakeProducerWaitersForStateChangeNoLock(
225 ProducerGetHandleSignalsStateNoLock());
224 } 226 }
225 227
226 MojoResult DataPipe::ConsumerReadData(void* elements, 228 MojoResult DataPipe::ConsumerReadData(void* elements,
227 uint32_t* num_bytes, 229 uint32_t* num_bytes,
228 bool all_or_none) { 230 bool all_or_none) {
229 base::AutoLock locker(lock_); 231 base::AutoLock locker(lock_);
230 DCHECK(has_local_consumer_no_lock()); 232 DCHECK(has_local_consumer_no_lock());
231 233
232 if (consumer_in_two_phase_read_no_lock()) 234 if (consumer_in_two_phase_read_no_lock())
233 return MOJO_RESULT_BUSY; 235 return MOJO_RESULT_BUSY;
234 236
235 if (*num_bytes % element_num_bytes_ != 0) 237 if (*num_bytes % element_num_bytes_ != 0)
236 return MOJO_RESULT_INVALID_ARGUMENT; 238 return MOJO_RESULT_INVALID_ARGUMENT;
237 239
238 if (*num_bytes == 0) 240 if (*num_bytes == 0)
239 return MOJO_RESULT_OK; // Nothing to do. 241 return MOJO_RESULT_OK; // Nothing to do.
240 242
241 WaitFlagsState old_producer_state = ProducerGetWaitFlagsStateNoLock(); 243 HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateNoLock();
242 MojoResult rv = ConsumerReadDataImplNoLock(elements, num_bytes, all_or_none); 244 MojoResult rv = ConsumerReadDataImplNoLock(elements, num_bytes, all_or_none);
243 WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); 245 HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
244 if (!new_producer_state.equals(old_producer_state)) 246 if (!new_producer_state.equals(old_producer_state))
245 AwakeProducerWaitersForStateChangeNoLock(new_producer_state); 247 AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
246 return rv; 248 return rv;
247 } 249 }
248 250
249 MojoResult DataPipe::ConsumerDiscardData(uint32_t* num_bytes, 251 MojoResult DataPipe::ConsumerDiscardData(uint32_t* num_bytes,
250 bool all_or_none) { 252 bool all_or_none) {
251 base::AutoLock locker(lock_); 253 base::AutoLock locker(lock_);
252 DCHECK(has_local_consumer_no_lock()); 254 DCHECK(has_local_consumer_no_lock());
253 255
254 if (consumer_in_two_phase_read_no_lock()) 256 if (consumer_in_two_phase_read_no_lock())
255 return MOJO_RESULT_BUSY; 257 return MOJO_RESULT_BUSY;
256 258
257 if (*num_bytes % element_num_bytes_ != 0) 259 if (*num_bytes % element_num_bytes_ != 0)
258 return MOJO_RESULT_INVALID_ARGUMENT; 260 return MOJO_RESULT_INVALID_ARGUMENT;
259 261
260 if (*num_bytes == 0) 262 if (*num_bytes == 0)
261 return MOJO_RESULT_OK; // Nothing to do. 263 return MOJO_RESULT_OK; // Nothing to do.
262 264
263 WaitFlagsState old_producer_state = ProducerGetWaitFlagsStateNoLock(); 265 HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateNoLock();
264 MojoResult rv = ConsumerDiscardDataImplNoLock(num_bytes, all_or_none); 266 MojoResult rv = ConsumerDiscardDataImplNoLock(num_bytes, all_or_none);
265 WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); 267 HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
266 if (!new_producer_state.equals(old_producer_state)) 268 if (!new_producer_state.equals(old_producer_state))
267 AwakeProducerWaitersForStateChangeNoLock(new_producer_state); 269 AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
268 return rv; 270 return rv;
269 } 271 }
270 272
271 MojoResult DataPipe::ConsumerQueryData(uint32_t* num_bytes) { 273 MojoResult DataPipe::ConsumerQueryData(uint32_t* num_bytes) {
272 base::AutoLock locker(lock_); 274 base::AutoLock locker(lock_);
273 DCHECK(has_local_consumer_no_lock()); 275 DCHECK(has_local_consumer_no_lock());
274 276
275 if (consumer_in_two_phase_read_no_lock()) 277 if (consumer_in_two_phase_read_no_lock())
(...skipping 23 matching lines...) Expand all
299 return MOJO_RESULT_OK; 301 return MOJO_RESULT_OK;
300 } 302 }
301 303
302 MojoResult DataPipe::ConsumerEndReadData(uint32_t num_bytes_read) { 304 MojoResult DataPipe::ConsumerEndReadData(uint32_t num_bytes_read) {
303 base::AutoLock locker(lock_); 305 base::AutoLock locker(lock_);
304 DCHECK(has_local_consumer_no_lock()); 306 DCHECK(has_local_consumer_no_lock());
305 307
306 if (!consumer_in_two_phase_read_no_lock()) 308 if (!consumer_in_two_phase_read_no_lock())
307 return MOJO_RESULT_FAILED_PRECONDITION; 309 return MOJO_RESULT_FAILED_PRECONDITION;
308 310
309 WaitFlagsState old_producer_state = ProducerGetWaitFlagsStateNoLock(); 311 HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateNoLock();
310 MojoResult rv; 312 MojoResult rv;
311 if (num_bytes_read > consumer_two_phase_max_num_bytes_read_ || 313 if (num_bytes_read > consumer_two_phase_max_num_bytes_read_ ||
312 num_bytes_read % element_num_bytes_ != 0) { 314 num_bytes_read % element_num_bytes_ != 0) {
313 rv = MOJO_RESULT_INVALID_ARGUMENT; 315 rv = MOJO_RESULT_INVALID_ARGUMENT;
314 consumer_two_phase_max_num_bytes_read_ = 0; 316 consumer_two_phase_max_num_bytes_read_ = 0;
315 } else { 317 } else {
316 rv = ConsumerEndReadDataImplNoLock(num_bytes_read); 318 rv = ConsumerEndReadDataImplNoLock(num_bytes_read);
317 } 319 }
318 // Two-phase read ended even on failure. 320 // Two-phase read ended even on failure.
319 DCHECK(!consumer_in_two_phase_read_no_lock()); 321 DCHECK(!consumer_in_two_phase_read_no_lock());
320 // If we're now readable, we *became* readable (since we weren't readable 322 // If we're now readable, we *became* readable (since we weren't readable
321 // during the two-phase read), so awake consumer waiters. 323 // during the two-phase read), so awake consumer waiters.
322 WaitFlagsState new_consumer_state = ConsumerGetWaitFlagsStateNoLock(); 324 HandleSignalsState new_consumer_state = ConsumerGetHandleSignalsStateNoLock();
323 if (new_consumer_state.satisfies(MOJO_HANDLE_SIGNAL_READABLE)) 325 if (new_consumer_state.satisfies(MOJO_HANDLE_SIGNAL_READABLE))
324 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state); 326 AwakeConsumerWaitersForStateChangeNoLock(new_consumer_state);
325 WaitFlagsState new_producer_state = ProducerGetWaitFlagsStateNoLock(); 327 HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateNoLock();
326 if (!new_producer_state.equals(old_producer_state)) 328 if (!new_producer_state.equals(old_producer_state))
327 AwakeProducerWaitersForStateChangeNoLock(new_producer_state); 329 AwakeProducerWaitersForStateChangeNoLock(new_producer_state);
328 return rv; 330 return rv;
329 } 331 }
330 332
331 MojoResult DataPipe::ConsumerAddWaiter(Waiter* waiter, 333 MojoResult DataPipe::ConsumerAddWaiter(Waiter* waiter,
332 MojoHandleSignals signals, 334 MojoHandleSignals signals,
333 uint32_t context) { 335 uint32_t context) {
334 base::AutoLock locker(lock_); 336 base::AutoLock locker(lock_);
335 DCHECK(has_local_consumer_no_lock()); 337 DCHECK(has_local_consumer_no_lock());
336 338
337 WaitFlagsState consumer_state = ConsumerGetWaitFlagsStateNoLock(); 339 HandleSignalsState consumer_state = ConsumerGetHandleSignalsStateNoLock();
338 if (consumer_state.satisfies(signals)) 340 if (consumer_state.satisfies(signals))
339 return MOJO_RESULT_ALREADY_EXISTS; 341 return MOJO_RESULT_ALREADY_EXISTS;
340 if (!consumer_state.can_satisfy(signals)) 342 if (!consumer_state.can_satisfy(signals))
341 return MOJO_RESULT_FAILED_PRECONDITION; 343 return MOJO_RESULT_FAILED_PRECONDITION;
342 344
343 consumer_waiter_list_->AddWaiter(waiter, signals, context); 345 consumer_waiter_list_->AddWaiter(waiter, signals, context);
344 return MOJO_RESULT_OK; 346 return MOJO_RESULT_OK;
345 } 347 }
346 348
347 void DataPipe::ConsumerRemoveWaiter(Waiter* waiter) { 349 void DataPipe::ConsumerRemoveWaiter(Waiter* waiter) {
(...skipping 27 matching lines...) Expand all
375 } 377 }
376 378
377 DataPipe::~DataPipe() { 379 DataPipe::~DataPipe() {
378 DCHECK(!producer_open_); 380 DCHECK(!producer_open_);
379 DCHECK(!consumer_open_); 381 DCHECK(!consumer_open_);
380 DCHECK(!producer_waiter_list_); 382 DCHECK(!producer_waiter_list_);
381 DCHECK(!consumer_waiter_list_); 383 DCHECK(!consumer_waiter_list_);
382 } 384 }
383 385
384 void DataPipe::AwakeProducerWaitersForStateChangeNoLock( 386 void DataPipe::AwakeProducerWaitersForStateChangeNoLock(
385 const WaitFlagsState& new_producer_state) { 387 const HandleSignalsState& new_producer_state) {
386 lock_.AssertAcquired(); 388 lock_.AssertAcquired();
387 if (!has_local_producer_no_lock()) 389 if (!has_local_producer_no_lock())
388 return; 390 return;
389 producer_waiter_list_->AwakeWaitersForStateChange(new_producer_state); 391 producer_waiter_list_->AwakeWaitersForStateChange(new_producer_state);
390 } 392 }
391 393
392 void DataPipe::AwakeConsumerWaitersForStateChangeNoLock( 394 void DataPipe::AwakeConsumerWaitersForStateChangeNoLock(
393 const WaitFlagsState& new_consumer_state) { 395 const HandleSignalsState& new_consumer_state) {
394 lock_.AssertAcquired(); 396 lock_.AssertAcquired();
395 if (!has_local_consumer_no_lock()) 397 if (!has_local_consumer_no_lock())
396 return; 398 return;
397 consumer_waiter_list_->AwakeWaitersForStateChange(new_consumer_state); 399 consumer_waiter_list_->AwakeWaitersForStateChange(new_consumer_state);
398 } 400 }
399 401
400 } // namespace system 402 } // namespace system
401 } // namespace mojo 403 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/data_pipe.h ('k') | mojo/system/handle_signals_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698