media.c2 : Change waitable object to be based on single fd

Currently watiable object is based on two file descriptors created by
eventfd(). Change waitable object to be based on signle fd created by
pipe2().

Bug: 254050314
Test: m
Change-Id: I6771868a93c9bfb767c904d89a3a523e370b3e7e
This commit is contained in:
Sungtak Lee 2023-09-17 23:09:10 +00:00
parent 02b33df6b8
commit b34b1633ff
2 changed files with 16 additions and 29 deletions

View file

@ -36,7 +36,7 @@ package android.hardware.media.c2;
interface IGraphicBufferAllocator {
android.hardware.media.c2.IGraphicBufferAllocator.Allocation allocate(in android.hardware.media.c2.IGraphicBufferAllocator.Description desc);
boolean deallocate(in long id);
android.hardware.media.c2.IGraphicBufferAllocator.WaitableFds getWaitableFds();
ParcelFileDescriptor getWaitableFd();
parcelable Allocation {
android.hardware.HardwareBuffer buffer;
ParcelFileDescriptor fence;
@ -47,8 +47,4 @@ interface IGraphicBufferAllocator {
int format;
long usage;
}
parcelable WaitableFds {
ParcelFileDescriptor allocEvent;
ParcelFileDescriptor statusEvent;
}
}

View file

@ -75,31 +75,22 @@ interface IGraphicBufferAllocator {
boolean deallocate(in long id);
/**
* Fds for waitable object events.
*
* Fds are created by eventfd() with semaphore mode.
* For allocEvent, An integer counter regarding dequeuable buffer count is maintained
* by client using read()/write() to the fd. The fd can be checked whether it is
* readable via poll(). When in readable status, the specified counter is positive
* so allocate/dequeue can happen.
*
* For statusEvent, the client can notify further allocation is not feasible.
* e.g.) life-cycle of the underlying allocator is ended.
*
* C2Fence object should be implemented based on this Fds. Thus, C2Fence can return
* either by allocation being ready or allocation being infeasible by the client status
* change.
*/
parcelable WaitableFds {
ParcelFileDescriptor allocEvent;
ParcelFileDescriptor statusEvent;
}
/**
* Gets waiable file descriptors.
* Gets a waitable file descriptor.
*
* Use this method once and cache it in order not to create unnecessary duplicated fds.
* The returned array will have two fds.
*
* Two file descriptors are created by pipe2(), and the reading end will be returned
* and shared by this method. Whenever a dequeuable buffer is ready a byte will be
* written to the writing end. Whenever a buffer is allocated(or dequeued) a byte will
* be read from the reading end.
*
* The returned file descriptor(the reading end) can be polled whether the read is ready
* via ::poll(). If no more allocate() can be fulfilled(by status change or etc.), the
* writing end will be closed. In the case, POLLHUP event can be retrieved via ::poll().
*
* C2Fence object should be implemented based on this Fd. Thus, C2Fence can return
* either by allocation being ready or allocation being infeasible by the client status
* change.
*
* If many waitable objects based on the same fd are competing, all watiable objects will be
* notified. After being notified, they should invoke allocate(). At least one of them can
@ -110,5 +101,5 @@ interface IGraphicBufferAllocator {
* @return an fd array which will be wrapped to C2Fence and will be waited for
* until allocating is unblocked.
*/
WaitableFds getWaitableFds();
ParcelFileDescriptor getWaitableFd();
}