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