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

Commit d6cd6ba6 authored by Fan Xu's avatar Fan Xu
Browse files

Add garbage collecion function to BufferHubService

Now BufferHubService will cleanup unused BufferClient automatically.

If the mClientList storing weak pointer, when user side's strong pointer
dies, the refcount will become 0 and the allocated memory in the service
will get freed.

Test: BufferHubBuffer_test (passed)
Bug: 119623209
Change-Id: I1390f878bf44afd7c1a5cccaeb34a9d13dab3db0
parent 910c0aa1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ Return<void> BufferHubService::importBuffer(const hidl_handle& /*nativeHandle*/,
    return Void();
}

hidl_handle BufferHubService::registerToken(const BufferClient* client) {
hidl_handle BufferHubService::registerToken(const wp<BufferClient>& client) {
    uint32_t token;
    std::lock_guard<std::mutex> lock(mTokenMapMutex);
    do {
+3 −3
Original line number Diff line number Diff line
@@ -46,18 +46,18 @@ public:

    // Non-binder functions
    // Internal help function for IBufferClient::duplicate.
    hidl_handle registerToken(const BufferClient* client);
    hidl_handle registerToken(const wp<BufferClient>& client);

private:
    // List of active BufferClient for bookkeeping.
    std::mutex mClientListMutex;
    std::vector<sp<BufferClient>> mClientList GUARDED_BY(mClientListMutex);
    std::vector<wp<BufferClient>> mClientList GUARDED_BY(mClientListMutex);

    // TODO(b/118180214): use a more secure implementation
    std::mt19937 mTokenEngine;
    // The mapping from token to the client creates it.
    std::mutex mTokenMapMutex;
    std::map<uint32_t, const BufferClient*> mTokenMap GUARDED_BY(mTokenMapMutex);
    std::map<uint32_t, const wp<BufferClient>> mTokenMap GUARDED_BY(mTokenMapMutex);
};

} // namespace implementation