| Index: mojo/system/data_pipe.cc
|
| diff --git a/mojo/system/data_pipe.cc b/mojo/system/data_pipe.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3d6aeb5708f93dd77a934f0d9c53757abfc04434
|
| --- /dev/null
|
| +++ b/mojo/system/data_pipe.cc
|
| @@ -0,0 +1,103 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/system/data_pipe.h"
|
| +
|
| +#include <string.h>
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/logging.h"
|
| +#include "mojo/system/memory.h"
|
| +#include "mojo/system/waiter_list.h"
|
| +
|
| +namespace mojo {
|
| +namespace system {
|
| +
|
| +void DataPipe::ProducerCancelAllWaiters() {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| + producer_waiter_list_->CancelAllWaiters();
|
| +}
|
| +
|
| +void DataPipe::ProducerClose() {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| + producer_waiter_list_.reset();
|
| + ProducerCloseImplNoLock();
|
| +}
|
| +
|
| +MojoResult DataPipe::ProducerWriteData(const void* elements,
|
| + uint32_t* num_elements,
|
| + MojoWriteDataFlags flags) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| +
|
| + void* buffer = NULL;
|
| + uint32_t buffer_num_elements = *num_elements;
|
| + MojoResult rv = ProducerBeginWriteDataImplNoLock(&buffer,
|
| + &buffer_num_elements,
|
| + flags);
|
| + if (rv != MOJO_RESULT_OK)
|
| + return rv;
|
| +
|
| + uint32_t num_elements_to_write = std::min(*num_elements, buffer_num_elements);
|
| + memcpy(buffer, elements, num_elements_to_write * element_size_);
|
| +
|
| + rv = ProducerEndWriteDataImplNoLock(num_elements_to_write);
|
| + if (rv != MOJO_RESULT_OK)
|
| + return rv;
|
| +
|
| + *num_elements = num_elements_to_write;
|
| + return MOJO_RESULT_OK;
|
| +}
|
| +
|
| +MojoResult DataPipe::ProducerBeginWriteData(void** buffer,
|
| + uint32_t* buffer_num_elements,
|
| + MojoWriteDataFlags flags) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| + return ProducerBeginWriteDataImplNoLock(buffer, buffer_num_elements, flags);
|
| +}
|
| +
|
| +MojoResult DataPipe::ProducerEndWriteData(uint32_t num_elements_written) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| + return ProducerEndWriteDataImplNoLock(num_elements_written);
|
| +}
|
| +
|
| +MojoResult DataPipe::ProducerAddWaiter(Waiter* waiter,
|
| + MojoWaitFlags flags,
|
| + MojoResult wake_result) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| +
|
| + if ((flags & ProducerSatisfiedFlagsNoLock()))
|
| + return MOJO_RESULT_ALREADY_EXISTS;
|
| + if (!(flags & ProducerSatisfiableFlagsNoLock()))
|
| + return MOJO_RESULT_FAILED_PRECONDITION;
|
| +
|
| + producer_waiter_list_->AddWaiter(waiter, flags, wake_result);
|
| + return MOJO_RESULT_OK;
|
| +}
|
| +
|
| +void DataPipe::ProducerRemoveWaiter(Waiter* waiter) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(has_local_producer_no_lock());
|
| + producer_waiter_list_->RemoveWaiter(waiter);
|
| +}
|
| +
|
| +DataPipe::DataPipe(bool has_local_producer, bool has_local_consumer)
|
| + : producer_waiter_list_(has_local_producer ? new WaiterList() : NULL),
|
| + consumer_waiter_list_(has_local_consumer ? new WaiterList() : NULL) {
|
| + DCHECK(has_local_producer || has_local_consumer);
|
| +}
|
| +
|
| +DataPipe::~DataPipe() {
|
| + DCHECK(!has_local_producer_no_lock());
|
| + DCHECK(!has_local_consumer_no_lock());
|
| +}
|
| +
|
| +} // namespace system
|
| +} // namespace mojo
|
|
|