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

Commit af3ae11e authored by Simon Shields's avatar Simon Shields Committed by Steve Kondik
Browse files

libbinder: allow devices to disable ashmem size tracking

The addition of ashmem size tracking has resulted in a broken ABI
for old blobs.

Change-Id: Ife8514be1ba639c4061de38b59794c46bcc2d7f8
parent 066aa860
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -496,8 +496,10 @@ public:
        inline void* data() { return mData; }
    };

#ifndef DISABLE_ASHMEM_TRACKING
private:
    size_t mOpenAshmemSize;
#endif

public:
    // TODO: Remove once ABI can be changed.
+30 −0
Original line number Diff line number Diff line
@@ -567,7 +567,11 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)

            flat_binder_object* flat
                = reinterpret_cast<flat_binder_object*>(mData + off);
#ifndef DISABLE_ASHMEM_TRACKING
            acquire_object(proc, *flat, this, &mOpenAshmemSize);
#else
            acquire_object(proc, *flat, this);
#endif

            if (flat->type == BINDER_TYPE_FD) {
                // If this is a file descriptor, we need to dup it so the
@@ -1329,7 +1333,11 @@ restart_write:
        // Need to write meta-data?
        if (nullMetaData || val.binder != 0) {
            mObjects[mObjectsSize] = mDataPos;
#ifndef DISABLE_ASHMEM_TRACKING
            acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
#else
            acquire_object(ProcessState::self(), val, this);
#endif
            mObjectsSize++;
        }

@@ -2256,7 +2264,11 @@ void Parcel::releaseObjects()
        i--;
        const flat_binder_object* flat
            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
#ifndef DISABLE_ASHMEM_TRACKING
        release_object(proc, *flat, this, &mOpenAshmemSize);
#else
        release_object(proc, *flat, this);
#endif
    }
}

@@ -2270,7 +2282,11 @@ void Parcel::acquireObjects()
        i--;
        const flat_binder_object* flat
            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
#ifndef DISABLE_ASHMEM_TRACKING
        acquire_object(proc, *flat, this, &mOpenAshmemSize);
#else
        acquire_object(proc, *flat, this);
#endif
    }
}

@@ -2461,7 +2477,11 @@ status_t Parcel::continueWrite(size_t desired)
                    // will need to rescan because we may have lopped off the only FDs
                    mFdsKnown = false;
                }
#ifndef DISABLE_ASHMEM_TRACKING
                release_object(proc, *flat, this, &mOpenAshmemSize);
#else
                release_object(proc, *flat, this);
#endif
            }
            binder_size_t* objects =
                (binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
@@ -2546,7 +2566,9 @@ void Parcel::initState()
    mFdsKnown = true;
    mAllowFds = true;
    mOwner = NULL;
#ifndef DISABLE_ASHMEM_TRACKING
    mOpenAshmemSize = 0;
#endif

    // racing multiple init leads only to multiple identical write
    if (gMaxFds == 0) {
@@ -2581,12 +2603,20 @@ size_t Parcel::getBlobAshmemSize() const
    // 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.
#ifndef DISABLE_ASHMEM_TRACKING
    return mOpenAshmemSize;
#else
    return 0;
#endif
}

size_t Parcel::getOpenAshmemSize() const
{
#ifndef DISABLE_ASHMEM_TRACKING
    return mOpenAshmemSize;
#else
    return 0;
#endif
}

// --- Parcel::Blob ---