OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "mojo/system/data_pipe.h" | |
6 | |
7 #include <string.h> | |
8 | |
9 #include <algorithm> | |
10 | |
11 #include "base/logging.h" | |
12 #include "mojo/system/memory.h" | |
13 #include "mojo/system/waiter_list.h" | |
14 | |
15 namespace mojo { | |
16 namespace system { | |
17 | |
18 void DataPipe::ProducerCancelAllWaiters() { | |
19 base::AutoLock locker(lock_); | |
20 DCHECK(has_local_producer_no_lock()); | |
21 producer_waiter_list_->CancelAllWaiters(); | |
22 } | |
23 | |
24 void DataPipe::ProducerClose() { | |
25 base::AutoLock locker(lock_); | |
26 DCHECK(has_local_producer_no_lock()); | |
27 producer_waiter_list_.reset(); | |
28 ProducerCloseImplNoLock(); | |
29 } | |
30 | |
31 MojoResult DataPipe::ProducerWriteData(const void* elements, | |
32 uint32_t* num_elements, | |
33 MojoWriteDataFlags flags) { | |
34 base::AutoLock locker(lock_); | |
35 DCHECK(has_local_producer_no_lock()); | |
36 | |
37 void* buffer = NULL; | |
38 uint32_t buffer_num_elements = *num_elements; | |
39 MojoResult rv = ProducerBeginWriteDataImplNoLock(&buffer, | |
40 &buffer_num_elements, | |
41 flags); | |
42 if (rv != MOJO_RESULT_OK) | |
43 return rv; | |
44 | |
45 uint32_t num_elements_to_write = std::min(*num_elements, buffer_num_elements); | |
46 memcpy(buffer, elements, num_elements_to_write * element_size_); | |
47 | |
48 rv = ProducerEndWriteDataImplNoLock(num_elements_to_write); | |
49 if (rv != MOJO_RESULT_OK) | |
50 return rv; | |
51 | |
52 *num_elements = num_elements_to_write; | |
53 return MOJO_RESULT_OK; | |
54 } | |
55 | |
56 MojoResult DataPipe::ProducerBeginWriteData(void** buffer, | |
57 uint32_t* buffer_num_elements, | |
58 MojoWriteDataFlags flags) { | |
59 base::AutoLock locker(lock_); | |
60 DCHECK(has_local_producer_no_lock()); | |
61 return ProducerBeginWriteDataImplNoLock(buffer, buffer_num_elements, flags); | |
62 } | |
63 | |
64 MojoResult DataPipe::ProducerEndWriteData(uint32_t num_elements_written) { | |
65 base::AutoLock locker(lock_); | |
66 DCHECK(has_local_producer_no_lock()); | |
67 return ProducerEndWriteDataImplNoLock(num_elements_written); | |
68 } | |
69 | |
70 MojoResult DataPipe::ProducerAddWaiter(Waiter* waiter, | |
71 MojoWaitFlags flags, | |
sky
2013/12/13 22:16:21
nit: spacing
viettrungluu
2013/12/13 22:22:48
Done.
| |
72 MojoResult wake_result) { | |
73 base::AutoLock locker(lock_); | |
74 DCHECK(has_local_producer_no_lock()); | |
75 | |
76 if ((flags & ProducerSatisfiedFlagsNoLock())) | |
77 return MOJO_RESULT_ALREADY_EXISTS; | |
78 if (!(flags & ProducerSatisfiableFlagsNoLock())) | |
79 return MOJO_RESULT_FAILED_PRECONDITION; | |
80 | |
81 producer_waiter_list_->AddWaiter(waiter, flags, wake_result); | |
82 return MOJO_RESULT_OK; | |
83 } | |
84 | |
85 void DataPipe::ProducerRemoveWaiter(Waiter* waiter) { | |
86 base::AutoLock locker(lock_); | |
87 DCHECK(has_local_producer_no_lock()); | |
88 producer_waiter_list_->RemoveWaiter(waiter); | |
89 } | |
90 | |
91 DataPipe::DataPipe(bool has_local_producer, bool has_local_consumer) | |
92 : producer_waiter_list_(has_local_producer ? new WaiterList() : NULL), | |
93 consumer_waiter_list_(has_local_consumer ? new WaiterList() : NULL) { | |
94 DCHECK(has_local_producer || has_local_consumer); | |
95 } | |
96 | |
97 DataPipe::~DataPipe() { | |
98 DCHECK(!has_local_producer_no_lock()); | |
99 DCHECK(!has_local_consumer_no_lock()); | |
100 } | |
101 | |
102 } // namespace system | |
103 } // namespace mojo | |
OLD | NEW |