// Block the task until the semaphore is acquired or the timeout expires OsStatus OsCSemLinux::acquire(const OsTime& rTimeout) { struct timespec timeout; OsStatus res; if (rTimeout.isInfinite()) res = (pt_sem_wait(&mSemImp) == POSIX_OK) ? OS_SUCCESS : OS_BUSY; else if (rTimeout.isNoWait()) res = (pt_sem_trywait(&mSemImp) == POSIX_OK) ? OS_SUCCESS : OS_BUSY; else { OsUtilLinux::cvtOsTimeToTimespec(rTimeout, &timeout); res = (pt_sem_timedwait(&mSemImp, &timeout) == POSIX_OK) ? OS_SUCCESS : OS_WAIT_TIMEOUT; } #ifdef OS_CSEM_DEBUG if (res == OS_SUCCESS) { updateAcquireStats(); } #endif #ifdef OS_SYNC_DEBUG if (res == OS_SUCCESS) { mSyncCrumbs.dropCrumb(pthread_self(), crumbAcquired); } #endif return res; }
// Conditionally acquire the semaphore (i.e., don't block) // Return OS_BUSY if the semaphore is held by some other task OsStatus OsCSemLinux::tryAcquire(void) { OsStatus res; res = (pt_sem_trywait(&mSemImp) == POSIX_OK) ? OS_SUCCESS : OS_BUSY; #ifdef OS_CSEM_DEBUG if (res == OS_SUCCESS) updateAcquireStats(); #endif return res; }
// Conditionally acquire the semaphore (i.e., don't block) // Return OS_BUSY if the semaphore is held by some other task OsStatus OsCSemLinux::tryAcquire(void) { OsStatus res; res = (pt_sem_trywait(&mSemImp) == POSIX_OK) ? OS_SUCCESS : OS_BUSY; #ifdef OS_CSEM_DEBUG if (res == OS_SUCCESS) { updateAcquireStats(); } #endif #ifdef OS_SYNC_DEBUG if (res == OS_SUCCESS) { mSyncCrumbs.dropCrumb(pthread_self(), crumbAcquired); } #endif return res; }