xref: /aosp_15_r20/frameworks/rs/rsSignal.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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