Zen API
 All Classes Files Functions Variables Typedefs Friends Macros Modules Pages
kApiCfg.h
Go to the documentation of this file.
1 
10 #ifndef K_API_API_CFG_H
11 #define K_API_API_CFG_H
12 
13 /* Detect the compiler family; fall back to GCC as default. */
14 #if defined(_MSC_VER)
15 # define K_MSVC
16 #elif defined(__TI_COMPILER_VERSION__)
17 # define K_TI_CCS
18 #else
19 # define K_GCC
20 #endif
21 
22 /* Helpful constants that can be compared with K_CPP_VERSION (defined below). */
23 #define K_CPP_VERSION_1998 (199711L)
24 #define K_CPP_VERSION_2011 (201103L)
25 #define K_CPP_VERSION_2014 (201402L)
26 #define K_CPP_VERSION_2017 (201703L)
27 
28 /*
29 * Detect language; K_CPP is defined only if the compiler is a C++ compiler; K_CPP_VERSION is
30 * always defined, but will have a definition of -1 if the compiler is a C compiler. */
31 #if defined(__cplusplus)
32 
33 # if defined(_MSVC_LANG)
34 # define K_CPP _MSVC_LANG
35 # else
36 # define K_CPP __cplusplus
37 # endif
38 
39 # if (K_CPP < K_CPP_VERSION_1998)
40 # undef K_CPP
41 # define K_CPP K_CPP_VERSION_1998
42 # endif
43 
44 # define K_CPP_VERSION K_CPP
45 
46 #else
47 
48 # define K_CPP_VERSION -1
49 
50 #endif
51 
52 #if defined(__cplusplus_cli)
53 # define K_CPP_CLI
54 #endif
55 
56 /* Detect the OS; fall back to non-specific POSIX as default. */
57 #if defined(_WIN32) || defined(_WIN64)
58 # define K_WINDOWS
59 #elif defined(__TMS320C6X__)
60 # define K_TI_BIOS
61 # define K_DSP_BIOS /* old definition, provided for compatibility with FS<=6.1.33.x */
62 #elif defined(_WRS_KERNEL)
63 # define K_VX_KERNEL
64 #else
65 # define K_POSIX
66 # if defined(__linux__)
67 # define K_LINUX
68 # endif
69 # if defined(__APPLE__)
70 # define K_DARWIN
71 # endif
72 # if defined(__QNXNTO__)
73 # define K_QNX
74 # endif
75 #endif
76 
77 /* Code profiling always enabled in debug builds. */
78 #if defined(K_DEBUG)
79 # define K_PROFILE
80 #endif
81 
82 #if defined(K_DEBUG)
83 # define K_DEBUG_ENABLED (1)
84 #else
85 # define K_DEBUG_ENABLED (0)
86 #endif
87 
88 #if defined(K_PROFILE)
89 # define K_PROFILE_ENABLED (1)
90 #else
91 # define K_PROFILE_ENABLED (0)
92 #endif
93 
94 #if (defined(K_DEBUG) || defined(K_ASSERT)) && !defined(K_NO_ASSERT)
95 # define K_ASSERT_ENABLED (1)
96 #else
97 # define K_ASSERT_ENABLED (0)
98 #endif
99 
100 /* Provide shorter symbol to use when checking for Cuda support. */
101 #if defined(K_HAVE_CUDA)
102 # define K_CUDA
103 #endif
104 
105 /*
106  * Include some C standard headers that we heavily rely on. This list is subject to change;
107  * dependent code should not assume that these headers will always be included here.
108  */
109 #if defined(K_MSVC) && defined(K_DEBUG)
110 # define _CRTDBG_MAP_ALLOC
111 # include <stdlib.h>
112 # include <crtdbg.h>
113 #else
114 # include <stdlib.h>
115 #endif
116 
117 #include <stdarg.h>
118 #include <stddef.h>
119 #include <string.h>
120 
121 #if defined(K_MSVC)
122 # include <intrin.h>
123 #endif
124 
125 #if (K_CPP_VERSION >= K_CPP_VERSION_2011)
126 # include <type_traits>
127 #endif
128 
129 /* Utilty macros for stringizing macro arguments. */
130 #define xkStringize(X) #X
131 #define xkStringizeDefine(X) xkStringize(X)
132 
133 /*
134  * Detect pointer size; raise an eror if the pointer size cannot be detected. The behaviour
135  * can be overridden by defining K_POINTER_SIZE as a compiler flag.
136  */
137 #if !defined(K_POINTER_SIZE)
138 # if defined(_WIN64) || defined(WIN64)
139 # define K_POINTER_SIZE (8)
140 # elif defined(_WIN32) || defined(WIN32)
141 # define K_POINTER_SIZE (4)
142 # elif defined(__SIZEOF_POINTER__)
143 # define K_POINTER_SIZE (__SIZEOF_POINTER__)
144 # elif defined(__LP64__) || defined(__LLP64__) || defined(__SILP64__)
145 # define K_POINTER_SIZE (8)
146 # elif defined(__LP32__) || defined(__ILP32__)
147 # define K_POINTER_SIZE (4)
148 # elif defined(_TMS320C6X)
149 # define K_POINTER_SIZE (4)
150 # else
151 # error "Pointer size not detected; define K_POINTER_SIZE as compiler flag."
152 # endif
153 #endif
154 
155 #if (K_POINTER_SIZE == 8)
156 # define K_POINTER_SHIFT (3)
157 #elif (K_POINTER_SIZE == 4)
158 # define K_POINTER_SHIFT (2)
159 #endif
160 
161 /*
162  * Detect endianness; fall back to little endian as default. The behaviour can be overridden
163  * by defining K_ENDIANNESS as a compiler flag.
164  */
165 #if !defined(K_ENDIANNESS)
166 # if defined(K_GCC) && defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
167 # define K_ENDIANNESS (kENDIANNESS_BIG)
168 # else
169 # define K_ENDIANNESS (kENDIANNESS_LITTLE)
170 # endif
171 #endif
172 
173 #if defined(K_CPP)
174 # define kExtern extern "C"
175 #else
176 # define kExtern extern
177 #endif
178 
179 #if defined(K_GCC)
180 # define K_ATTRIBUTE_UNUSED __attribute__((unused))
181 #else
182 # define K_ATTRIBUTE_UNUSED
183 #endif
184 
185 /* Define primitive data types and calling conventions. */
186 #if defined(K_MSVC)
187 
188 # define xkCall __stdcall
189 # define xkDlCall __cdecl
190 
191 # define kExportFx(TYPE) kExtern __declspec(dllexport) TYPE kCall
192 # define kImportFx(TYPE) kExtern __declspec(dllimport) TYPE kCall
193 
194 # define kExportCx(TYPE) kExtern __declspec(dllexport) TYPE xkDlCall
195 # define kImportCx(TYPE) kExtern __declspec(dllimport) TYPE xkDlCall
196 
197 # define kInFx(TYPE) kExtern TYPE kCall
198 # define kInCx(TYPE) kExtern TYPE kCall
199 
200 # define kExportDx(TYPE) __declspec(dllexport) TYPE
201 # define kImportDx(TYPE) __declspec(dllimport) TYPE
202 
203 # define kInDx(TYPE) TYPE
204 
205 # define kExportClass __declspec(dllexport)
206 # define kImportClass __declspec(dllimport)
207 
208 # if _MSC_VER >= 1500
209 # define kInline __inline
210 # else
211 # define kInline
212 # endif
213 
214  typedef unsigned __int8 xk8u;
215  typedef unsigned __int16 xk16u;
216  typedef unsigned __int32 xk32u;
217  typedef unsigned __int64 xk64u;
218  typedef __int8 xk8s;
219  typedef __int16 xk16s;
220  typedef __int32 xk32s;
221  typedef __int64 xk64s;
222  typedef float xk32f;
223  typedef double xk64f;
224  typedef char xkChar;
225  typedef unsigned char xkByte;
226 
227 # define xk64U(CONSTANT) (CONSTANT##ui64)
228 # define xk64S(CONSTANT) (CONSTANT##i64)
229 
230 #elif defined(K_TI_CCS)
231 
232 # define xkCall
233 # define xkDlCall
234 
235 # define kExportFx(TYPE) kExtern TYPE kCall
236 # define kImportFx(TYPE) kExtern TYPE kCall
237 
238 # define kExportCx(TYPE) kExtern TYPE kDlCall
239 # define kImportCx(TYPE) kExtern TYPE kDlCall
240 
241 # define kInFx(TYPE) kExtern TYPE kCall
242 # define kInCx(TYPE) kExtern TYPE kCall
243 
244 # define kExportDx(TYPE) TYPE
245 # define kImportDx(TYPE) TYPE
246 
247 # define kInDx(TYPE) TYPE
248 
249 # define kExportClass
250 # define kImportClass
251 
252 # define kInline inline
253 
254  typedef unsigned char xk8u;
255  typedef unsigned short xk16u;
256  typedef unsigned int xk32u;
257  typedef unsigned long long xk64u;
258  typedef signed char xk8s;
259  typedef signed short xk16s;
260  typedef signed int xk32s;
261  typedef signed long long xk64s;
262  typedef float xk32f;
263  typedef double xk64f;
264  typedef char xkChar;
265  typedef unsigned char xkByte;
266 
267 # define xk64U(CONSTANT) (CONSTANT##LLU)
268 # define xk64S(CONSTANT) (CONSTANT##LL)
269 
270 #else
271 
272 # define xkCall
273 # define xkDlCall
274 
275 # define kExportFx(TYPE) kExtern TYPE kCall
276 # define kImportFx(TYPE) kExtern TYPE kCall
277 
278 # define kExportCx(TYPE) kExtern TYPE kDlCall
279 # define kImportCx(TYPE) kExtern TYPE kDlCall
280 
281 # define kInFx(TYPE) kExtern TYPE kCall
282 # define kInCx(TYPE) kExtern TYPE kCall
283 
284 # define kExportDx(TYPE) TYPE
285 # define kImportDx(TYPE) TYPE
286 
287 # define kInDx(TYPE) TYPE
288 
289 # define kExportClass
290 # define kImportClass
291 
292 # define kInline inline
293 
294  typedef unsigned char xk8u;
295  typedef unsigned short xk16u;
296  typedef unsigned int xk32u;
297  typedef unsigned long long xk64u;
298  typedef signed char xk8s;
299  typedef signed short xk16s;
300  typedef signed int xk32s;
301  typedef signed long long xk64s;
302  typedef float xk32f;
303  typedef double xk64f;
304  typedef char xkChar;
305  typedef unsigned char xkByte;
306 
307 # define xk64U(CONSTANT) (CONSTANT##LLU)
308 # define xk64S(CONSTANT) (CONSTANT##LL)
309 
310 #endif
311 
312 #define xkInlineFx(TYPE) static kInline TYPE kCall
313 
314 #if (K_POINTER_SIZE == 4)
315 
316 typedef xk32u xkSize;
317 # define xkSIZE_MAX k32U_MAX
318 
319 typedef xk32s xkSSize;
320 # define xkSSIZE_MIN k32S_MIN
321 # define xkSSIZE_MAX k32S_MAX
322 
323 #elif (K_POINTER_SIZE == 8)
324 
325 typedef xk64u xkSize;
326 # define xkSIZE_MAX k64U_MAX
327 
328 typedef xk64s xkSSize;
329 # define xkSSIZE_MIN k64S_MIN
330 # define xkSSIZE_MAX k64S_MAX
331 
332 #endif
333 
334 #define kALIGN_ANY (kMEMORY_ALIGNMENT_8)
335 #define kALIGN_ANY_SIZE (1 << kALIGN_ANY)
336 
337 #define kVarArgList va_list
338 
339 #if defined(K_MSVC) || defined(K_TI_CCS)
340 # define kVarArgList_Start(ARG_PTR, PREV_PARAM) va_start(ARG_PTR, PREV_PARAM)
341 # define kVarArgList_End(ARG_PTR) va_end(ARG_PTR)
342 # define kVarArgList_Copy(ARG_PTR, SOURCE) ((ARG_PTR) = (SOURCE))
343 # define kVarArgList_Next(ARG_PTR, TYPE) va_arg(ARG_PTR, TYPE)
344 #else
345 # define kVarArgList_Start(ARG_PTR, PREV_PARAM) va_start(ARG_PTR, PREV_PARAM)
346 # define kVarArgList_End(ARG_PTR) va_end(ARG_PTR)
347 # define kVarArgList_Copy(ARG_PTR, SOURCE) va_copy(ARG_PTR, SOURCE)
348 # define kVarArgList_Next(ARG_PTR, TYPE) va_arg(ARG_PTR, TYPE)
349 #endif
350 
351 
352 /* Deprecation support. */
353 #if !defined(K_NO_DEPRECATION)
354 # if defined(K_MSVC)
355 # define xkDeprecate(SYMBOL) __pragma(deprecated(SYMBOL))
356 # else
357 # define xkDeprecate(SYMBOL)
358 # endif
359 #else
360 # define xkDeprecate(SYMBOL)
361 #endif
362 
363 /* Warning support. */
364 #if defined(K_MSVC)
365 
366 # define xkWarn(MESSAGE) __pragma(message(__FILE__ "(" xkStringizeDefine(__LINE__) "): warning: " MESSAGE))
367 
368 #elif defined(K_GCC)
369 
370 # define xkWarnHelper(x) _Pragma (#x)
371 # define xkWarn(MESSAGE) xkWarnHelper(GCC warning MESSAGE)
372 
373 #else
374 
375 # define xkWarn(MESSAGE)
376 
377 #endif
378 
379 /* Software breakpoint support. */
380 #if defined(K_DEBUG) && defined(K_MSVC)
381 # define xkDebugBreak() __debugbreak()
382 #else
383 # define xkDebugBreak()
384 #endif
385 
386 #if defined (K_CPP)
387 # define kBeginCHeader() extern "C" {
388 # define kEndCHeader() }
389 #else
390 # define kBeginCHeader()
391 # define kEndCHeader()
392 #endif
393 
394 
395 /*
396  * Some source files require platform library headers to be included. And, at least
397  * for Windows, there can sometimes exist complicated rules about the particular order
398  * in which headers have to be included. The K_PLATFORM symbol helps to deal with
399  * these issues.
400  *
401  * Any kApi source file that requires platform headers should have #define K_PLATFORM as the
402  * first line in the source file. This ensures that the most common platform headers are
403  * included here, in the correct order.
404  */
405 #if defined(K_PLATFORM)
406 
407 /*
408  * Common for all platforms.
409  */
410 # include <assert.h>
411 
412 /*
413  * Platform specific includes.
414  */
415 # if defined(K_WINDOWS)
416 # include <winsock2.h>
417 # include <mswsock.h>
418 # include <ws2tcpip.h>
419 # include <iphlpapi.h>
420 # include <windows.h>
421 # include <process.h>
422 # endif
423 # if defined(K_TI_BIOS)
424 # include <xdc/std.h>
425 # include <xdc/runtime/Types.h>
426 # include <xdc/runtime/Error.h>
427 # include <ti/sysbios/BIOS.h>
428 # include <ti/sysbios/knl/Clock.h>
429 # include <ti/sysbios/knl/Semaphore.h>
430 # include <ti/sysbios/knl/Task.h>
431  kBeginCHeader()
432 # include <netmain.h>
433 # include <nettools/nettools.h>
434 # include <nettools/inc/inet.h>
435  kEndCHeader()
436 # endif
437 # if defined(K_VX_KERNEL)
438 # if defined(K_DEBUG)
439 # pragma GCC optimize ("O2")
440 # include <errno.h> /* work-around for error "ldarm: error in obj.o (.eh_frame); no .eh_frame_hdr table will be created." */
441 # pragma GCC reset_options
442 # endif
443 # include <vxWorks.h>
444 # include <sysLib.h>
445 # include <kernelLib.h>
446 # include <loadLib.h>
447 # include <intLib.h>
448 # include <symLib.h>
449 # include <sysSymTbl.h>
450 # include <taskLib.h>
451 # include <inline/semLibInline.h>
452 # include <unldLib.h>
453 # include <stdioLib.h>
454 # include <strLib.h>
455 # include <sockLib.h>
456 # include <inetLib.h>
457 # include <ioLib.h>
458 # include <fioLib.h>
459 # include <selectLib.h>
460 # include <netinet/in.h>
461 # include <netinet/tcp.h>
462 # include <wrapper/wrapperHostLib.h>
463 # include <netdb.h>
464 # include <sys/socket.h>
465 # include <net/if.h>
466 # include <net/if_ll.h>
467 # include <net/ifaddrs.h>
468 # include <net/ethernet.h>
469 # include <ipnet/ipioctl.h>
470 # include <ipcom_sock.h>
471 # include <ipcom_netlink.h>
472 # endif
473 # if defined(K_POSIX)
474 # include <errno.h>
475 # include <unistd.h>
476 # include <pthread.h>
477 # include <semaphore.h>
478 # include <sys/types.h>
479 # include <sys/stat.h>
480 # if defined(K_QNX)
481 # include <fcntl.h>
482 # else
483 # include <sys/fcntl.h>
484 # endif
485 # include <sys/socket.h>
486 # include <sys/select.h>
487 # include <sys/syscall.h>
488 # include <sys/ioctl.h>
489 # include <sys/resource.h>
490 # include <sys/time.h>
491 # include <sys/timeb.h>
492 # include <netinet/in.h>
493 # include <netinet/tcp.h>
494 # include <dlfcn.h>
495 # include <dirent.h>
496 # include <net/if.h>
497 # include <ifaddrs.h> /* not technically posix, but seemingly supported everywhere that matters */
498 # include <netdb.h>
499 
500 # endif
501 # if defined(K_DARWIN)
502 # include <mach-o/dyld.h>
503 # endif
504 # if defined (K_LINUX)
505 # include <signal.h>
506 # include <sys/prctl.h>
507 # include <sys/wait.h>
508 # include <linux/sockios.h>
509 # include <linux/ethtool.h>
510 # include <linux/netlink.h>
511 # include <linux/rtnetlink.h>
512 # endif
513 #endif
514 
515 #if defined(K_VX_KERNEL)
516  typedef xk32s xkAtomic32s;
517  typedef xkSSize xkAtomicPointer;
518 #else
519  typedef volatile xk32s xkAtomic32s;
520  typedef void* volatile xkAtomicPointer;
521 #endif
522 
523 #if defined(K_PLATFORM)
524 # if defined(K_WINDOWS)
525 # define kOS_INFINITE INFINITE
526  typedef DWORD xkThreadId;
527 # elif defined(K_TI_BIOS)
528 # define kOS_INFINITE ti_sysbios_BIOS_WAIT_FOREVER
529  typedef ti_sysbios_knl_Task_Handle xkThreadId;
530 # elif defined(K_VX_KERNEL)
531 # define kOS_INFINITE WAIT_FOREVER
532  typedef TASK_ID xkThreadId;
533 # elif defined(K_POSIX)
534 # define kOS_INFINITE 0 /* no special "infinite" value */
535  typedef pthread_t xkThreadId;
536 # endif
537 #endif
538 
539 #if defined(K_VX_KERNEL)
540 # if defined(K_MAIN_DYNAMIC)
541 # undef kMain
542 # define kMain kMain_Dynamic
543 # else
544 # undef kMain
545 # define kMain kMain
546 # endif
547 # define kMAIN_DYNAMIC "kMain_Dynamic"
548 #else
549 # define kMAIN_DYNAMIC "kMain"
550 #endif
551 
552 
553 /*
554 * Deprecated (Stage 1): not recommended for further use, but not yet announced via kDeprecate
555 */
556 
557 #if defined (K_CPP)
558 
559  //[Deprecated] No longer required; provided that any C functions are properly annotated.
560  //Use kBeginCHeader/kEndCHeader to include a C header from C++ if the header was not designed to support C++.
561 # define kBeginHeader() extern "C" {
562 
563  //[Deprecated] No longer required; provided that any C functions are properly annotated.
564  //Use kBeginCHeader/kEndCHeader to include a C header from C++ if the header was not designed to support C++.
565 # define kEndHeader() }
566 
567 #else
568 
569  //[Deprecated] No longer required; provided that any C functions are properly annotated.
570  //Use kBeginCHeader/kEndCHeader to include a C header from C++ if the header was not designed to support C++.
571 # define kBeginHeader()
572 
573  //[Deprecated] No longer required; provided that any C functions are properly annotated.
574  //Use kBeginCHeader/kEndCHeader to include a C header from C++ if the header was not designed to support C++.
575 # define kEndHeader()
576 
577 #endif
578 
579 #endif