GCC Code Coverage Report


Directory: ./
File: Os/Posix/CountingSemaphore.cpp
Date: 2026-09-03 21:13:48
Exec Total Coverage
Lines: 33 37 89.2%
Functions: 6 7 85.7%
Branches: 21 34 61.8%

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 2581 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
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 2581 times.
2581 int status = sem_init(&this->m_handle.m_semaphore, 0, initial_count);
18 2581 FW_ASSERT(status == 0, static_cast<FwAssertArgType>(status));
19 2581 }
20
21 5162 PosixCountingSemaphore::~PosixCountingSemaphore() {
22
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 2581 times.
5162 (void)sem_destroy(&this->m_handle.m_semaphore);
23 5162 }
24
25 1034 PosixCountingSemaphore::Status PosixCountingSemaphore::wait() {
26 1034 int status = 0;
27 // @non-terminating@: retry on EINTR
28 do {
29
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1034 times.
1034 status = sem_wait(&this->m_handle.m_semaphore);
30
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1034 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
1034 } while (status != 0 && errno == EINTR);
31 1034 FW_ASSERT(status == 0 || errno != 0, status);
32
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1034 times.
1034 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
33 }
34
35 8 PosixCountingSemaphore::Status PosixCountingSemaphore::waitTimeout(const Fw::TimeInterval& interval) {
36 8 struct timespec abstime{};
37 8 int clock_status = clock_gettime(CLOCK_REALTIME, &abstime);
38 8 FW_ASSERT(clock_status == 0, static_cast<FwAssertArgType>(clock_status));
39
40
1/1
✓ Branch 4 taken 8 times.
8 abstime.tv_sec += interval.getSeconds();
41
1/1
✓ Branch 4 taken 8 times.
8 abstime.tv_nsec += static_cast<long>(interval.getUSeconds()) * 1000L;
42
43
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (abstime.tv_nsec >= 1000000000L) {
44 abstime.tv_sec += abstime.tv_nsec / 1000000000L;
45 abstime.tv_nsec = abstime.tv_nsec % 1000000000L;
46 }
47
48 8 int status = 0;
49 // @non-terminating@: retry on EINTR
50 do {
51
2/3
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 5 taken 8 times.
8 status = sem_timedwait(&this->m_handle.m_semaphore, &abstime);
52
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
8 } while (status != 0 && errno == EINTR);
53 8 FW_ASSERT(status == 0 || errno != 0, status);
54
3/3
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
16 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
55 }
56
57 209144 PosixCountingSemaphore::Status PosixCountingSemaphore::tryWait() {
58
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 209209 times.
209144 int status = sem_trywait(&this->m_handle.m_semaphore);
59 209288 FW_ASSERT(status == 0 || errno != 0, status);
60
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 208179 times.
208188 return status == 0 ? Status::OP_OK : posix_status_to_semaphore_status(errno);
61 }
62
63 209130 PosixCountingSemaphore::Status PosixCountingSemaphore::post() {
64
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 209588 times.
209130 int status = sem_post(&this->m_handle.m_semaphore);
65 210255 FW_ASSERT(status == 0 || errno != 0, status);
66
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 208415 times.
208415 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