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 "SolidSyslogTimeQualitySd.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 "SolidSyslogNullSd.h"
14 : : #include "SolidSyslogPoolAllocator.h"
15 : : #include "SolidSyslogPrival.h"
16 : : #include "SolidSyslogTimeQuality.h"
17 : : #include "SolidSyslogTimeQualitySdErrors.h"
18 : : #include "SolidSyslogTimeQualitySdPrivate.h"
19 : : #include "SolidSyslogTunables.h"
20 : :
21 : : struct SolidSyslogStructuredData;
22 : :
23 : : static inline size_t TimeQualitySd_IndexFromHandle(const struct SolidSyslogStructuredData* base);
24 : : static inline void TimeQualitySd_CleanupAtIndex(size_t index, void* context);
25 : :
26 : : static bool TimeQualitySd_InUse[SOLIDSYSLOG_TIME_QUALITY_SD_POOL_SIZE];
27 : : static struct SolidSyslogTimeQualitySd TimeQualitySd_Pool[SOLIDSYSLOG_TIME_QUALITY_SD_POOL_SIZE];
28 : : static struct SolidSyslogPoolAllocator TimeQualitySd_Allocator = {
29 : : TimeQualitySd_InUse,
30 : : SOLIDSYSLOG_TIME_QUALITY_SD_POOL_SIZE
31 : : };
32 : :
33 : 73 : struct SolidSyslogStructuredData* SolidSyslogTimeQualitySd_Create(SolidSyslogTimeQualityFunction getTimeQuality)
34 : : {
35 : 73 : struct SolidSyslogStructuredData* handle = SolidSyslogNullSd_Get();
36 [ + + ]: 73 : if (getTimeQuality == NULL)
37 : : {
38 : 1 : TimeQualitySd_Report(
39 : : SOLIDSYSLOG_BAD_CONFIG_FATAL_SEVERITY,
40 : : SOLIDSYSLOG_CAT_BAD_CONFIG,
41 : : SOLIDSYSLOG_TIME_QUALITY_SD_ERROR_NULL_CALLBACK
42 : : );
43 : : }
44 : : else
45 : : {
46 : 72 : size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&TimeQualitySd_Allocator);
47 [ + + ]: 72 : if (SolidSyslogPoolAllocator_IndexIsValid(&TimeQualitySd_Allocator, index))
48 : : {
49 : 70 : SolidSyslogTimeQualitySd_Initialise(&TimeQualitySd_Pool[index].Base, getTimeQuality);
50 : 70 : handle = &TimeQualitySd_Pool[index].Base;
51 : : }
52 : : else
53 : : {
54 : 2 : TimeQualitySd_Report(
55 : : SOLIDSYSLOG_POOL_EXHAUSTED_SEVERITY,
56 : : SOLIDSYSLOG_CAT_POOL_EXHAUSTED,
57 : : SOLIDSYSLOG_TIME_QUALITY_SD_ERROR_POOL_EXHAUSTED
58 : : );
59 : : }
60 : : }
61 : 73 : return handle;
62 : : }
63 : :
64 : 73 : void SolidSyslogTimeQualitySd_Destroy(struct SolidSyslogStructuredData* base)
65 : : {
66 : 73 : size_t index = TimeQualitySd_IndexFromHandle(base);
67 : 73 : bool released =
68 [ + + + + ]: 144 : SolidSyslogPoolAllocator_IndexIsValid(&TimeQualitySd_Allocator, index) &&
69 : 71 : SolidSyslogPoolAllocator_FreeIfInUse(&TimeQualitySd_Allocator, index, TimeQualitySd_CleanupAtIndex, NULL);
70 [ + + ]: 73 : if (!released)
71 : : {
72 : 3 : TimeQualitySd_Report(
73 : : SOLIDSYSLOG_UNKNOWN_DESTROY_SEVERITY,
74 : : SOLIDSYSLOG_CAT_UNKNOWN_DESTROY,
75 : : SOLIDSYSLOG_TIME_QUALITY_SD_ERROR_UNKNOWN_DESTROY
76 : : );
77 : : }
78 : 73 : }
79 : :
80 : 73 : static inline size_t TimeQualitySd_IndexFromHandle(const struct SolidSyslogStructuredData* base)
81 : : {
82 : 73 : size_t result = SOLIDSYSLOG_TIME_QUALITY_SD_POOL_SIZE;
83 [ + + ]: 75 : for (size_t poolIndex = 0U; poolIndex < SOLIDSYSLOG_TIME_QUALITY_SD_POOL_SIZE; poolIndex++)
84 : : {
85 [ + + ]: 73 : if (base == &TimeQualitySd_Pool[poolIndex].Base)
86 : : {
87 : 71 : result = poolIndex;
88 : 71 : break;
89 : : }
90 : : }
91 : 73 : return result;
92 : : }
93 : :
94 : 70 : static inline void TimeQualitySd_CleanupAtIndex(size_t index, void* context)
95 : : {
96 : : (void) context;
97 : 70 : SolidSyslogTimeQualitySd_Cleanup(&TimeQualitySd_Pool[index].Base);
98 : 70 : }
|