GCC Code Coverage Report


Directory: ./
File: Os/Posix/CountingSemaphore.cpp
Date: 2026-09-23 22:11:34
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