Loading services/bufferhub/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -24,9 +24,9 @@ cc_library_shared { ], srcs: [ "BufferClient.cpp", "BufferHubIdGenerator.cpp", "BufferHubService.cpp", "BufferNode.cpp", "UniqueIdGenerator.cpp", ], header_libs: [ "libbufferhub_headers", Loading services/bufferhub/UniqueIdGenerator.cpp→services/bufferhub/BufferHubIdGenerator.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #include <bufferhub/UniqueIdGenerator.h> #include <bufferhub/BufferHubIdGenerator.h> namespace android { namespace frameworks { Loading @@ -22,9 +22,15 @@ namespace bufferhub { namespace V1_0 { namespace implementation { constexpr uint32_t UniqueIdGenerator::kInvalidId; constexpr uint32_t BufferHubIdGenerator::kInvalidId; uint32_t UniqueIdGenerator::getId() { BufferHubIdGenerator& BufferHubIdGenerator::getInstance() { static BufferHubIdGenerator generator; return generator; } uint32_t BufferHubIdGenerator::getId() { std::lock_guard<std::mutex> lock(mIdsInUseMutex); do { Loading @@ -37,7 +43,7 @@ uint32_t UniqueIdGenerator::getId() { return mLastId; } bool UniqueIdGenerator::freeId(uint32_t id) { bool BufferHubIdGenerator::freeId(uint32_t id) { std::lock_guard<std::mutex> lock(mIdsInUseMutex); auto iter = mIdsInUse.find(id); if (iter != mIdsInUse.end()) { Loading services/bufferhub/BufferHubService.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ Return<void> BufferHubService::allocateBuffer(const HardwareBufferDescription& d std::shared_ptr<BufferNode> node = std::make_shared<BufferNode>(desc.width, desc.height, desc.layers, desc.format, desc.usage, userMetadataSize, nodeIdGenerator.getId()); desc.usage, userMetadataSize, BufferHubIdGenerator::getInstance().getId()); if (node == nullptr || !node->IsValid()) { ALOGE("%s: creating BufferNode failed.", __FUNCTION__); _hidl_cb(/*bufferClient=*/nullptr, /*status=*/BufferHubStatus::ALLOCATION_FAILED); Loading services/bufferhub/BufferNode.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -66,8 +66,8 @@ BufferNode::~BufferNode() { } // Free the id, if valid if (id() != UniqueIdGenerator::kInvalidId) { if (nodeIdGenerator.freeId(id())) { if (id() != BufferHubIdGenerator::kInvalidId) { if (BufferHubIdGenerator::getInstance().freeId(id())) { ALOGI("%s: id #%u is freed.", __FUNCTION__, id()); } else { ALOGE("%s: Cannot free nonexistent id #%u", __FUNCTION__, id()); Loading services/bufferhub/include/bufferhub/UniqueIdGenerator.h→services/bufferhub/include/bufferhub/BufferHubIdGenerator.h +7 −1 Original line number Diff line number Diff line Loading @@ -29,11 +29,14 @@ namespace V1_0 { namespace implementation { // A thread-safe incremental uint32_t id generator. class UniqueIdGenerator { class BufferHubIdGenerator { public: // 0 is considered invalid static constexpr uint32_t kInvalidId = 0UL; // Get the singleton instance of this class static BufferHubIdGenerator& getInstance(); // Gets next available id. If next id is greater than std::numeric_limits<uint32_t>::max() (2 ^ // 32 - 1), it will try to get an id start from 1 again. uint32_t getId(); Loading @@ -42,6 +45,9 @@ public: bool freeId(uint32_t id); private: BufferHubIdGenerator() = default; ~BufferHubIdGenerator() = default; std::mutex mIdsInUseMutex; // Start from kInvalidID to avoid generating it. uint32_t mLastId = kInvalidId; Loading Loading
services/bufferhub/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -24,9 +24,9 @@ cc_library_shared { ], srcs: [ "BufferClient.cpp", "BufferHubIdGenerator.cpp", "BufferHubService.cpp", "BufferNode.cpp", "UniqueIdGenerator.cpp", ], header_libs: [ "libbufferhub_headers", Loading
services/bufferhub/UniqueIdGenerator.cpp→services/bufferhub/BufferHubIdGenerator.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #include <bufferhub/UniqueIdGenerator.h> #include <bufferhub/BufferHubIdGenerator.h> namespace android { namespace frameworks { Loading @@ -22,9 +22,15 @@ namespace bufferhub { namespace V1_0 { namespace implementation { constexpr uint32_t UniqueIdGenerator::kInvalidId; constexpr uint32_t BufferHubIdGenerator::kInvalidId; uint32_t UniqueIdGenerator::getId() { BufferHubIdGenerator& BufferHubIdGenerator::getInstance() { static BufferHubIdGenerator generator; return generator; } uint32_t BufferHubIdGenerator::getId() { std::lock_guard<std::mutex> lock(mIdsInUseMutex); do { Loading @@ -37,7 +43,7 @@ uint32_t UniqueIdGenerator::getId() { return mLastId; } bool UniqueIdGenerator::freeId(uint32_t id) { bool BufferHubIdGenerator::freeId(uint32_t id) { std::lock_guard<std::mutex> lock(mIdsInUseMutex); auto iter = mIdsInUse.find(id); if (iter != mIdsInUse.end()) { Loading
services/bufferhub/BufferHubService.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,8 @@ Return<void> BufferHubService::allocateBuffer(const HardwareBufferDescription& d std::shared_ptr<BufferNode> node = std::make_shared<BufferNode>(desc.width, desc.height, desc.layers, desc.format, desc.usage, userMetadataSize, nodeIdGenerator.getId()); desc.usage, userMetadataSize, BufferHubIdGenerator::getInstance().getId()); if (node == nullptr || !node->IsValid()) { ALOGE("%s: creating BufferNode failed.", __FUNCTION__); _hidl_cb(/*bufferClient=*/nullptr, /*status=*/BufferHubStatus::ALLOCATION_FAILED); Loading
services/bufferhub/BufferNode.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -66,8 +66,8 @@ BufferNode::~BufferNode() { } // Free the id, if valid if (id() != UniqueIdGenerator::kInvalidId) { if (nodeIdGenerator.freeId(id())) { if (id() != BufferHubIdGenerator::kInvalidId) { if (BufferHubIdGenerator::getInstance().freeId(id())) { ALOGI("%s: id #%u is freed.", __FUNCTION__, id()); } else { ALOGE("%s: Cannot free nonexistent id #%u", __FUNCTION__, id()); Loading
services/bufferhub/include/bufferhub/UniqueIdGenerator.h→services/bufferhub/include/bufferhub/BufferHubIdGenerator.h +7 −1 Original line number Diff line number Diff line Loading @@ -29,11 +29,14 @@ namespace V1_0 { namespace implementation { // A thread-safe incremental uint32_t id generator. class UniqueIdGenerator { class BufferHubIdGenerator { public: // 0 is considered invalid static constexpr uint32_t kInvalidId = 0UL; // Get the singleton instance of this class static BufferHubIdGenerator& getInstance(); // Gets next available id. If next id is greater than std::numeric_limits<uint32_t>::max() (2 ^ // 32 - 1), it will try to get an id start from 1 again. uint32_t getId(); Loading @@ -42,6 +45,9 @@ public: bool freeId(uint32_t id); private: BufferHubIdGenerator() = default; ~BufferHubIdGenerator() = default; std::mutex mIdsInUseMutex; // Start from kInvalidID to avoid generating it. uint32_t mLastId = kInvalidId; Loading