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

Commit a47f02af authored by Mathias Agopian's avatar Mathias Agopian
Browse files

change 2115 wasn't merged properly into master. this fixes that.

Merge change 2115 into donut

* changes:
  bring the native_handle stuff back from master_gl

Conflicts:

	libs/binder/Parcel.cpp
parent a498449e
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -80,8 +80,11 @@ public:
    status_t            writeStrongBinder(const sp<IBinder>& val);
    status_t            writeWeakBinder(const wp<IBinder>& val);

    // doesn't take ownership of the native_handle
    status_t            writeNativeHandle(const native_handle& handle);
    // Place a native_handle into the parcel (the native_handle's file-
    // descriptors are dup'ed, so it is safe to delete the native_handle
    // when this function returns). 
    // Doesn't take ownership of the native_handle.
    status_t            writeNativeHandle(const native_handle* handle);
    
    // Place a file descriptor into the parcel.  The given fd must remain
    // valid for the lifetime of the parcel.
@@ -114,12 +117,11 @@ public:
    wp<IBinder>         readWeakBinder() const;

    
    // if alloc is NULL, native_handle is allocated with malloc(), otherwise
    // alloc is used. If the function fails, the effects of alloc() must be
    // reverted by the caller.
    native_handle*     readNativeHandle(
            native_handle* (*alloc)(void* cookie, int numFds, int ints),
            void* cookie) const;
    // Retrieve native_handle from the parcel. This returns a copy of the
    // parcel's native_handle (the caller takes ownership). The caller
    // must free the native_handle with native_handle_close() and 
    // native_handle_delete().
    native_handle*     readNativeHandle() const;

    
    // Retrieve a file descriptor from the parcel.  This returns the raw fd
+11 −28
Original line number Diff line number Diff line
@@ -650,28 +650,26 @@ status_t Parcel::writeWeakBinder(const wp<IBinder>& val)
    return flatten_binder(ProcessState::self(), val, this);
}

status_t Parcel::writeNativeHandle(const native_handle& handle)
status_t Parcel::writeNativeHandle(const native_handle* handle)
{
    if (handle.version != sizeof(native_handle))
    if (handle->version != sizeof(native_handle))
        return BAD_TYPE;

    status_t err;
    err = writeInt32(handle.numFds);
    err = writeInt32(handle->numFds);
    if (err != NO_ERROR) return err;

    err = writeInt32(handle.numInts);
    err = writeInt32(handle->numInts);
    if (err != NO_ERROR) return err;

    for (int i=0 ; err==NO_ERROR && i<handle.numFds ; i++)
        err = writeDupFileDescriptor(handle.data[i]);
    for (int i=0 ; err==NO_ERROR && i<handle->numFds ; i++)
        err = writeDupFileDescriptor(handle->data[i]);

    if (err != NO_ERROR) {
        LOGD("write native handle, write dup fd failed");
        return err;
    }

    err = write(handle.data + handle.numFds, sizeof(int)*handle.numInts);

    err = write(handle->data + handle->numFds, sizeof(int)*handle->numInts);
    return err;
}

@@ -928,7 +926,7 @@ wp<IBinder> Parcel::readWeakBinder() const
}


native_handle* Parcel::readNativeHandle(native_handle* (*alloc)(void*, int, int), void* cookie) const
native_handle* Parcel::readNativeHandle() const
{
    int numFds, numInts;
    status_t err;
@@ -937,30 +935,15 @@ native_handle* Parcel::readNativeHandle(native_handle* (*alloc)(void*, int, int)
    err = readInt32(&numInts);
    if (err != NO_ERROR) return 0;

    native_handle* h;
    if (alloc == 0) {
        size_t size = sizeof(native_handle) + sizeof(int)*(numFds + numInts);
        h = (native_handle*)malloc(size); 
        h->version = sizeof(native_handle);
        h->numFds = numFds;
        h->numInts = numInts;
    } else {
        h = alloc(cookie, numFds, numInts);
        if (h->version != sizeof(native_handle)) {
            return 0;
        }
    }
    native_handle* h = native_handle_create(numFds, numInts);
    for (int i=0 ; err==NO_ERROR && i<numFds ; i++) {
        h->data[i] = dup(readFileDescriptor());
        if (h->data[i] < 0) err = BAD_VALUE;
    }

    err = read(h->data + numFds, sizeof(int)*numInts);

    if (err != NO_ERROR) {
        if (alloc == 0) {
            free(h);
        }
        native_handle_close(h);
        native_handle_delete(h);
        h = 0;
    }
    return h;
+4 −8
Original line number Diff line number Diff line
@@ -129,12 +129,8 @@ OverlayRef::OverlayRef(overlay_handle_t handle, const sp<IOverlay>& channel,
OverlayRef::~OverlayRef()
{
    if (mOwnHandle) {
        /* FIXME: handles should be promoted to "real" API and be handled by 
         * the framework */
        for (int i=0 ; i<mOverlayHandle->numFds ; i++) {
            close(mOverlayHandle->data[i]);
        }
        free((void*)mOverlayHandle);
        native_handle_close(mOverlayHandle);
        native_handle_delete(const_cast<native_handle*>(mOverlayHandle));
    }
}

@@ -147,7 +143,7 @@ sp<OverlayRef> OverlayRef::readFromParcel(const Parcel& data) {
        uint32_t f = data.readInt32();
        uint32_t ws = data.readInt32();
        uint32_t hs = data.readInt32();
        native_handle* handle = data.readNativeHandle(NULL, NULL);
        native_handle* handle = data.readNativeHandle();

        result = new OverlayRef();
        result->mOverlayHandle = handle;
@@ -169,7 +165,7 @@ status_t OverlayRef::writeToParcel(Parcel* reply, const sp<OverlayRef>& o) {
        reply->writeInt32(o->mFormat);
        reply->writeInt32(o->mWidthStride);
        reply->writeInt32(o->mHeightStride);
        reply->writeNativeHandle(*(o->mOverlayHandle));
        reply->writeNativeHandle(o->mOverlayHandle);
    } else {
        reply->writeStrongBinder(NULL);
    }