Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b08f617b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix freeId() failed in ~BufferNode"

parents 5118e8d0 1c16df54
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -24,9 +24,9 @@ cc_library_shared {
    ],
    srcs: [
        "BufferClient.cpp",
        "BufferHubIdGenerator.cpp",
        "BufferHubService.cpp",
        "BufferNode.cpp",
        "UniqueIdGenerator.cpp",
    ],
    header_libs: [
        "libbufferhub_headers",
+10 −4
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

#include <bufferhub/UniqueIdGenerator.h>
#include <bufferhub/BufferHubIdGenerator.h>

namespace android {
namespace frameworks {
@@ -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 {
@@ -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()) {
+2 −1
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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());
+7 −1
Original line number Diff line number Diff line
@@ -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();
@@ -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