GCC Code Coverage Report


Directory: ./
File: Os/Posix/CountingSemaphore.cpp
Date: 2026-09-03 22:12:29
Exec Total Coverage
Lines: 0 37 0.0%
Functions: 0 7 0.0%
Branches: 0 22 0.0%

Line Branch Exec Source
1 // ======================================================================
2 // \title Os/Posix/CountingSemaphore.cpp
3 // \brief Posix implementations for Os::CountingSemaphore
4 // ======================================================================
5 #include "Os/Posix/CountingSemaphore.hpp"
6 #include <cerrno>
7 #include <ctime>
8 #include "Fw/Types/Assert.hpp"
9 #include "Os/Posix/error.hpp"
10
11 namespace Os {
12 namespace Posix {
13 namespace Semaphore {
14
15 PosixCountingSemaphore::PosixCountingSemaphore(U32 initial_count) {
16 // Default all pthread semaphores to only be visible to single application (since F' FSW is a single application)
17 int status = sem_init(&this->m_handle.m_semaphore, 0, initial_count);
18 FW_ASSERT(status == 0, static_cast<FwAssertArgType>(status));
19 }
20
21 PosixCountingSemaphore::~PosixCountingSemaphore() {
22 (void)sem_destroy(&this->m_handle.m_semaphore);
23 }
24
25 PosixCountingSemaphore::Status PosixCountingSemaphore::wait() {
26 int status = 0;
27 // @non-terminating@: retry on EINTR
28 do {
29 status = sem_wait(&this->m_handle.m_semaphore);
30 } while (status != 0 && errno == EINTR);
31 FW_ASSERT(status == 0 || errno != 0, status);
32 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
33 }
34
35 PosixCountingSemaphore::Status PosixCountingSemaphore::waitTimeout(const Fw::TimeInterval& interval) {
36 struct timespec abstime{};
37 int clock_status = clock_gettime(CLOCK_REALTIME, &abstime);
38 FW_ASSERT(clock_status == 0, static_cast<FwAssertArgType>(clock_status));
39
40 abstime.tv_sec += interval.getSeconds();
41 abstime.tv_nsec += static_cast<long>(interval.getUSeconds()) * 1000L;
42
43 if (abstime.tv_nsec >= 1000000000L) {
44 abstime.tv_sec += abstime.tv_nsec / 1000000000L;
45 abstime.tv_nsec = abstime.tv_nsec % 1000000000L;
46 }
47
48 int status = 0;
49 // @non-terminating@: retry on EINTR
50 do {
51 status = sem_timedwait(&this->m_handle.m_semaphore, &abstime);
52 } while (status != 0 && errno == EINTR);
53 FW_ASSERT(status == 0 || errno != 0, status);
54 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
55 }
56
57 PosixCountingSemaphore::Status PosixCountingSemaphore::tryWait() {
58 int status = sem_trywait(&this->m_handle.m_semaphore);
59 FW_ASSERT(status == 0 || errno != 0, status);
60 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
61 }
62
63 PosixCountingSemaphore::Status PosixCountingSemaphore::post() {
64 int status = sem_post(&this->m_handle.m_semaphore);
65 FW_ASSERT(status == 0 || errno != 0, status);
66 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
67 }
68
69 CountingSemaphoreHandle* PosixCountingSemaphore::getHandle() {
70 return &m_handle;
71 }
72
73 } // namespace Semaphore
74 } // namespace Posix
75 } // namespace Os
76