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

Commit 6bb31142 authored by Adrian Roos's avatar Adrian Roos
Browse files

Maintain Parcel ABI

Makes sure we don't change the memory layout of the Parcel class
to maintain binary compatibility with prebuilts linking against
libbinder.

Bug: 25004154
Change-Id: I656687497f08bb85cefda796aafa2341e601e30a
parent cbf37263
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -341,10 +341,10 @@ public:
    };

private:
    size_t mBlobAshmemSize;
    size_t mOpenAshmemSize;

public:
    // TODO: Remove once ABI can be changed.
    size_t getBlobAshmemSize() const;
    size_t getOpenAshmemSize() const;
};
@@ -414,9 +414,9 @@ inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel)

// Generic acquire and release of objects.
void acquire_object(const sp<ProcessState>& proc,
                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);
                    const flat_binder_object& obj, const void* who);
void release_object(const sp<ProcessState>& proc,
                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);
                    const flat_binder_object& obj, const void* who);

void flatten_binder(const sp<ProcessState>& proc,
                    const sp<IBinder>& binder, flat_binder_object* out);
+31 −15
Original line number Diff line number Diff line
@@ -124,12 +124,14 @@ void acquire_object(const sp<ProcessState>& proc,
        }
        case BINDER_TYPE_FD: {
            if (obj.cookie != 0) {
                if (outAshmemSize != NULL) {
                    // If we own an ashmem fd, keep track of how much memory it refers to.
                    int size = ashmem_get_size_region(obj.handle);
                    if (size > 0) {
                        *outAshmemSize += size;
                    }
                }
            }
            return;
        }
    }
@@ -137,7 +139,13 @@ void acquire_object(const sp<ProcessState>& proc,
    ALOGD("Invalid object type 0x%08x", obj.type);
}

void release_object(const sp<ProcessState>& proc,
void acquire_object(const sp<ProcessState>& proc,
    const flat_binder_object& obj, const void* who)
{
    acquire_object(proc, obj, who, NULL);
}

static void release_object(const sp<ProcessState>& proc,
    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
{
    switch (obj.type) {
@@ -165,6 +173,7 @@ void release_object(const sp<ProcessState>& proc,
            return;
        }
        case BINDER_TYPE_FD: {
            if (outAshmemSize != NULL) {
                if (obj.cookie != 0) {
                    int size = ashmem_get_size_region(obj.handle);
                    if (size > 0) {
@@ -173,6 +182,7 @@ void release_object(const sp<ProcessState>& proc,

                    close(obj.handle);
                }
            }
            return;
        }
    }
@@ -180,6 +190,12 @@ void release_object(const sp<ProcessState>& proc,
    ALOGE("Invalid object type 0x%08x", obj.type);
}

void release_object(const sp<ProcessState>& proc,
    const flat_binder_object& obj, const void* who)
{
    release_object(proc, obj, who, NULL);
}

inline static status_t finish_flatten_binder(
    const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
{
@@ -935,8 +951,6 @@ status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
    int fd = ashmem_create_region("Parcel Blob", len);
    if (fd < 0) return NO_MEMORY;

    mBlobAshmemSize += len;

    int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
    if (result < 0) {
        status = result;
@@ -1902,7 +1916,6 @@ void Parcel::initState()
    mFdsKnown = true;
    mAllowFds = true;
    mOwner = NULL;
    mBlobAshmemSize = 0;
    mOpenAshmemSize = 0;
}

@@ -1923,7 +1936,10 @@ void Parcel::scanForFds() const

size_t Parcel::getBlobAshmemSize() const
{
    return mBlobAshmemSize;
    // This used to return the size of all blobs that were written to ashmem, now we're returning
    // the ashmem currently referenced by this Parcel, which should be equivalent.
    // TODO: Remove method once ABI can be changed.
    return mOpenAshmemSize;
}

size_t Parcel::getOpenAshmemSize() const