Loading include/ui/Fence.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,9 @@ public: // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is // destroyed before it becomes signaled). The name argument specifies the // destroyed before it becomes signaled). The name argument specifies the // human-readable name to associated with the new Fence object. // human-readable name to associated with the new Fence object. static sp<Fence> merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2); static sp<Fence> merge(const String8& name, const sp<Fence>& f1, static sp<Fence> merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2); const sp<Fence>& f2); Loading libs/gui/ConsumerBase.cpp +3 −2 Original line number Original line Diff line number Diff line Loading @@ -315,9 +315,10 @@ status_t ConsumerBase::addReleaseFenceLocked(int slot, if (!mSlots[slot].mFence.get()) { if (!mSlots[slot].mFence.get()) { mSlots[slot].mFence = fence; mSlots[slot].mFence = fence; } else { } else { char fenceName[32] = {}; snprintf(fenceName, 32, "%.28s:%d", mName.string(), slot); sp<Fence> mergedFence = Fence::merge( sp<Fence> mergedFence = Fence::merge( String8::format("%.28s:%d", mName.string(), slot), fenceName, mSlots[slot].mFence, fence); mSlots[slot].mFence, fence); if (!mergedFence.get()) { if (!mergedFence.get()) { CB_LOGE("failed to merge release fences"); CB_LOGE("failed to merge release fences"); // synchronization is broken, the best we can do is hope fences // synchronization is broken, the best we can do is hope fences Loading libs/ui/Fence.cpp +10 −5 Original line number Original line Diff line number Diff line Loading @@ -72,7 +72,7 @@ status_t Fence::waitForever(const char* logname) { return err < 0 ? -errno : status_t(NO_ERROR); return err < 0 ? -errno : status_t(NO_ERROR); } } sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, sp<Fence> Fence::merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2) { const sp<Fence>& f2) { ATRACE_CALL(); ATRACE_CALL(); int result; int result; Loading @@ -80,24 +80,29 @@ sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, // valid fence (e.g. NO_FENCE) we merge the one valid fence with itself so // valid fence (e.g. NO_FENCE) we merge the one valid fence with itself so // that a new fence with the given name is created. // that a new fence with the given name is created. if (f1->isValid() && f2->isValid()) { if (f1->isValid() && f2->isValid()) { result = sync_merge(name.string(), f1->mFenceFd, f2->mFenceFd); result = sync_merge(name, f1->mFenceFd, f2->mFenceFd); } else if (f1->isValid()) { } else if (f1->isValid()) { result = sync_merge(name.string(), f1->mFenceFd, f1->mFenceFd); result = sync_merge(name, f1->mFenceFd, f1->mFenceFd); } else if (f2->isValid()) { } else if (f2->isValid()) { result = sync_merge(name.string(), f2->mFenceFd, f2->mFenceFd); result = sync_merge(name, f2->mFenceFd, f2->mFenceFd); } else { } else { return NO_FENCE; return NO_FENCE; } } if (result == -1) { if (result == -1) { status_t err = -errno; status_t err = -errno; ALOGE("merge: sync_merge(\"%s\", %d, %d) returned an error: %s (%d)", ALOGE("merge: sync_merge(\"%s\", %d, %d) returned an error: %s (%d)", name.string(), f1->mFenceFd, f2->mFenceFd, name, f1->mFenceFd, f2->mFenceFd, strerror(-err), err); strerror(-err), err); return NO_FENCE; return NO_FENCE; } } return sp<Fence>(new Fence(result)); return sp<Fence>(new Fence(result)); } } sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2) { return merge(name.string(), f1, f2); } int Fence::dup() const { int Fence::dup() const { return ::dup(mFenceFd); return ::dup(mFenceFd); } } Loading Loading
include/ui/Fence.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,9 @@ public: // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is // destroyed before it becomes signaled). The name argument specifies the // destroyed before it becomes signaled). The name argument specifies the // human-readable name to associated with the new Fence object. // human-readable name to associated with the new Fence object. static sp<Fence> merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2); static sp<Fence> merge(const String8& name, const sp<Fence>& f1, static sp<Fence> merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2); const sp<Fence>& f2); Loading
libs/gui/ConsumerBase.cpp +3 −2 Original line number Original line Diff line number Diff line Loading @@ -315,9 +315,10 @@ status_t ConsumerBase::addReleaseFenceLocked(int slot, if (!mSlots[slot].mFence.get()) { if (!mSlots[slot].mFence.get()) { mSlots[slot].mFence = fence; mSlots[slot].mFence = fence; } else { } else { char fenceName[32] = {}; snprintf(fenceName, 32, "%.28s:%d", mName.string(), slot); sp<Fence> mergedFence = Fence::merge( sp<Fence> mergedFence = Fence::merge( String8::format("%.28s:%d", mName.string(), slot), fenceName, mSlots[slot].mFence, fence); mSlots[slot].mFence, fence); if (!mergedFence.get()) { if (!mergedFence.get()) { CB_LOGE("failed to merge release fences"); CB_LOGE("failed to merge release fences"); // synchronization is broken, the best we can do is hope fences // synchronization is broken, the best we can do is hope fences Loading
libs/ui/Fence.cpp +10 −5 Original line number Original line Diff line number Diff line Loading @@ -72,7 +72,7 @@ status_t Fence::waitForever(const char* logname) { return err < 0 ? -errno : status_t(NO_ERROR); return err < 0 ? -errno : status_t(NO_ERROR); } } sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, sp<Fence> Fence::merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2) { const sp<Fence>& f2) { ATRACE_CALL(); ATRACE_CALL(); int result; int result; Loading @@ -80,24 +80,29 @@ sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, // valid fence (e.g. NO_FENCE) we merge the one valid fence with itself so // valid fence (e.g. NO_FENCE) we merge the one valid fence with itself so // that a new fence with the given name is created. // that a new fence with the given name is created. if (f1->isValid() && f2->isValid()) { if (f1->isValid() && f2->isValid()) { result = sync_merge(name.string(), f1->mFenceFd, f2->mFenceFd); result = sync_merge(name, f1->mFenceFd, f2->mFenceFd); } else if (f1->isValid()) { } else if (f1->isValid()) { result = sync_merge(name.string(), f1->mFenceFd, f1->mFenceFd); result = sync_merge(name, f1->mFenceFd, f1->mFenceFd); } else if (f2->isValid()) { } else if (f2->isValid()) { result = sync_merge(name.string(), f2->mFenceFd, f2->mFenceFd); result = sync_merge(name, f2->mFenceFd, f2->mFenceFd); } else { } else { return NO_FENCE; return NO_FENCE; } } if (result == -1) { if (result == -1) { status_t err = -errno; status_t err = -errno; ALOGE("merge: sync_merge(\"%s\", %d, %d) returned an error: %s (%d)", ALOGE("merge: sync_merge(\"%s\", %d, %d) returned an error: %s (%d)", name.string(), f1->mFenceFd, f2->mFenceFd, name, f1->mFenceFd, f2->mFenceFd, strerror(-err), err); strerror(-err), err); return NO_FENCE; return NO_FENCE; } } return sp<Fence>(new Fence(result)); return sp<Fence>(new Fence(result)); } } sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2) { return merge(name.string(), f1, f2); } int Fence::dup() const { int Fence::dup() const { return ::dup(mFenceFd); return ::dup(mFenceFd); } } Loading