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 2012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android; 2112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android::renderscript; 2212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 2312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSignal::Signal() { 2512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams mSet = true; 2612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 2712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 28afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukSignal::~Signal() { 2912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_mutex_destroy(&mMutex); 3012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_cond_destroy(&mCondition); 3112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 3212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 33afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Signal::init() { 3444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes int status = pthread_mutex_init(&mMutex, nullptr); 3512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 36af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessFifo mutex init failure"); 3712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return false; 3812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 3912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 4044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes status = pthread_cond_init(&mCondition, nullptr); 4112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 42af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessFifo condition init failure"); 4312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_mutex_destroy(&mMutex); 4412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return false; 4512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 4612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 4712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return true; 4812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 4912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 50afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Signal::set() { 5112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams int status; 5212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 5312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_lock(&mMutex); 5412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 55af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i locking for set condition.", status); 5612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return; 5712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 5812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 5912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams mSet = true; 6012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 6112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_cond_signal(&mCondition); 6212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 63af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i on set condition.", status); 6412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 6512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 6612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_unlock(&mMutex); 6712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 68af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); 6912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 7012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 7112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 72e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Samsbool Signal::wait(uint64_t timeout) { 7312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams int status; 74e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams bool ret = false; 7512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 7612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_lock(&mMutex); 7712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 78af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i locking for condition.", status); 79e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams return false; 8012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 8112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 8212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (!mSet) { 83e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams if (!timeout) { 84e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams status = pthread_cond_wait(&mCondition, &mMutex); 85e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams } else { 86e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) 87e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000); 88e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#else 89e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams // This is safe it will just make things less reponsive 90e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams status = pthread_cond_wait(&mCondition, &mMutex); 91e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams#endif 92e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams } 93e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams } 94e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams 95e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams if (!status) { 96e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams mSet = false; 97e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams ret = true; 98e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams } else { 990b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER 100e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams if (status != ETIMEDOUT) { 101af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i waiting for condition.", status); 10212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 1030b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 10412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 10512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 10612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_unlock(&mMutex); 10712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 108af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status); 10912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 110e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams 111e0aab4a8ff1cffd8cfaedc2623db94072549e0e5Jason Sams return ret; 11212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 11312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 114