10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "rsSignal.h" 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleusing namespace android; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleusing namespace android::renderscript; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 230825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleSignal::Signal() { 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSet = true; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleSignal::~Signal() { 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_destroy(&mMutex); 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_cond_destroy(&mCondition); 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool Signal::init() { 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int status = pthread_mutex_init(&mMutex, NULL); 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (status) { 35 ALOGE("LocklessFifo mutex init failure"); 36 return false; 37 } 38 39 status = pthread_cond_init(&mCondition, NULL); 40 if (status) { 41 ALOGE("LocklessFifo condition init failure"); 42 pthread_mutex_destroy(&mMutex); 43 return false; 44 } 45 46 return true; 47} 48 49void Signal::set() { 50 int status; 51 52 status = pthread_mutex_lock(&mMutex); 53 if (status) { 54 ALOGE("LocklessCommandFifo: error %i locking for set condition.", status); 55 return; 56 } 57 58 mSet = true; 59 60 status = pthread_cond_signal(&mCondition); 61 if (status) { 62 ALOGE("LocklessCommandFifo: error %i on set condition.", status); 63 } 64 65 status = pthread_mutex_unlock(&mMutex); 66 if (status) { 67 ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); 68 } 69} 70 71bool Signal::wait(uint64_t timeout) { 72 int status; 73 bool ret = false; 74 75 status = pthread_mutex_lock(&mMutex); 76 if (status) { 77 ALOGE("LocklessCommandFifo: error %i locking for condition.", status); 78 return false; 79 } 80 81 if (!mSet) { 82 if (!timeout) { 83 status = pthread_cond_wait(&mCondition, &mMutex); 84 } else { 85#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) 86 status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000); 87#else 88 // This is safe it will just make things less reponsive 89 status = pthread_cond_wait(&mCondition, &mMutex); 90#endif 91 } 92 } 93 94 if (!status) { 95 mSet = false; 96 ret = true; 97 } else { 98 if (status != ETIMEDOUT) { 99 ALOGE("LocklessCommandFifo: error %i waiting for condition.", status); 100 } 101 } 102 103 status = pthread_mutex_unlock(&mMutex); 104 if (status) { 105 ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status); 106 } 107 108 return ret; 109} 110 111