rsSignal.cpp revision 12b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9
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" 1812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 1912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android; 2012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsusing namespace android::renderscript; 2112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 2212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 2312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason SamsSignal::Signal() 2412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams{ 2512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams mSet = true; 2612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 2712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 2812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason SamsSignal::~Signal() 2912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams{ 3012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_mutex_destroy(&mMutex); 3112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_cond_destroy(&mCondition); 3212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 3312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 3412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsbool Signal::init() 3512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams{ 3612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams int status = pthread_mutex_init(&mMutex, NULL); 3712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 3812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessFifo mutex init failure"); 3912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return false; 4012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 4112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 4212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_cond_init(&mCondition, NULL); 4312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 4412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessFifo condition init failure"); 4512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams pthread_mutex_destroy(&mMutex); 4612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return false; 4712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 4812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 4912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return true; 5012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 5112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 5212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsvoid Signal::set() 5312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams{ 5412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams int status; 5512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 5612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_lock(&mMutex); 5712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 5812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i locking for set condition.", status); 5912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return; 6012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 6112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 6212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams mSet = true; 6312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 6412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_cond_signal(&mCondition); 6512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 6612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i on set condition.", status); 6712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 6812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 6912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_unlock(&mMutex); 7012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 7112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); 7212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 7312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 7412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 7512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Samsvoid Signal::wait() 7612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams{ 7712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams int status; 7812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 7912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_lock(&mMutex); 8012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 8112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i locking for condition.", status); 8212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams return; 8312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 8412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 8512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (!mSet) { 8612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_cond_wait(&mCondition, &mMutex); 8712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 8812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i waiting on condition.", status); 8912b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 9012b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 9112b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams mSet = false; 9212b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 9312b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams status = pthread_mutex_unlock(&mMutex); 9412b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams if (status) { 9512b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams LOGE("LocklessCommandFifo: error %i unlocking for condition.", status); 9612b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams } 9712b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams} 9812b14ae9fa34f4fd0bf21a2a4ac95a4864248fe9Jason Sams 99