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

Commit 12a19532 authored by Adrian Roos's avatar Adrian Roos Committed by Android (Google) Code Review
Browse files

Merge "Track ashmem memory usage in Parcel"

parents a9d26e5e e4d8e39b
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -372,9 +372,11 @@ public:

private:
    size_t mBlobAshmemSize;
    size_t mOpenAshmemSize;

public:
    size_t getBlobAshmemSize() const;
    size_t getOpenAshmemSize() const;
};

// ---------------------------------------------------------------------------
@@ -442,9 +444,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);
                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);
void release_object(const sp<ProcessState>& proc,
                    const flat_binder_object& obj, const void* who);
                    const flat_binder_object& obj, const void* who, size_t* outAshmemSize);

void flatten_binder(const sp<ProcessState>& proc,
                    const sp<IBinder>& binder, flat_binder_object* out);
+28 −10
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ enum {
};

void acquire_object(const sp<ProcessState>& proc,
    const flat_binder_object& obj, const void* who)
    const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
{
    switch (obj.type) {
        case BINDER_TYPE_BINDER:
@@ -123,8 +123,13 @@ void acquire_object(const sp<ProcessState>& proc,
            return;
        }
        case BINDER_TYPE_FD: {
            // intentionally blank -- nothing to do to acquire this, but we do
            // recognize it as a legitimate object type.
            if (obj.cookie != 0) {
                // 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;
        }
    }
@@ -133,7 +138,7 @@ void acquire_object(const sp<ProcessState>& proc,
}

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

                close(obj.handle);
            }
            return;
        }
    }
@@ -502,7 +514,7 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)

            flat_binder_object* flat
                = reinterpret_cast<flat_binder_object*>(mData + off);
            acquire_object(proc, *flat, this);
            acquire_object(proc, *flat, this, &mOpenAshmemSize);

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

@@ -2083,7 +2095,7 @@ void Parcel::releaseObjects()
        i--;
        const flat_binder_object* flat
            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
        release_object(proc, *flat, this);
        release_object(proc, *flat, this, &mOpenAshmemSize);
    }
}

@@ -2097,7 +2109,7 @@ void Parcel::acquireObjects()
        i--;
        const flat_binder_object* flat
            = reinterpret_cast<flat_binder_object*>(data+objects[i]);
        acquire_object(proc, *flat, this);
        acquire_object(proc, *flat, this, &mOpenAshmemSize);
    }
}

@@ -2285,7 +2297,7 @@ status_t Parcel::continueWrite(size_t desired)
                    // will need to rescan because we may have lopped off the only FDs
                    mFdsKnown = false;
                }
                release_object(proc, *flat, this);
                release_object(proc, *flat, this, &mOpenAshmemSize);
            }
            binder_size_t* objects =
                (binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
@@ -2372,6 +2384,7 @@ void Parcel::initState()
    mAllowFds = true;
    mOwner = NULL;
    mBlobAshmemSize = 0;
    mOpenAshmemSize = 0;
}

void Parcel::scanForFds() const
@@ -2394,6 +2407,11 @@ size_t Parcel::getBlobAshmemSize() const
    return mBlobAshmemSize;
}

size_t Parcel::getOpenAshmemSize() const
{
    return mOpenAshmemSize;
}

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

Parcel::Blob::Blob() :