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"
1843cfc0cbe6e6e8f585a0ae5f1d9cc2859ab1dda7Stephen Hines#include <errno.h>
1912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
2011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android {
2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript {
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() {
3344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    int status = pthread_mutex_init(&mMutex, nullptr);
3412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
354698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::init: mutex init failure: %s", strerror(status));
3612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        return false;
3712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
3812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
3944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    status = pthread_cond_init(&mCondition, nullptr);
4012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
414698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::init: condition init failure: %s", strerror(status));
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() {
504698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes    int status = pthread_mutex_lock(&mMutex);
5112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
524698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::set: error locking for set condition: %s", strerror(status));
5312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams        return;
5412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
5512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
5612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    mSet = true;
5712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
5812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_cond_signal(&mCondition);
5912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
604698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::set: error on set condition: %s", strerror(status));
6112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
6212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
6312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_unlock(&mMutex);
6412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
654698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::set: error unlocking for set condition: %s", strerror(status));
6612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
6712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
6812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
694698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughesvoid Signal::wait() {
704698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes    int status = pthread_mutex_lock(&mMutex);
7112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
724698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::wait: error locking for condition: %s", strerror(status));
734698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        return;
7412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
7512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
7612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (!mSet) {
774698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        status = pthread_cond_wait(&mCondition, &mMutex);
78e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    }
79e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams
80e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    if (!status) {
81e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams        mSet = false;
82e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams    } else {
834698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::wait: error waiting for condition: %s", strerror(status));
8412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
8512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
8612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    status = pthread_mutex_unlock(&mMutex);
8712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    if (status) {
884698e2bec54a094e5c73936b9cf3db9d3c0b87ccElliott Hughes        ALOGE("Signal::wait: error unlocking for condition: %s", strerror(status));
8912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams    }
9012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams}
9112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams
9211496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript
9311496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android
94