112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams/*
212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * Copyright (C) 2009 The Android Open Source Project
312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams *
412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * you may not use this file except in compliance with the License.
612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * You may obtain a copy of the License at
712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams *
812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams *
1012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * Unless required by applicable law or agreed to in writing, software
1112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * See the License for the specific language governing permissions and
1412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams * limitations under the License.
1512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams */
1612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
1712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams#include "rsSignal.h"
1812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
1912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android;
2012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android::renderscript;
2112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
2212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
23afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSignal::Signal() {
2412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    mSet = true;
2512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
2612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
27afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSignal::~Signal() {
2812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    pthread_mutex_destroy(&mMutex);
2912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    pthread_cond_destroy(&mCondition);
3012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
3112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
32afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Signal::init() {
3312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    int status = pthread_mutex_init(&mMutex, NULL);
3412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
35af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessFifo mutex init failure");
3612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        return false;
3712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
3812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
3912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_cond_init(&mCondition, NULL);
4012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
41af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessFifo condition init failure");
4212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        pthread_mutex_destroy(&mMutex);
4312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        return false;
4412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
4512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
4612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    return true;
4712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
4812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
49afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Signal::set() {
5012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    int status;
5112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
5212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_lock(&mMutex);
5312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
54af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessCommandFifo: error %i locking for set condition.", status);
5512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        return;
5612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
5712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
5812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    mSet = true;
5912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
6012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_cond_signal(&mCondition);
6112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
62af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessCommandFifo: error %i on set condition.", status);
6312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
6412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
6512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_unlock(&mMutex);
6612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
67af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
6812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
6912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
7012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
71e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Samsbool Signal::wait(uint64_t timeout) {
7212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    int status;
73e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    bool ret = false;
7412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
7512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_lock(&mMutex);
7612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
77af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessCommandFifo: error %i locking for condition.", status);
78e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        return false;
7912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
8012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
8112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (!mSet) {
82e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        if (!timeout) {
83e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            status = pthread_cond_wait(&mCondition, &mMutex);
84e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        } else {
85e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)
86e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000);
87e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#else
88e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            // This is safe it will just make things less reponsive
89e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams            status = pthread_cond_wait(&mCondition, &mMutex);
90e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#endif
91e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        }
92e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    }
93e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams
94e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    if (!status) {
95e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        mSet = false;
96e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        ret = true;
97e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    } else {
98e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        if (status != ETIMEDOUT) {
99af12ac6a08651464f8d823add667c706f993b587Steve Block            ALOGE("LocklessCommandFifo: error %i waiting for condition.", status);
10012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        }
10112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
10212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
10312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_unlock(&mMutex);
10412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
105af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
10612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
107e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams
108e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    return ret;
10912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
11012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
111