diff options
| author | 2018-11-06 15:46:44 -0800 | |
|---|---|---|
| committer | 2018-11-14 10:30:23 -0800 | |
| commit | 18d90eaf05d8b3a21a68d84ebf23ea2326067aad (patch) | |
| tree | 38758cab65d3d634dd2c7fba1c2eb15c81a36fc3 /services/bufferhub/BufferHubService.cpp | |
| parent | 1029443fa64b7f66c06188431c81745d7a14bacb (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.cpp | 22 |
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 |