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