Fence.cpp revision ef19414bd8b77a26f5751f3845be79025a8263fe
1f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis/* 2f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Copyright (C) 2012 The Android Open Source Project 3f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 4f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 5f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * you may not use this file except in compliance with the License. 6f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * You may obtain a copy of the License at 7f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 8f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 9f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 10f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Unless required by applicable law or agreed to in writing, software 11f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 12f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * See the License for the specific language governing permissions and 14f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * limitations under the License. 15f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis */ 16f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 17f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#define LOG_TAG "Fence" 18f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 19f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis//#define LOG_NDEBUG 0 20f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 21f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <sync/sync.h> 22f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <ui/Fence.h> 23f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <unistd.h> 24f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <utils/Log.h> 25f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <utils/Trace.h> 26f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 27f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisnamespace android { 28f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 29ef19414bd8b77a26f5751f3845be79025a8263feJesse Hallconst sp<Fence> Fence::NO_FENCE = sp<Fence>(); 30ef19414bd8b77a26f5751f3845be79025a8263feJesse Hall 31f25e183a70bd631f75dce51e85b7d568472a0cdbJamie GennisFence::Fence() : 32f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis mFenceFd(-1) { 33f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 34f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 35f25e183a70bd631f75dce51e85b7d568472a0cdbJamie GennisFence::Fence(int fenceFd) : 36f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis mFenceFd(fenceFd) { 37f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 38f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 39f25e183a70bd631f75dce51e85b7d568472a0cdbJamie GennisFence::~Fence() { 40f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (mFenceFd != -1) { 41f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis close(mFenceFd); 42f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 43f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 44f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 45f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisint Fence::wait(unsigned int timeout) { 46f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis ATRACE_CALL(); 47f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (mFenceFd == -1) { 48f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return NO_ERROR; 49f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 50f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return sync_wait(mFenceFd, timeout); 51f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 52f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 53f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennissp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, 54f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis const sp<Fence>& f2) { 55f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis ATRACE_CALL(); 56f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis int result = sync_merge(name.string(), f1->mFenceFd, f2->mFenceFd); 57f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (result == -1) { 58f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis ALOGE("merge: sync_merge returned an error: %s (%d)", strerror(-errno), 59f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis errno); 60ef19414bd8b77a26f5751f3845be79025a8263feJesse Hall return NO_FENCE; 61f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 62f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return sp<Fence>(new Fence(result)); 63f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 64f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 65f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennissize_t Fence::getFlattenedSize() const { 66f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return 0; 67f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 68f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 69f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennissize_t Fence::getFdCount() const { 70f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return 1; 71f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 72f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 73f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisstatus_t Fence::flatten(void* buffer, size_t size, int fds[], 74f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis size_t count) const { 75f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (size != 0 || count != 1) { 76f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return BAD_VALUE; 77f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 78f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 79f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis fds[0] = mFenceFd; 80f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return NO_ERROR; 81f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 82f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 83f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisstatus_t Fence::unflatten(void const* buffer, size_t size, int fds[], 84f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis size_t count) { 85f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (size != 0 || count != 1) { 86f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return BAD_VALUE; 87f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 88f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis if (mFenceFd != -1) { 89f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Don't unflatten if we already have a valid fd. 90f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return INVALID_OPERATION; 91f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis } 92f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 93f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis mFenceFd = fds[0]; 94f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis return NO_ERROR; 95f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} 96f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 97f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis} // namespace android 98