summaryrefslogtreecommitdiff
path: root/services/bufferhub/BufferHubService.cpp
diff options
context:
space:
mode:
author Fan Xu <fanxu@google.com> 2018-11-06 15:46:44 -0800
committer Fan Xu <fanxu@google.com> 2018-11-14 10:30:23 -0800
commit18d90eaf05d8b3a21a68d84ebf23ea2326067aad (patch)
tree38758cab65d3d634dd2c7fba1c2eb15c81a36fc3 /services/bufferhub/BufferHubService.cpp
parent1029443fa64b7f66c06188431c81745d7a14bacb (diff)
Implement duplicate buffer
Allow BufferClient to generate a opaque token in hidl_handle (i.e. native_handle_t) format that could be used for IBufferHub::import. The service will keep a mapping from token to client. Token comparison is handled in BufferHubService.cpp, as it's opaque to the users. Test: BufferHubBuffer_test (passed) Bug: 118614157 Change-Id: Ie2b0b650dba90fe2ed2f8091dd88acb9768f261f
Diffstat (limited to 'services/bufferhub/BufferHubService.cpp')
-rw-r--r--services/bufferhub/BufferHubService.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/services/bufferhub/BufferHubService.cpp b/services/bufferhub/BufferHubService.cpp
index b72b556c6e..3bfd9cbe7e 100644
--- a/services/bufferhub/BufferHubService.cpp
+++ b/services/bufferhub/BufferHubService.cpp
@@ -16,6 +16,7 @@
#include <android/hardware_buffer.h>
#include <bufferhub/BufferHubService.h>
+#include <cutils/native_handle.h>
#include <log/log.h>
namespace android {
@@ -41,7 +42,7 @@ Return<void> BufferHubService::allocateBuffer(const HardwareBufferDescription& d
return Void();
}
- sp<BufferClient> client = new BufferClient(node);
+ sp<BufferClient> client = BufferClient::create(this, node);
// Add it to list for bookkeeping and dumpsys.
std::lock_guard<std::mutex> lock(mClientListMutex);
mClientList.push_back(client);
@@ -57,6 +58,25 @@ Return<void> BufferHubService::importBuffer(const hidl_handle& /*nativeHandle*/,
return Void();
}
+hidl_handle BufferHubService::registerToken(const BufferClient* client) {
+ uint32_t token;
+ std::lock_guard<std::mutex> lock(mTokenMapMutex);
+ do {
+ token = mTokenEngine();
+ } while (mTokenMap.find(token) != mTokenMap.end());
+
+ // native_handle_t use int[], so here need one slots to fit in uint32_t
+ native_handle_t* handle = native_handle_create(/*numFds=*/0, /*numInts=*/1);
+ handle->data[0] = token;
+
+ // returnToken owns the native_handle_t* thus doing lifecycle management
+ hidl_handle returnToken;
+ returnToken.setTo(handle, /*shoudOwn=*/true);
+
+ mTokenMap.emplace(token, client);
+ return returnToken;
+}
+
} // namespace implementation
} // namespace V1_0
} // namespace bufferhub