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 "SolidSyslogVxWorks64Resolver.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 "SolidSyslogVxWorks64ResolverErrors.h"
14 : : #include "SolidSyslogVxWorks64ResolverPrivate.h"
15 : : #include "SolidSyslogNullResolver.h"
16 : : #include "SolidSyslogPoolAllocator.h"
17 : : #include "SolidSyslogPrival.h"
18 : : #include "SolidSyslogTunables.h"
19 : :
20 : : struct SolidSyslogResolver;
21 : :
22 : : static inline size_t VxWorks64Resolver_IndexFromHandle(const struct SolidSyslogResolver* base);
23 : : static inline void VxWorks64Resolver_CleanupAtIndex(size_t index, void* context);
24 : :
25 : : static bool VxWorks64Resolver_InUse[SOLIDSYSLOG_RESOLVER_POOL_SIZE];
26 : : static struct SolidSyslogVxWorks64Resolver VxWorks64Resolver_Pool[SOLIDSYSLOG_RESOLVER_POOL_SIZE];
27 : : static struct SolidSyslogPoolAllocator VxWorks64Resolver_Allocator = {
28 : : VxWorks64Resolver_InUse,
29 : : SOLIDSYSLOG_RESOLVER_POOL_SIZE
30 : : };
31 : :
32 : 76 : struct SolidSyslogResolver* SolidSyslogVxWorks64Resolver_Create(void)
33 : : {
34 : 76 : size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&VxWorks64Resolver_Allocator);
35 : 76 : struct SolidSyslogResolver* handle = SolidSyslogNullResolver_Get();
36 [ + + ]: 76 : if (SolidSyslogPoolAllocator_IndexIsValid(&VxWorks64Resolver_Allocator, index) == true)
37 : : {
38 : 72 : SolidSyslogVxWorks64Resolver_Initialise(&VxWorks64Resolver_Pool[index].Base);
39 : 72 : handle = &VxWorks64Resolver_Pool[index].Base;
40 : : }
41 : : else
42 : : {
43 : 4 : VxWorks64Resolver_Report(
44 : : SOLIDSYSLOG_POOL_EXHAUSTED_SEVERITY,
45 : : SOLIDSYSLOG_CAT_POOL_EXHAUSTED,
46 : : SOLIDSYSLOG_RESOLVER_ERROR_POOL_EXHAUSTED
47 : : );
48 : : }
49 : 76 : return handle;
50 : : }
51 : :
52 : 80 : void SolidSyslogVxWorks64Resolver_Destroy(struct SolidSyslogResolver* base)
53 : : {
54 : 80 : size_t index = VxWorks64Resolver_IndexFromHandle(base);
55 [ + + + + ]: 153 : bool released = SolidSyslogPoolAllocator_IndexIsValid(&VxWorks64Resolver_Allocator, index) &&
56 : 73 : SolidSyslogPoolAllocator_FreeIfInUse(
57 : : &VxWorks64Resolver_Allocator,
58 : : index,
59 : : VxWorks64Resolver_CleanupAtIndex,
60 : : NULL
61 : : );
62 [ + + ]: 80 : if (!released)
63 : : {
64 : 8 : VxWorks64Resolver_Report(
65 : : SOLIDSYSLOG_UNKNOWN_DESTROY_SEVERITY,
66 : : SOLIDSYSLOG_CAT_UNKNOWN_DESTROY,
67 : : SOLIDSYSLOG_RESOLVER_ERROR_UNKNOWN_DESTROY
68 : : );
69 : : }
70 : 80 : }
71 : :
72 : 80 : static inline size_t VxWorks64Resolver_IndexFromHandle(const struct SolidSyslogResolver* base)
73 : : {
74 : 80 : size_t result = SOLIDSYSLOG_RESOLVER_POOL_SIZE;
75 [ + + ]: 87 : for (size_t poolIndex = 0U; poolIndex < SOLIDSYSLOG_RESOLVER_POOL_SIZE; poolIndex++)
76 : : {
77 [ + + ]: 80 : if (base == &VxWorks64Resolver_Pool[poolIndex].Base)
78 : : {
79 : 73 : result = poolIndex;
80 : 73 : break;
81 : : }
82 : : }
83 : 80 : return result;
84 : : }
85 : :
86 : 72 : static inline void VxWorks64Resolver_CleanupAtIndex(size_t index, void* context)
87 : : {
88 : : (void) context;
89 : 72 : SolidSyslogVxWorks64Resolver_Cleanup(&VxWorks64Resolver_Pool[index].Base);
90 : 72 : }
|