Merge change 2260

* changes:
  change 2115 wasn't merged properly into master. this fixes that.
This commit is contained in:
Android (Google) Code Review
2009-05-21 16:32:55 -07:00
3 changed files with 25 additions and 44 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}