1 #include "consumer_channel.h"
4 #include <utils/Trace.h>
8 #include <private/dvr/bufferhub_rpc.h>
9 #include "producer_channel.h"
11 using android::pdx::BorrowedHandle;
12 using android::pdx::Channel;
13 using android::pdx::ErrorStatus;
14 using android::pdx::Message;
15 using android::pdx::Status;
16 using android::pdx::rpc::DispatchRemoteMethod;
21 ConsumerChannel::ConsumerChannel(BufferHubService* service, int buffer_id,
23 const std::shared_ptr<Channel> producer)
24 : BufferHubChannel(service, buffer_id, channel_id, kConsumerType),
26 GetProducer()->AddConsumer(this);
29 ConsumerChannel::~ConsumerChannel() {
31 "ConsumerChannel::~ConsumerChannel: channel_id=%d buffer_id=%d",
32 channel_id(), buffer_id());
34 if (auto producer = GetProducer()) {
35 if (!released_) // Producer is waiting for our Release.
36 producer->OnConsumerIgnored();
37 producer->RemoveConsumer(this);
41 BufferHubChannel::BufferInfo ConsumerChannel::GetBufferInfo() const {
42 BufferHubChannel::BufferInfo info;
43 if (auto producer = GetProducer()) {
44 // If producer has not hung up, copy most buffer info from the producer.
45 info = producer->GetBufferInfo();
47 info.id = buffer_id();
51 std::shared_ptr<ProducerChannel> ConsumerChannel::GetProducer() const {
52 return std::static_pointer_cast<ProducerChannel>(producer_.lock());
55 void ConsumerChannel::HandleImpulse(Message& message) {
56 ATRACE_NAME("ConsumerChannel::HandleImpulse");
57 switch (message.GetOp()) {
58 case BufferHubRPC::ConsumerRelease::Opcode:
59 OnConsumerRelease(message, {});
64 bool ConsumerChannel::HandleMessage(Message& message) {
65 ATRACE_NAME("ConsumerChannel::HandleMessage");
66 auto producer = GetProducer();
68 REPLY_ERROR_RETURN(message, EPIPE, true);
70 switch (message.GetOp()) {
71 case BufferHubRPC::GetBuffer::Opcode:
72 DispatchRemoteMethod<BufferHubRPC::GetBuffer>(
73 *producer, &ProducerChannel::OnGetBuffer, message);
76 case BufferHubRPC::NewConsumer::Opcode:
77 DispatchRemoteMethod<BufferHubRPC::NewConsumer>(
78 *producer, &ProducerChannel::OnNewConsumer, message);
81 case BufferHubRPC::ConsumerAcquire::Opcode:
82 DispatchRemoteMethod<BufferHubRPC::ConsumerAcquire>(
83 *this, &ConsumerChannel::OnConsumerAcquire, message);
86 case BufferHubRPC::ConsumerRelease::Opcode:
87 DispatchRemoteMethod<BufferHubRPC::ConsumerRelease>(
88 *this, &ConsumerChannel::OnConsumerRelease, message);
91 case BufferHubRPC::ConsumerSetIgnore::Opcode:
92 DispatchRemoteMethod<BufferHubRPC::ConsumerSetIgnore>(
93 *this, &ConsumerChannel::OnConsumerSetIgnore, message);
101 Status<std::pair<BorrowedFence, ConsumerChannel::MetaData>>
102 ConsumerChannel::OnConsumerAcquire(Message& message,
103 std::size_t metadata_size) {
104 ATRACE_NAME("ConsumerChannel::OnConsumerAcquire");
105 auto producer = GetProducer();
107 return ErrorStatus(EPIPE);
109 if (acquired_ || released_) {
111 "ConsumerChannel::OnConsumerAcquire: Acquire when not posted: "
112 "ignored=%d acquired=%d released=%d channel_id=%d buffer_id=%d",
113 ignored_, acquired_, released_, message.GetChannelId(),
114 producer->buffer_id());
115 return ErrorStatus(EBUSY);
117 auto status = producer->OnConsumerAcquire(message, metadata_size);
126 Status<void> ConsumerChannel::OnConsumerRelease(Message& message,
127 LocalFence release_fence) {
128 ATRACE_NAME("ConsumerChannel::OnConsumerRelease");
129 auto producer = GetProducer();
131 return ErrorStatus(EPIPE);
133 if (!acquired_ || released_) {
135 "ConsumerChannel::OnConsumerRelease: Release when not acquired: "
136 "ignored=%d acquired=%d released=%d channel_id=%d buffer_id=%d",
137 ignored_, acquired_, released_, message.GetChannelId(),
138 producer->buffer_id());
139 return ErrorStatus(EBUSY);
142 producer->OnConsumerRelease(message, std::move(release_fence));
152 Status<void> ConsumerChannel::OnConsumerSetIgnore(Message&, bool ignored) {
153 ATRACE_NAME("ConsumerChannel::OnConsumerSetIgnore");
154 auto producer = GetProducer();
156 return ErrorStatus(EPIPE);
159 if (ignored_ && acquired_) {
160 // Update the producer if ignore is set after the consumer acquires the
163 producer->OnConsumerIgnored();
171 bool ConsumerChannel::OnProducerPosted() {
184 void ConsumerChannel::OnProducerClosed() {
190 } // namespace android