xref: /xnu-10002.81.5/libkern/libkern/coreanalytics/coreanalytics_internal.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 2020 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 #ifdef XNU_KERNEL_PRIVATE
29 #ifndef _COREANALYTICS_H
30 
31 /*
32  * Internal macros used by coreanalytics code.
33  * Kept in a separate header file to keep the interface file cleaner.
34  * DO NOT USE DIRECTLY.
35  */
36 #include <kern/mpsc_queue.h>
37 #include <kern/zalloc.h>
38 
39 /*
40  * Macros to perform a foreach loop over variadic macro arguments.
41  * Calls a different macro for even (fe) and odd (fo) arguments.
42  */
43 
44 /* Return the 70th argument */
45 #define _CA_NTH(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
46 	    _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
47 	    _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, \
48 	    _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
49 	    _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, N, ...) N
50 
51 #define _CA_NULL_TERMINATOR "\0"
52 #define _CA_NULL_EPSILON
53 
54 #define _f0(f, ...)
55 #define _f1(fe, e, fo, x, ...) fo(x)
56 #define _f2(fe, e, fo, x, ...) fe(x) e _f1(fe, e, fo, __VA_ARGS__)
57 #define _f3(fe, e, fo, x, ...) fo(x) e _f2(fe, e, fo, __VA_ARGS__)
58 #define _f4(fe, e, fo, x, ...) fe(x) e _f3(fe, e, fo, __VA_ARGS__)
59 #define _f5(fe, e, fo, x, ...) fo(x) e _f4(fe, e, fo, __VA_ARGS__)
60 #define _f6(fe, e, fo, x, ...) fe(x) e _f5(fe, e, fo, __VA_ARGS__)
61 #define _f7(fe, e, fo, x, ...) fo(x) e _f6(fe, e, fo, __VA_ARGS__)
62 #define _f8(fe, e, fo, x, ...) fe(x) e _f7(fe, e, fo, __VA_ARGS__)
63 #define _f9(fe, e, fo, x, ...) fo(x) e _f8(fe, e, fo, __VA_ARGS__)
64 #define _f10(fe, e, fo, x, ...) fe(x) e _f9(fe, e, fo, __VA_ARGS__)
65 #define _f11(fe, e, fo, x, ...) fo(x) e _f10(fe, e, fo, __VA_ARGS__)
66 #define _f12(fe, e, fo, x, ...) fe(x) e _f11(fe, e, fo, __VA_ARGS__)
67 #define _f13(fe, e, fo, x, ...) fo(x) e _f12(fe, e, fo, __VA_ARGS__)
68 #define _f14(fe, e, fo, x, ...) fe(x) e _f13(fe, e, fo, __VA_ARGS__)
69 #define _f15(fe, e, fo, x, ...) fo(x) e _f14(fe, e, fo, __VA_ARGS__)
70 #define _f16(fe, e, fo, x, ...) fe(x) e _f15(fe, e, fo, __VA_ARGS__)
71 #define _f17(fe, e, fo, x, ...) fo(x) e _f16(fe, e, fo, __VA_ARGS__)
72 #define _f18(fe, e, fo, x, ...) fe(x) e _f17(fe, e, fo, __VA_ARGS__)
73 #define _f19(fe, e, fo, x, ...) fo(x) e _f18(fe, e, fo, __VA_ARGS__)
74 #define _f20(fe, e, fo, x, ...) fe(x) e _f19(fe, e, fo, __VA_ARGS__)
75 #define _f21(fe, e, fo, x, ...) fo(x) e _f20(fe, e, fo, __VA_ARGS__)
76 #define _f22(fe, e, fo, x, ...) fe(x) e _f21(fe, e, fo, __VA_ARGS__)
77 #define _f23(fe, e, fo, x, ...) fo(x) e _f22(fe, e, fo, __VA_ARGS__)
78 #define _f24(fe, e, fo, x, ...) fe(x) e _f23(fe, e, fo, __VA_ARGS__)
79 #define _f25(fe, e, fo, x, ...) fo(x) e _f24(fe, e, fo, __VA_ARGS__)
80 #define _f26(fe, e, fo, x, ...) fe(x) e _f25(fe, e, fo, __VA_ARGS__)
81 #define _f27(fe, e, fo, x, ...) fo(x) e _f26(fe, e, fo, __VA_ARGS__)
82 #define _f28(fe, e, fo, x, ...) fe(x) e _f27(fe, e, fo, __VA_ARGS__)
83 #define _f29(fe, e, fo, x, ...) fo(x) e _f28(fe, e, fo, __VA_ARGS__)
84 #define _f30(fe, e, fo, x, ...) fe(x) e _f29(fe, e, fo, __VA_ARGS__)
85 #define _f31(fe, e, fo, x, ...) fo(x) e _f30(fe, e, fo, __VA_ARGS__)
86 #define _f32(fe, e, fo, x, ...) fe(x) e _f31(fe, e, fo, __VA_ARGS__)
87 #define _f33(fe, e, fo, x, ...) fo(x) e _f32(fe, e, fo, __VA_ARGS__)
88 #define _f34(fe, e, fo, x, ...) fe(x) e _f33(fe, e, fo, __VA_ARGS__)
89 #define _f35(fe, e, fo, x, ...) fo(x) e _f34(fe, e, fo, __VA_ARGS__)
90 #define _f36(fe, e, fo, x, ...) fe(x) e _f35(fe, e, fo, __VA_ARGS__)
91 #define _f37(fe, e, fo, x, ...) fo(x) e _f36(fe, e, fo, __VA_ARGS__)
92 #define _f38(fe, e, fo, x, ...) fe(x) e _f37(fe, e, fo, __VA_ARGS__)
93 #define _f39(fe, e, fo, x, ...) fo(x) e _f38(fe, e, fo, __VA_ARGS__)
94 #define _f40(fe, e, fo, x, ...) fe(x) e _f39(fe, e, fo, __VA_ARGS__)
95 #define _f41(fe, e, fo, x, ...) fo(x) e _f40(fe, e, fo, __VA_ARGS__)
96 #define _f42(fe, e, fo, x, ...) fe(x) e _f41(fe, e, fo, __VA_ARGS__)
97 #define _f43(fe, e, fo, x, ...) fo(x) e _f42(fe, e, fo, __VA_ARGS__)
98 #define _f44(fe, e, fo, x, ...) fe(x) e _f43(fe, e, fo, __VA_ARGS__)
99 #define _f45(fe, e, fo, x, ...) fo(x) e _f44(fe, e, fo, __VA_ARGS__)
100 #define _f46(fe, e, fo, x, ...) fe(x) e _f45(fe, e, fo, __VA_ARGS__)
101 #define _f47(fe, e, fo, x, ...) fo(x) e _f46(fe, e, fo, __VA_ARGS__)
102 #define _f48(fe, e, fo, x, ...) fe(x) e _f47(fe, e, fo, __VA_ARGS__)
103 #define _f49(fe, e, fo, x, ...) fo(x) e _f48(fe, e, fo, __VA_ARGS__)
104 #define _f50(fe, e, fo, x, ...) fe(x) e _f49(fe, e, fo, __VA_ARGS__)
105 #define _f51(fe, e, fo, x, ...) fo(x) e _f50(fe, e, fo, __VA_ARGS__)
106 #define _f52(fe, e, fo, x, ...) fe(x) e _f51(fe, e, fo, __VA_ARGS__)
107 #define _f53(fe, e, fo, x, ...) fo(x) e _f52(fe, e, fo, __VA_ARGS__)
108 #define _f54(fe, e, fo, x, ...) fe(x) e _f53(fe, e, fo, __VA_ARGS__)
109 #define _f55(fe, e, fo, x, ...) fo(x) e _f54(fe, e, fo, __VA_ARGS__)
110 #define _f56(fe, e, fo, x, ...) fe(x) e _f55(fe, e, fo, __VA_ARGS__)
111 #define _f57(fe, e, fo, x, ...) fo(x) e _f56(fe, e, fo, __VA_ARGS__)
112 #define _f58(fe, e, fo, x, ...) fe(x) e _f57(fe, e, fo, __VA_ARGS__)
113 #define _f59(fe, e, fo, x, ...) fo(x) e _f58(fe, e, fo, __VA_ARGS__)
114 #define _f60(fe, e, fo, x, ...) fe(x) e _f59(fe, e, fo, __VA_ARGS__)
115 #define _f61(fe, e, fo, x, ...) fo(x) e _f60(fe, e, fo, __VA_ARGS__)
116 #define _f62(fe, e, fo, x, ...) fe(x) e _f61(fe, e, fo, __VA_ARGS__)
117 #define _f63(fe, e, fo, x, ...) fo(x) e _f62(fe, e, fo, __VA_ARGS__)
118 #define _f64(fe, e, fo, x, ...) fe(x) e _f63(fe, e, fo, __VA_ARGS__)
119 #define _f65(fe, e, fo, x, ...) fo(x) e _f64(fe, e, fo, __VA_ARGS__)
120 #define _f66(fe, e, fo, x, ...) fe(x) e _f65(fe, e, fo, __VA_ARGS__)
121 #define _f67(fe, e, fo, x, ...) fo(x) e _f66(fe, e, fo, __VA_ARGS__)
122 #define _f68(fe, e, fo, x, ...) fe(x) e _f67(fe, e, fo, __VA_ARGS__)
123 #define _f69(fe, e, fo, x, ...) fo(x) e _f68(fe, e, fo, __VA_ARGS__)
124 #define _f70(fe, e, fo, x, ...) fe(x) e _f69(fe, e, fo, __VA_ARGS__)
125 
126 #define _CA_FOREACH(fe, e, fo, ...) _CA_NTH(__VA_ARGS__, \
127     _f70, _f69, _f68, _f67, _f66, _f65, _f64, _f63, _f62, _f61, \
128     _f60, _f59, _f58, _f57, _f56, _f55, _f54, _f53, _f52, _f51, _f50, _f49, _f48, _f47, _f46, _f45, _f44, _f43, \
129     _f42, _f41, _f40, _f39, _f38, _f37, _f36, _f35, _f34, _f33, _f32, _f31, _f30, _f29, _f28, _f27, _f26, _f25, \
130     _f24, _f23, _f22, _f21, _f20, _f19, _f18, _f17, _f16, _f15, _f14, _f13, _f12, _f11, _f10, _f9, _f8, _f7, \
131     _f6, _f5, _f4, _f3, _f2, _f1, _f0)(fe, e, fo, ##__VA_ARGS__)
132 
133 #define _CA_TYPE_DECLARATION(T) __typeof__(T)
134 
135 /* Stringify T before macro expansion. */
136 #define _CA_STRINGIFY(T) #T
137 /* Stringify T after macro expansion. */
138 #define _CA_STRINGIFY_EXPAND(T) _CA_STRINGIFY(T)
139 #define _CA_VARIABLE_DECLARATION(T) T;
140 
141 #define _CA_EVENT_NAME_PREFIX(name) _ca_event_format_##name
142 
143 #define _CA_EVENT_ORG "com.apple.xnu."
144 
145 struct _ca_event {
146 	struct mpsc_queue_chain link;
147 	const char *format_str;
148 	void *data;
149 };
150 
151 typedef struct _ca_event * ca_event_t;
152 
153 /*
154  * DO NOT USE DIRECTLY.
155  * Use CA_EVENT_SEND instead.
156  */
157 extern void core_analytics_send_event(ca_event_t event);
158 /*
159  * DO NOT USE DIRECTLY.
160  * Use CA_EVENT_SEND_PREEMPTION_DISABLED instead.
161  */
162 extern void core_analytics_send_event_preemption_disabled(ca_event_t event);
163 /*
164  * DO NOT USE DIRECTLY.
165  * Use CA_EVENT_ALLOCATE instead.
166  */
167 extern ca_event_t core_analytics_allocate_event(size_t data_size, const char *format_str, zalloc_flags_t flags);
168 /*
169  * Placeholder token.
170  * Used in an event format string to indicate that this is a static string.
171  * Only the name and type of this string are important. The contents are not used.
172  */
173 typedef char ca_sstr;
174 
175 extern size_t core_analytics_event_size(const char *event_spec);
176 
177 #endif /* _COREANALYTICS_H */
178 #endif /* XNU_KERNEL_PRIVATE */
179