1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 #include "Semaphore.h" 18 19 20 Semaphore::Semaphore(int count) 21 { 22 if (sem_init(&mSem, 0, count) != 0) { 23 ASSERT(false); 24 } 25 } 26 27 Semaphore::~Semaphore() 28 { 29 sem_destroy(&mSem); 30 } 31 32 void Semaphore::tryWait() 33 { 34 sem_trywait(&mSem); 35 } 36 37 bool Semaphore::wait() 38 { 39 if (sem_wait(&mSem) == 0) { 40 return true; 41 } else { 42 return false; 43 } 44 } 45 46 bool Semaphore::timedWait(int timeInMSec) 47 { 48 const int ONE_SEC_IN_NANOSEC = 1000000000; 49 const int ONE_MSEC_IN_NANOSEC = 1000000; 50 const int ONE_SEC_IN_MSEC = 1000; 51 struct timespec timeOld; 52 if (clock_gettime(CLOCK_REALTIME, &timeOld) != 0) { 53 return false; 54 } 55 int secToGo = timeInMSec / ONE_SEC_IN_MSEC; 56 int msecToGo = timeInMSec - (ONE_SEC_IN_MSEC * secToGo); 57 int nanoSecToGo = ONE_MSEC_IN_NANOSEC * msecToGo; 58 struct timespec timeNew = timeOld; 59 int nanoTotal = timeOld.tv_nsec + nanoSecToGo; 60 //LOGI("secToGo %d, msecToGo %d, nanoTotal %d", secToGo, msecToGo, nanoTotal); 61 if (nanoTotal > ONE_SEC_IN_NANOSEC) { 62 nanoTotal -= ONE_SEC_IN_NANOSEC; 63 secToGo += 1; 64 } 65 timeNew.tv_sec += secToGo; 66 timeNew.tv_nsec = nanoTotal; 67 //LOGV("Semaphore::timedWait now %d-%d until %d-%d for %d msecs", 68 // timeOld.tv_sec, timeOld.tv_nsec, timeNew.tv_sec, timeNew.tv_nsec, timeInMSec); 69 if (sem_timedwait(&mSem, &timeNew) == 0) { 70 return true; 71 } else { 72 return false; 73 } 74 } 75 76 void Semaphore::post() 77 { 78 sem_post(&mSem); 79 } 80