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 |