1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include "rsSignal.h"
18*e1eccf28SAndroid Build Coastguard Worker #include <errno.h>
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker namespace android {
21*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
22*e1eccf28SAndroid Build Coastguard Worker
Signal()23*e1eccf28SAndroid Build Coastguard Worker Signal::Signal() {
24*e1eccf28SAndroid Build Coastguard Worker mSet = true;
25*e1eccf28SAndroid Build Coastguard Worker }
26*e1eccf28SAndroid Build Coastguard Worker
~Signal()27*e1eccf28SAndroid Build Coastguard Worker Signal::~Signal() {
28*e1eccf28SAndroid Build Coastguard Worker pthread_mutex_destroy(&mMutex);
29*e1eccf28SAndroid Build Coastguard Worker pthread_cond_destroy(&mCondition);
30*e1eccf28SAndroid Build Coastguard Worker }
31*e1eccf28SAndroid Build Coastguard Worker
init()32*e1eccf28SAndroid Build Coastguard Worker bool Signal::init() {
33*e1eccf28SAndroid Build Coastguard Worker int status = pthread_mutex_init(&mMutex, nullptr);
34*e1eccf28SAndroid Build Coastguard Worker if (status) {
35*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::init: mutex init failure: %s", strerror(status));
36*e1eccf28SAndroid Build Coastguard Worker return false;
37*e1eccf28SAndroid Build Coastguard Worker }
38*e1eccf28SAndroid Build Coastguard Worker
39*e1eccf28SAndroid Build Coastguard Worker status = pthread_cond_init(&mCondition, nullptr);
40*e1eccf28SAndroid Build Coastguard Worker if (status) {
41*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::init: condition init failure: %s", strerror(status));
42*e1eccf28SAndroid Build Coastguard Worker pthread_mutex_destroy(&mMutex);
43*e1eccf28SAndroid Build Coastguard Worker return false;
44*e1eccf28SAndroid Build Coastguard Worker }
45*e1eccf28SAndroid Build Coastguard Worker
46*e1eccf28SAndroid Build Coastguard Worker return true;
47*e1eccf28SAndroid Build Coastguard Worker }
48*e1eccf28SAndroid Build Coastguard Worker
set()49*e1eccf28SAndroid Build Coastguard Worker void Signal::set() {
50*e1eccf28SAndroid Build Coastguard Worker int status = pthread_mutex_lock(&mMutex);
51*e1eccf28SAndroid Build Coastguard Worker if (status) {
52*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::set: error locking for set condition: %s", strerror(status));
53*e1eccf28SAndroid Build Coastguard Worker return;
54*e1eccf28SAndroid Build Coastguard Worker }
55*e1eccf28SAndroid Build Coastguard Worker
56*e1eccf28SAndroid Build Coastguard Worker mSet = true;
57*e1eccf28SAndroid Build Coastguard Worker
58*e1eccf28SAndroid Build Coastguard Worker status = pthread_cond_signal(&mCondition);
59*e1eccf28SAndroid Build Coastguard Worker if (status) {
60*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::set: error on set condition: %s", strerror(status));
61*e1eccf28SAndroid Build Coastguard Worker }
62*e1eccf28SAndroid Build Coastguard Worker
63*e1eccf28SAndroid Build Coastguard Worker status = pthread_mutex_unlock(&mMutex);
64*e1eccf28SAndroid Build Coastguard Worker if (status) {
65*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::set: error unlocking for set condition: %s", strerror(status));
66*e1eccf28SAndroid Build Coastguard Worker }
67*e1eccf28SAndroid Build Coastguard Worker }
68*e1eccf28SAndroid Build Coastguard Worker
wait()69*e1eccf28SAndroid Build Coastguard Worker void Signal::wait() {
70*e1eccf28SAndroid Build Coastguard Worker int status = pthread_mutex_lock(&mMutex);
71*e1eccf28SAndroid Build Coastguard Worker if (status) {
72*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::wait: error locking for condition: %s", strerror(status));
73*e1eccf28SAndroid Build Coastguard Worker return;
74*e1eccf28SAndroid Build Coastguard Worker }
75*e1eccf28SAndroid Build Coastguard Worker
76*e1eccf28SAndroid Build Coastguard Worker if (!mSet) {
77*e1eccf28SAndroid Build Coastguard Worker status = pthread_cond_wait(&mCondition, &mMutex);
78*e1eccf28SAndroid Build Coastguard Worker }
79*e1eccf28SAndroid Build Coastguard Worker
80*e1eccf28SAndroid Build Coastguard Worker if (!status) {
81*e1eccf28SAndroid Build Coastguard Worker mSet = false;
82*e1eccf28SAndroid Build Coastguard Worker } else {
83*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::wait: error waiting for condition: %s", strerror(status));
84*e1eccf28SAndroid Build Coastguard Worker }
85*e1eccf28SAndroid Build Coastguard Worker
86*e1eccf28SAndroid Build Coastguard Worker status = pthread_mutex_unlock(&mMutex);
87*e1eccf28SAndroid Build Coastguard Worker if (status) {
88*e1eccf28SAndroid Build Coastguard Worker ALOGE("Signal::wait: error unlocking for condition: %s", strerror(status));
89*e1eccf28SAndroid Build Coastguard Worker }
90*e1eccf28SAndroid Build Coastguard Worker }
91*e1eccf28SAndroid Build Coastguard Worker
92*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
93*e1eccf28SAndroid Build Coastguard Worker } // namespace android
94