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