10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/* 20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project 30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License. 60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at 70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software 110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and 140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License. 150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */ 160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsSignal.h" 180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android; 200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript; 210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSignal::Signal() { 240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mSet = true; 250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen HinesSignal::~Signal() { 280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines pthread_mutex_destroy(&mMutex); 290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines pthread_cond_destroy(&mCondition); 300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool Signal::init() { 330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines int status = pthread_mutex_init(&mMutex, NULL); 340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessFifo mutex init failure"); 360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return false; 370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_cond_init(&mCondition, NULL); 400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessFifo condition init failure"); 420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines pthread_mutex_destroy(&mMutex); 430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return false; 440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return true; 470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Signal::set() { 500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines int status; 510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_mutex_lock(&mMutex); 530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i locking for set condition.", status); 550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return; 560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mSet = true; 590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_cond_signal(&mCondition); 610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i on set condition.", status); 630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_mutex_unlock(&mMutex); 660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); 680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool Signal::wait(uint64_t timeout) { 720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines int status; 730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines bool ret = false; 740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_mutex_lock(&mMutex); 760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i locking for condition.", status); 780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return false; 790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!mSet) { 820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!timeout) { 830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_cond_wait(&mCondition, &mMutex); 840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } else { 850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) 860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000); 870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#else 880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // This is safe it will just make things less reponsive 890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_cond_wait(&mCondition, &mMutex); 900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif 910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!status) { 950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mSet = false; 960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ret = true; 970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } else { 980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status != ETIMEDOUT) { 990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i waiting for condition.", status); 1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines status = pthread_mutex_unlock(&mMutex); 1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (status) { 1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status); 1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return ret; 1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 111