summaryrefslogtreecommitdiff
path: root/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp
diff options
context:
space:
mode:
authorCorey Tabaka <eieio@google.com>2017-04-25 16:47:44 -0700
committerCorey Tabaka <eieio@google.com>2017-05-04 15:36:34 -0700
commit9d8bd09569322f452fddf91e581904f1e8f6849c (patch)
tree6a9f8573f9d82eaf84538e386332a5119d5244b8 /libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp
parent8a4e6a90e6b7edf73fa0d79dd5b439f8e52eb9f0 (diff)
Return pdx::Status<T> from BufferHubQueue::Dequeue.
Switch to using Status<T> to return buffers or meaningful errors from BufferHubQueue::Dequeue. This enables determining whether an error is normal (e.g. timeout) or abnormal (e.g. disconnect). Bug: 36401174 Test: buffer_hub_queue-test passes. Change-Id: Ifef5f737a5e737b70d19bdbffd7544a993438e1c
Diffstat (limited to 'libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp')
-rw-r--r--libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp73
1 files changed, 39 insertions, 34 deletions
diff --git a/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp b/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp
index 433db426af..ba8fefe7be 100644
--- a/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp
+++ b/libs/vr/libbufferhubqueue/buffer_hub_queue_client.cpp
@@ -121,7 +121,8 @@ bool BufferHubQueue::WaitForBuffers(int timeout) {
count() == 0 ? timeout : 0);
if (ret == 0) {
- ALOGD_IF(TRACE, "Wait on epoll returns nothing before timeout.");
+ ALOGI_IF(TRACE,
+ "BufferHubQueue::WaitForBuffers: No events before timeout.");
return count() != 0;
}
@@ -139,7 +140,9 @@ bool BufferHubQueue::WaitForBuffers(int timeout) {
for (int i = 0; i < num_events; i++) {
int64_t index = static_cast<int64_t>(events[i].data.u64);
- ALOGD_IF(TRACE, "New BufferHubQueue event %d: index=%" PRId64, i, index);
+ ALOGD_IF(TRACE,
+ "BufferHubQueue::WaitForBuffers: event %d: index=%" PRId64, i,
+ index);
if (is_buffer_event_index(index)) {
HandleBufferEvent(static_cast<size_t>(index), events[i]);
@@ -296,14 +299,12 @@ void BufferHubQueue::Enqueue(const std::shared_ptr<BufferHubBuffer>& buf,
available_buffers_.Append(std::move(buffer_info));
}
-std::shared_ptr<BufferHubBuffer> BufferHubQueue::Dequeue(int timeout,
- size_t* slot,
- void* meta,
- LocalHandle* fence) {
+Status<std::shared_ptr<BufferHubBuffer>> BufferHubQueue::Dequeue(
+ int timeout, size_t* slot, void* meta, LocalHandle* fence) {
ALOGD_IF(TRACE, "Dequeue: count=%zu, timeout=%d", count(), timeout);
if (!WaitForBuffers(timeout))
- return nullptr;
+ return ErrorStatus(ETIMEDOUT);
std::shared_ptr<BufferHubBuffer> buf;
BufferInfo& buffer_info = available_buffers_.Front();
@@ -321,7 +322,7 @@ std::shared_ptr<BufferHubBuffer> BufferHubQueue::Dequeue(int timeout,
if (!buf) {
ALOGE("BufferHubQueue::Dequeue: Buffer to be dequeued is nullptr");
- return nullptr;
+ return ErrorStatus(ENOBUFS);
}
if (meta) {
@@ -329,7 +330,7 @@ std::shared_ptr<BufferHubBuffer> BufferHubQueue::Dequeue(int timeout,
reinterpret_cast<uint8_t*>(meta));
}
- return buf;
+ return {std::move(buf)};
}
ProducerQueue::ProducerQueue(size_t meta_size)
@@ -420,27 +421,28 @@ int ProducerQueue::DetachBuffer(size_t slot) {
auto status =
InvokeRemoteMethod<BufferHubRPC::ProducerQueueDetachBuffer>(slot);
if (!status) {
- ALOGE(
- "ProducerQueue::DetachBuffer failed to detach producer buffer through "
- "BufferHub, error: %s",
- status.GetErrorMessage().c_str());
+ ALOGE("ProducerQueue::DetachBuffer: Failed to detach producer buffer: %s",
+ status.GetErrorMessage().c_str());
return -status.error();
}
return BufferHubQueue::DetachBuffer(slot);
}
-std::shared_ptr<BufferProducer> ProducerQueue::Dequeue(
+Status<std::shared_ptr<BufferProducer>> ProducerQueue::Dequeue(
int timeout, size_t* slot, LocalHandle* release_fence) {
if (slot == nullptr || release_fence == nullptr) {
- ALOGE(
- "ProducerQueue::Dequeue: invalid parameter, slot=%p, release_fence=%p",
- slot, release_fence);
- return nullptr;
+ ALOGE("ProducerQueue::Dequeue: Invalid parameter: slot=%p release_fence=%p",
+ slot, release_fence);
+ return ErrorStatus(EINVAL);
}
- auto buf = BufferHubQueue::Dequeue(timeout, slot, nullptr, release_fence);
- return std::static_pointer_cast<BufferProducer>(buf);
+ auto buffer_status =
+ BufferHubQueue::Dequeue(timeout, slot, nullptr, release_fence);
+ if (!buffer_status)
+ return buffer_status.error_status();
+
+ return {std::static_pointer_cast<BufferProducer>(buffer_status.take())};
}
int ProducerQueue::OnBufferReady(const std::shared_ptr<BufferHubBuffer>& buf,
@@ -471,10 +473,8 @@ ConsumerQueue::ConsumerQueue(LocalChannelHandle handle, bool ignore_on_import)
Status<size_t> ConsumerQueue::ImportBuffers() {
auto status = InvokeRemoteMethod<BufferHubRPC::ConsumerQueueImportBuffers>();
if (!status) {
- ALOGE(
- "ConsumerQueue::ImportBuffers failed to import consumer buffer through "
- "BufferBub, error: %s",
- status.GetErrorMessage().c_str());
+ ALOGE("ConsumerQueue::ImportBuffers: Failed to import consumer buffer: %s",
+ status.GetErrorMessage().c_str());
return ErrorStatus(status.error());
}
@@ -484,8 +484,7 @@ Status<size_t> ConsumerQueue::ImportBuffers() {
auto buffer_handle_slots = status.take();
for (auto& buffer_handle_slot : buffer_handle_slots) {
- ALOGD_IF(TRACE,
- "ConsumerQueue::ImportBuffers, new buffer, buffer_handle: %d",
+ ALOGD_IF(TRACE, "ConsumerQueue::ImportBuffers: buffer_handle=%d",
buffer_handle_slot.first.value());
std::unique_ptr<BufferConsumer> buffer_consumer =
@@ -509,7 +508,7 @@ Status<size_t> ConsumerQueue::ImportBuffers() {
ret = AddBuffer(std::move(buffer_consumer), buffer_handle_slot.second);
if (ret < 0) {
- ALOGE("ConsumerQueue::ImportBuffers failed to add buffer, ret: %s",
+ ALOGE("ConsumerQueue::ImportBuffers: Failed to add buffer: %s",
strerror(-ret));
last_error = ret;
continue;
@@ -530,7 +529,7 @@ int ConsumerQueue::AddBuffer(const std::shared_ptr<BufferConsumer>& buf,
return BufferHubQueue::AddBuffer(buf, slot);
}
-std::shared_ptr<BufferConsumer> ConsumerQueue::Dequeue(
+Status<std::shared_ptr<BufferConsumer>> ConsumerQueue::Dequeue(
int timeout, size_t* slot, void* meta, size_t meta_size,
LocalHandle* acquire_fence) {
if (meta_size != meta_size_) {
@@ -538,19 +537,23 @@ std::shared_ptr<BufferConsumer> ConsumerQueue::Dequeue(
"ConsumerQueue::Dequeue: Metadata size (%zu) for the dequeuing buffer "
"does not match metadata size (%zu) for the queue.",
meta_size, meta_size_);
- return nullptr;
+ return ErrorStatus(EINVAL);
}
if (slot == nullptr || acquire_fence == nullptr) {
ALOGE(
- "ConsumerQueue::Dequeue: Invalid parameter, slot=%p, meta=%p, "
+ "ConsumerQueue::Dequeue: Invalid parameter: slot=%p meta=%p "
"acquire_fence=%p",
slot, meta, acquire_fence);
- return nullptr;
+ return ErrorStatus(EINVAL);
}
- auto buf = BufferHubQueue::Dequeue(timeout, slot, meta, acquire_fence);
- return std::static_pointer_cast<BufferConsumer>(buf);
+ auto buffer_status =
+ BufferHubQueue::Dequeue(timeout, slot, meta, acquire_fence);
+ if (!buffer_status)
+ return buffer_status.error_status();
+
+ return {std::static_pointer_cast<BufferConsumer>(buffer_status.take())};
}
int ConsumerQueue::OnBufferReady(const std::shared_ptr<BufferHubBuffer>& buf,
@@ -569,7 +572,9 @@ Status<void> ConsumerQueue::OnBufferAllocated() {
ALOGW("ConsumerQueue::OnBufferAllocated: No new buffers allocated!");
return ErrorStatus(ENOBUFS);
} else {
- ALOGD_IF(TRACE, "Imported %zu consumer buffers.", status.get());
+ ALOGD_IF(TRACE,
+ "ConsumerQueue::OnBufferAllocated: Imported %zu consumer buffers.",
+ status.get());
return {};
}
}