am 9504eb91: Fix race condition in ConsumerBase::addReleaseFence()

* commit '9504eb915c9628e130f45019bdefda0168089886':
  Fix race condition in ConsumerBase::addReleaseFence()
This commit is contained in:
Jesse Hall 2012-10-05 15:21:21 -07:00 committed by Android Git Automerger
commit d22e4b914c
4 changed files with 11 additions and 5 deletions

View File

@ -150,16 +150,17 @@ protected:
// Derived classes should override this method to perform any cleanup that
// must take place when a buffer is released back to the BufferQueue. If
// it is overridden the derived class's implementation must call
// ConsumerBase::acquireBufferLocked.
// ConsumerBase::releaseBufferLocked.
virtual status_t releaseBufferLocked(int buf, EGLDisplay display,
EGLSyncKHR eglFence);
// addReleaseFence adds the sync points associated with a fence to the set
// addReleaseFence* adds the sync points associated with a fence to the set
// of sync points that must be reached before the buffer in the given slot
// may be used after the slot has been released. This should be called by
// derived classes each time some asynchronous work is kicked off that
// references the buffer.
status_t addReleaseFence(int slot, const sp<Fence>& fence);
status_t addReleaseFenceLocked(int slot, const sp<Fence>& fence);
// Slot contains the information and object references that
// ConsumerBase maintains about a BufferQueue buffer slot.

View File

@ -82,7 +82,7 @@ status_t BufferItemConsumer::releaseBuffer(const BufferItem &item,
Mutex::Autolock _l(mMutex);
err = addReleaseFence(item.mBuf, releaseFence);
err = addReleaseFenceLocked(item.mBuf, releaseFence);
err = releaseBufferLocked(item.mBuf, EGL_NO_DISPLAY,
EGL_NO_SYNC_KHR);

View File

@ -193,7 +193,12 @@ status_t ConsumerBase::acquireBufferLocked(BufferQueue::BufferItem *item) {
}
status_t ConsumerBase::addReleaseFence(int slot, const sp<Fence>& fence) {
CB_LOGV("addReleaseFence: slot=%d", slot);
Mutex::Autolock lock(mMutex);
return addReleaseFenceLocked(slot, fence);
}
status_t ConsumerBase::addReleaseFenceLocked(int slot, const sp<Fence>& fence) {
CB_LOGV("addReleaseFenceLocked: slot=%d", slot);
if (!mSlots[slot].mFence.get()) {
mSlots[slot].mFence = fence;

View File

@ -484,7 +484,7 @@ status_t SurfaceTexture::syncForReleaseLocked(EGLDisplay dpy) {
return UNKNOWN_ERROR;
}
sp<Fence> fence(new Fence(fenceFd));
status_t err = addReleaseFence(mCurrentTexture, fence);
status_t err = addReleaseFenceLocked(mCurrentTexture, fence);
if (err != OK) {
ST_LOGE("syncForReleaseLocked: error adding release fence: "
"%s (%d)", strerror(-err), err);