10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsSignal.h"
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSignal::Signal() {
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mSet = true;
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSignal::~Signal() {
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    pthread_mutex_destroy(&mMutex);
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    pthread_cond_destroy(&mCondition);
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool Signal::init() {
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int status = pthread_mutex_init(&mMutex, NULL);
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessFifo mutex init failure");
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return false;
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_cond_init(&mCondition, NULL);
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessFifo condition init failure");
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        pthread_mutex_destroy(&mMutex);
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return false;
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return true;
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Signal::set() {
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int status;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_mutex_lock(&mMutex);
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessCommandFifo: error %i locking for set condition.", status);
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    mSet = true;
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_cond_signal(&mCondition);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessCommandFifo: error %i on set condition.", status);
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_mutex_unlock(&mMutex);
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool Signal::wait(uint64_t timeout) {
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int status;
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool ret = false;
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_mutex_lock(&mMutex);
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessCommandFifo: error %i locking for condition.", status);
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return false;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!mSet) {
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!timeout) {
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            status = pthread_cond_wait(&mCondition, &mMutex);
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else {
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000);
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#else
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // This is safe it will just make things less reponsive
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            status = pthread_cond_wait(&mCondition, &mMutex);
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!status) {
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mSet = false;
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ret = true;
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } else {
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (status != ETIMEDOUT) {
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ALOGE("LocklessCommandFifo: error %i waiting for condition.", status);
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    status = pthread_mutex_unlock(&mMutex);
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (status) {
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return ret;
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
111