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