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

Commit 86080b83 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: add getDebugPid

So that the PID of a service/binder can easily be looked up (for parity
w/ HIDL).

Bug: 141187318
Test: use w/ dumpsys
Change-Id: I29bf9acfe0cd1029d7aa2bb466b97347d46f2947
parent b5f8331e
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -99,6 +99,32 @@ status_t IBinder::getExtension(sp<IBinder>* out) {
    return reply.readNullableStrongBinder(out);
}

status_t IBinder::getDebugPid(pid_t* out) {
    BBinder* local = this->localBinder();
    if (local != nullptr) {
      *out = local->getDebugPid();
      return OK;
    }

    BpBinder* proxy = this->remoteBinder();
    LOG_ALWAYS_FATAL_IF(proxy == nullptr);

    Parcel data;
    Parcel reply;
    status_t status = transact(DEBUG_PID_TRANSACTION, data, &reply);
    if (status != OK) return status;

    int32_t pid;
    status = reply.readInt32(&pid);
    if (status != OK) return status;

    if (pid < 0 || pid > std::numeric_limits<pid_t>::max()) {
        return BAD_VALUE;
    }
    *out = pid;
    return OK;
}

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

class BBinder::Extras
@@ -152,6 +178,9 @@ status_t BBinder::transact(
        case EXTENSION_TRANSACTION:
            err = reply->writeStrongBinder(getExtension());
            break;
        case DEBUG_PID_TRANSACTION:
            err = reply->writeInt32(getDebugPid());
            break;
        default:
            err = onTransact(code, data, reply, flags);
            break;
@@ -250,6 +279,10 @@ sp<IBinder> BBinder::getExtension() {
    return e->mExtension;
}

pid_t BBinder::getDebugPid() {
    return getpid();
}

void BBinder::setExtension(const sp<IBinder>& extension) {
    Extras* e = getOrCreateExtras();
    e->mExtension = extension;
+2 −0
Original line number Diff line number Diff line
@@ -68,6 +68,8 @@ public:
    // This must be called before the object is sent to another process. Not thread safe.
    void                setExtension(const sp<IBinder>& extension);

    pid_t               getDebugPid();

protected:
    virtual             ~BBinder();

+6 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ public:
        INTERFACE_TRANSACTION   = B_PACK_CHARS('_', 'N', 'T', 'F'),
        SYSPROPS_TRANSACTION    = B_PACK_CHARS('_', 'S', 'P', 'R'),
        EXTENSION_TRANSACTION   = B_PACK_CHARS('_', 'E', 'X', 'T'),
        DEBUG_PID_TRANSACTION   = B_PACK_CHARS('_', 'P', 'I', 'D'),

        // Corresponds to TF_ONE_WAY -- an asynchronous call.
        FLAG_ONEWAY             = 0x00000001
@@ -129,6 +130,11 @@ public:
     */
    status_t                getExtension(sp<IBinder>* out);

    /**
     * Dump PID for a binder, for debugging.
     */
    status_t                getDebugPid(pid_t* outPid);

    // NOLINTNEXTLINE(google-default-arguments)
    virtual status_t        transact(   uint32_t code,
                                        const Parcel& data,