| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | #include "pch.h" | |||
| 2 | ||||
| 3 | #include "big_buffer.h" | |||
| 4 | ||||
| 5 | static BigBufferUser s_currentUser; | |||
| 6 | // uint32_t type to get 4-byte alignment | |||
| 7 | // alignment is required since we sometimes allocate objects in the buffer (like Timer of CompositeBuffer) | |||
| 8 | // we've only observed issue on F7 in -Os compiler configuration but technically all processors care | |||
| 9 | static uint32_t s_bigBuffer[BIG_BUFFER_SIZE / sizeof(uint32_t)]; | |||
| 10 | ||||
| 11 | #if EFI_UNIT_TEST | |||
| 12 | 2 | BigBufferUser getBigBufferCurrentUser() { | ||
| 13 | 2 | return s_currentUser; | ||
| 14 | } | |||
| 15 | #endif // EFI_UNIT_TEST | |||
| 16 | ||||
| 17 | 1 | static void releaseBuffer(void* bufferPtr, BigBufferUser user) { | ||
| 18 |
1/2✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
|
1/2✓ Decision 'true' taken 1 time.
✗ Decision 'false' not taken.
|
1 | if (bufferPtr != &s_bigBuffer || user != s_currentUser) { |
| 19 | // todo: panic! | |||
| 20 | } | |||
| 21 | ||||
| 22 | 1 | s_currentUser = BigBufferUser::None; | ||
| 23 | 1 | } | ||
| 24 | ||||
| 25 | 1 | BigBufferHandle::BigBufferHandle(void* buffer, BigBufferUser user) | ||
| 26 | 1 | : m_bufferPtr(buffer) | ||
| 27 | 1 | , m_user(user) | ||
| 28 | { | |||
| 29 | 1 | } | ||
| 30 | ||||
| 31 | ✗ | BigBufferHandle::BigBufferHandle(BigBufferHandle&& other) { | ||
| 32 | // swap contents of the two objects | |||
| 33 | ✗ | m_bufferPtr = other.m_bufferPtr; | ||
| 34 | ✗ | other.m_bufferPtr = nullptr; | ||
| 35 | ||||
| 36 | ✗ | m_user = other.m_user; | ||
| 37 | ✗ | other.m_user = BigBufferUser::None; | ||
| 38 | ✗ | } | ||
| 39 | ||||
| 40 | 1 | BigBufferHandle& BigBufferHandle::operator= (BigBufferHandle&& other) { | ||
| 41 |
1/2✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
|
1/2✓ Decision 'true' taken 1 time.
✗ Decision 'false' not taken.
|
1 | if (this != &other) { |
| 42 |
1/2✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
|
1/2✓ Decision 'true' taken 1 time.
✗ Decision 'false' not taken.
|
1 | if (m_bufferPtr) { |
| 43 | 1 | releaseBuffer(m_bufferPtr, m_user); | ||
| 44 | } | |||
| 45 | // swap contents of the two objects | |||
| 46 | 1 | m_bufferPtr = other.m_bufferPtr; | ||
| 47 | 1 | other.m_bufferPtr = nullptr; | ||
| 48 | ||||
| 49 | 1 | m_user = other.m_user; | ||
| 50 | 1 | other.m_user = BigBufferUser::None; | ||
| 51 | } | |||
| 52 | 1 | return *this; | ||
| 53 | } | |||
| 54 | ||||
| 55 | 2 | BigBufferHandle::~BigBufferHandle() { | ||
| 56 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 2 times.
|
2 | if (m_bufferPtr) { |
| 57 | ✗ | releaseBuffer(m_bufferPtr, m_user); | ||
| 58 | } | |||
| 59 | 2 | } | ||
| 60 | ||||
| 61 | 1 | BigBufferHandle getBigBuffer(BigBufferUser user) { | ||
| 62 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 1 time.
|
1 | if (s_currentUser != BigBufferUser::None) { |
| 63 | // fatal | |||
| 64 | ✗ | return {}; | ||
| 65 | } | |||
| 66 | ||||
| 67 | 1 | s_currentUser = user; | ||
| 68 | ||||
| 69 | 1 | return BigBufferHandle(s_bigBuffer, user); | ||
| 70 | } | |||
| 71 |