Branch data Line data Source code
1 : : /* SPDX-FileCopyrightText: Copyright 2026 Cozens Software Solutions Limited
2 : : * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0 OR LicenseRef-COSOSO-Commercial
3 : : */
4 : :
5 : : #include "SolidSyslogVxWorks64Address.h"
6 : :
7 : : #include <stdbool.h>
8 : : #include <stddef.h>
9 : : #include <stdint.h>
10 : :
11 : : #include "SolidSyslogError.h"
12 : : #include "SolidSyslogErrorCategory.h"
13 : : #include "SolidSyslogPoolAllocator.h"
14 : : #include "SolidSyslogVxWorks64AddressErrors.h"
15 : : #include "SolidSyslogVxWorks64AddressPrivate.h"
16 : : #include "SolidSyslogPrival.h"
17 : : #include "SolidSyslogTunables.h"
18 : :
19 : : struct SolidSyslogAddress;
20 : :
21 : : static inline struct SolidSyslogAddress* VxWorks64Address_HandleFromIndex(size_t index);
22 : : static inline size_t VxWorks64Address_IndexFromHandle(const struct SolidSyslogAddress* base);
23 : : static inline void VxWorks64Address_CleanupAtIndex(size_t index, void* context);
24 : :
25 : : static bool VxWorks64Address_InUse[SOLIDSYSLOG_ADDRESS_POOL_SIZE];
26 : : static struct SolidSyslogPoolAllocator VxWorks64Address_Allocator = {
27 : : VxWorks64Address_InUse,
28 : : SOLIDSYSLOG_ADDRESS_POOL_SIZE
29 : : };
30 : :
31 : 236 : struct SolidSyslogAddress* SolidSyslogVxWorks64Address_Create(void)
32 : : {
33 : : /* The shared exhaustion fallback the header describes, sized as a pooled
34 : : * slot so a Resolver write to it stays bounded. */
35 : : static struct SolidSyslogVxWorks64Address fallback;
36 : :
37 : 236 : size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&VxWorks64Address_Allocator);
38 : 236 : struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &fallback;
39 [ + + ]: 236 : if (SolidSyslogPoolAllocator_IndexIsValid(&VxWorks64Address_Allocator, index) == true)
40 : : {
41 : 233 : handle = VxWorks64Address_HandleFromIndex(index);
42 : 233 : SolidSyslogVxWorks64Address_Initialise(handle);
43 : : }
44 : : else
45 : : {
46 : 3 : VxWorks64Address_Report(
47 : : SOLIDSYSLOG_POOL_EXHAUSTED_SEVERITY,
48 : : SOLIDSYSLOG_CAT_POOL_EXHAUSTED,
49 : : SOLIDSYSLOG_ADDRESS_ERROR_POOL_EXHAUSTED
50 : : );
51 : : }
52 : 236 : return handle;
53 : : }
54 : :
55 : 775 : static inline struct SolidSyslogAddress* VxWorks64Address_HandleFromIndex(size_t index)
56 : : {
57 : : static struct SolidSyslogVxWorks64Address pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE];
58 : 775 : return (struct SolidSyslogAddress*) &pool[index];
59 : : }
60 : :
61 : 239 : void SolidSyslogVxWorks64Address_Destroy(struct SolidSyslogAddress* base)
62 : : {
63 : 239 : size_t index = VxWorks64Address_IndexFromHandle(base);
64 : 239 : bool released =
65 [ + + + + ]: 473 : SolidSyslogPoolAllocator_IndexIsValid(&VxWorks64Address_Allocator, index) &&
66 : 234 : SolidSyslogPoolAllocator_FreeIfInUse(&VxWorks64Address_Allocator, index, VxWorks64Address_CleanupAtIndex, NULL);
67 [ + + ]: 239 : if (!released)
68 : : {
69 : 6 : VxWorks64Address_Report(
70 : : SOLIDSYSLOG_UNKNOWN_DESTROY_SEVERITY,
71 : : SOLIDSYSLOG_CAT_UNKNOWN_DESTROY,
72 : : SOLIDSYSLOG_ADDRESS_ERROR_UNKNOWN_DESTROY
73 : : );
74 : : }
75 : 239 : }
76 : :
77 : 239 : static inline size_t VxWorks64Address_IndexFromHandle(const struct SolidSyslogAddress* base)
78 : : {
79 : 239 : size_t result = SOLIDSYSLOG_ADDRESS_POOL_SIZE;
80 [ + + ]: 314 : for (size_t poolIndex = 0U; poolIndex < SOLIDSYSLOG_ADDRESS_POOL_SIZE; poolIndex++)
81 : : {
82 [ + + ]: 309 : if (base == VxWorks64Address_HandleFromIndex(poolIndex))
83 : : {
84 : 234 : result = poolIndex;
85 : 234 : break;
86 : : }
87 : : }
88 : 239 : return result;
89 : : }
90 : :
91 : 233 : static inline void VxWorks64Address_CleanupAtIndex(size_t index, void* context)
92 : : {
93 : : (void) context;
94 : 233 : SolidSyslogVxWorks64Address_Cleanup(VxWorks64Address_HandleFromIndex(index));
95 : 233 : }
|