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

Commit 9e759e81 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: add IBinder::withLock

BpBinder (and BBinder, once its mExtra allocation is made) have very
nice and shiny locks which they keep all for themselves! Stop it,
IBinder! Share that lock!

This provides convenient access to IBinder's lock, in order to avoid
needing additional locks elsewhere.

Bug: 192023359
Test: N/A
Change-Id: Id3485a2ac66d19379dcad2f0b41d6cb7a8a96725
parent 2505ec42
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -179,6 +179,17 @@ status_t IBinder::setRpcClientDebug(android::base::unique_fd socketFd,
    return transact(SET_RPC_CLIENT_TRANSACTION, data, &reply);
}

void IBinder::withLock(const std::function<void()>& doWithLock) {
    BBinder* local = localBinder();
    if (local) {
        local->withLock(doWithLock);
        return;
    }
    BpBinder* proxy = this->remoteBinder();
    LOG_ALWAYS_FATAL_IF(proxy == nullptr, "binder object must be either local or remote");
    proxy->withLock(doWithLock);
}

// ---------------------------------------------------------------------------

class BBinder::RpcServerLink : public IBinder::DeathRecipient {
@@ -337,6 +348,14 @@ void* BBinder::detachObject(const void* objectID) {
    return e->mObjects.detach(objectID);
}

void BBinder::withLock(const std::function<void()>& doWithLock) {
    Extras* e = getOrCreateExtras();
    LOG_ALWAYS_FATAL_IF(!e, "no memory");

    AutoMutex _l(e->mLock);
    doWithLock();
}

BBinder* BBinder::localBinder()
{
    return this;
+5 −0
Original line number Diff line number Diff line
@@ -427,6 +427,11 @@ void* BpBinder::detachObject(const void* objectID) {
    return mObjects.detach(objectID);
}

void BpBinder::withLock(const std::function<void()>& doWithLock) {
    AutoMutex _l(mLock);
    doWithLock();
}

BpBinder* BpBinder::remoteBinder()
{
    return this;
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ public:
                               object_cleanup_func func) final;
    virtual void*       findObject(const void* objectID) const final;
    virtual void* detachObject(const void* objectID) final;
    void withLock(const std::function<void()>& doWithLock);

    virtual BBinder*    localBinder();

+1 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ public:
                               object_cleanup_func func) final;
    virtual void*       findObject(const void* objectID) const final;
    virtual void* detachObject(const void* objectID) final;
    void withLock(const std::function<void()>& doWithLock);

    virtual BpBinder*   remoteBinder();

+10 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@
#include <utils/String16.h>
#include <utils/Vector.h>

#include <functional>

// linux/binder.h defines this, but we don't want to include it here in order to
// avoid exporting the kernel headers
#ifndef B_PACK_CHARS
@@ -273,6 +275,14 @@ public:
     */
    virtual void* detachObject(const void* objectID) = 0;

    /**
     * Use the lock that this binder contains internally. For instance, this can
     * be used to modify an attached object without needing to add an additional
     * lock (though, that attached object must be retrieved before calling this
     * method). Calling (most) IBinder methods inside this will deadlock.
     */
    void withLock(const std::function<void()>& doWithLock);

    virtual BBinder*        localBinder();
    virtual BpBinder*       remoteBinder();