17 int status = sem_init(&this->m_handle.
m_semaphore, 0, initial_count);
18 FW_ASSERT(status == 0, static_cast<FwAssertArgType>(status));
30 }
while (status != 0 && errno == EINTR);
31 FW_ASSERT(status == 0 || errno != 0, status);
36 struct timespec abstime{};
37 int clock_status = clock_gettime(CLOCK_REALTIME, &abstime);
38 FW_ASSERT(clock_status == 0, static_cast<FwAssertArgType>(clock_status));
41 abstime.tv_nsec +=
static_cast<long>(interval.
getUSeconds()) * 1000L;
43 if (abstime.tv_nsec >= 1000000000L) {
44 abstime.tv_sec += abstime.tv_nsec / 1000000000L;
45 abstime.tv_nsec = abstime.tv_nsec % 1000000000L;
51 status = sem_timedwait(&this->m_handle.
m_semaphore, &abstime);
52 }
while (status != 0 && errno == EINTR);
53 FW_ASSERT(status == 0 || errno != 0, status);
58 int status = sem_trywait(&this->m_handle.
m_semaphore);
59 FW_ASSERT(status == 0 || errno != 0, status);
65 FW_ASSERT(status == 0 || errno != 0, status);
PosixCountingSemaphore::Status tryWait() override
non-blocking attempt to decrement the semaphore
~PosixCountingSemaphore() override
CountingSemaphore::Status posix_status_to_semaphore_status(int posix_status)
PosixCountingSemaphore::Status post() override
post (increment) the semaphore, potentially waking a waiting thread
PosixCountingSemaphore(U32 initial_count)
PosixCountingSemaphore::Status wait() override
wait (decrement) the semaphore, blocking if count is zero
PosixCountingSemaphore::Status waitTimeout(const Fw::TimeInterval &interval) override
wait on the semaphore with a timeout
CountingSemaphoreHandle * getHandle() override
return the underlying semaphore handle (implementation specific)