1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// 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/edk/system/data_pipe_consumer_dispatcher.h"
#include "base/logging.h"
#include "mojo/edk/system/data_pipe.h"
#include "mojo/edk/system/memory.h"
namespace mojo {
namespace system {
DataPipeConsumerDispatcher::DataPipeConsumerDispatcher() {
}
void DataPipeConsumerDispatcher::Init(scoped_refptr<DataPipe> data_pipe) {
DCHECK(data_pipe);
data_pipe_ = data_pipe;
}
Dispatcher::Type DataPipeConsumerDispatcher::GetType() const {
return kTypeDataPipeConsumer;
}
DataPipeConsumerDispatcher::~DataPipeConsumerDispatcher() {
// |Close()|/|CloseImplNoLock()| should have taken care of the pipe.
DCHECK(!data_pipe_);
}
void DataPipeConsumerDispatcher::CancelAllAwakablesNoLock() {
lock().AssertAcquired();
data_pipe_->ConsumerCancelAllAwakables();
}
void DataPipeConsumerDispatcher::CloseImplNoLock() {
lock().AssertAcquired();
data_pipe_->ConsumerClose();
data_pipe_ = nullptr;
}
scoped_refptr<Dispatcher>
DataPipeConsumerDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() {
lock().AssertAcquired();
scoped_refptr<DataPipeConsumerDispatcher> rv =
new DataPipeConsumerDispatcher();
rv->Init(data_pipe_);
data_pipe_ = nullptr;
return scoped_refptr<Dispatcher>(rv.get());
}
MojoResult DataPipeConsumerDispatcher::ReadDataImplNoLock(
UserPointer<void> elements,
UserPointer<uint32_t> num_bytes,
MojoReadDataFlags flags) {
lock().AssertAcquired();
if ((flags & MOJO_READ_DATA_FLAG_DISCARD)) {
// These flags are mutally exclusive.
if ((flags & MOJO_READ_DATA_FLAG_QUERY) ||
(flags & MOJO_READ_DATA_FLAG_PEEK))
return MOJO_RESULT_INVALID_ARGUMENT;
DVLOG_IF(2, !elements.IsNull())
<< "Discard mode: ignoring non-null |elements|";
return data_pipe_->ConsumerDiscardData(
num_bytes, (flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE));
}
if ((flags & MOJO_READ_DATA_FLAG_QUERY)) {
if ((flags & MOJO_READ_DATA_FLAG_PEEK))
return MOJO_RESULT_INVALID_ARGUMENT;
DCHECK(!(flags & MOJO_READ_DATA_FLAG_DISCARD)); // Handled above.
DVLOG_IF(2, !elements.IsNull())
<< "Query mode: ignoring non-null |elements|";
return data_pipe_->ConsumerQueryData(num_bytes);
}
return data_pipe_->ConsumerReadData(
elements, num_bytes, !!(flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE),
!!(flags & MOJO_READ_DATA_FLAG_PEEK));
}
MojoResult DataPipeConsumerDispatcher::BeginReadDataImplNoLock(
UserPointer<const void*> buffer,
UserPointer<uint32_t> buffer_num_bytes,
MojoReadDataFlags flags) {
lock().AssertAcquired();
// These flags may not be used in two-phase mode.
if ((flags & MOJO_READ_DATA_FLAG_DISCARD) ||
(flags & MOJO_READ_DATA_FLAG_QUERY) || (flags & MOJO_READ_DATA_FLAG_PEEK))
return MOJO_RESULT_INVALID_ARGUMENT;
return data_pipe_->ConsumerBeginReadData(
buffer, buffer_num_bytes, (flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE));
}
MojoResult DataPipeConsumerDispatcher::EndReadDataImplNoLock(
uint32_t num_bytes_read) {
lock().AssertAcquired();
return data_pipe_->ConsumerEndReadData(num_bytes_read);
}
HandleSignalsState DataPipeConsumerDispatcher::GetHandleSignalsStateImplNoLock()
const {
lock().AssertAcquired();
return data_pipe_->ConsumerGetHandleSignalsState();
}
MojoResult DataPipeConsumerDispatcher::AddAwakableImplNoLock(
Awakable* awakable,
MojoHandleSignals signals,
uint32_t context,
HandleSignalsState* signals_state) {
lock().AssertAcquired();
return data_pipe_->ConsumerAddAwakable(awakable, signals, context,
signals_state);
}
void DataPipeConsumerDispatcher::RemoveAwakableImplNoLock(
Awakable* awakable,
HandleSignalsState* signals_state) {
lock().AssertAcquired();
data_pipe_->ConsumerRemoveAwakable(awakable, signals_state);
}
bool DataPipeConsumerDispatcher::IsBusyNoLock() const {
lock().AssertAcquired();
return data_pipe_->ConsumerIsBusy();
}
} // namespace system
} // namespace mojo
|