xref: /oneTBB/src/tbb/tools_api/ittnotify_config.h (revision 706ad867)
1 /*
2     Copyright (c) 2005-2023 Intel Corporation
3 
4     Licensed under the Apache License, Version 2.0 (the "License");
5     you may not use this file except in compliance with the License.
6     You may obtain a copy of the License at
7 
8         http://www.apache.org/licenses/LICENSE-2.0
9 
10     Unless required by applicable law or agreed to in writing, software
11     distributed under the License is distributed on an "AS IS" BASIS,
12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13     See the License for the specific language governing permissions and
14     limitations under the License.
15 */
16 
17 #ifndef _ITTNOTIFY_CONFIG_H_
18 #define _ITTNOTIFY_CONFIG_H_
19 
20 /** @cond exclude_from_documentation */
21 #ifndef ITT_OS_WIN
22 #  define ITT_OS_WIN   1
23 #endif /* ITT_OS_WIN */
24 
25 #ifndef ITT_OS_LINUX
26 #  define ITT_OS_LINUX 2
27 #endif /* ITT_OS_LINUX */
28 
29 #ifndef ITT_OS_MAC
30 #  define ITT_OS_MAC   3
31 #endif /* ITT_OS_MAC */
32 
33 #ifndef ITT_OS_FREEBSD
34 #  define ITT_OS_FREEBSD   4
35 #endif /* ITT_OS_FREEBSD */
36 
37 #ifndef ITT_OS
38 #  if defined WIN32 || defined _WIN32
39 #    define ITT_OS ITT_OS_WIN
40 #  elif defined( __APPLE__ ) && defined( __MACH__ )
41 #    define ITT_OS ITT_OS_MAC
42 #  elif defined( __FreeBSD__ )
43 #    define ITT_OS ITT_OS_FREEBSD
44 #  else
45 #    define ITT_OS ITT_OS_LINUX
46 #  endif
47 #endif /* ITT_OS */
48 
49 #ifndef ITT_PLATFORM_WIN
50 #  define ITT_PLATFORM_WIN 1
51 #endif /* ITT_PLATFORM_WIN */
52 
53 #ifndef ITT_PLATFORM_POSIX
54 #  define ITT_PLATFORM_POSIX 2
55 #endif /* ITT_PLATFORM_POSIX */
56 
57 #ifndef ITT_PLATFORM_MAC
58 #  define ITT_PLATFORM_MAC 3
59 #endif /* ITT_PLATFORM_MAC */
60 
61 #ifndef ITT_PLATFORM_FREEBSD
62 #  define ITT_PLATFORM_FREEBSD 4
63 #endif /* ITT_PLATFORM_FREEBSD */
64 
65 #ifndef ITT_PLATFORM
66 #  if ITT_OS==ITT_OS_WIN
67 #    define ITT_PLATFORM ITT_PLATFORM_WIN
68 #  elif ITT_OS==ITT_OS_MAC
69 #    define ITT_PLATFORM ITT_PLATFORM_MAC
70 #  elif ITT_OS==ITT_OS_FREEBSD
71 #    define ITT_PLATFORM ITT_PLATFORM_FREEBSD
72 #  else
73 #    define ITT_PLATFORM ITT_PLATFORM_POSIX
74 #  endif
75 #endif /* ITT_PLATFORM */
76 
77 #if defined(_UNICODE) && !defined(UNICODE)
78 #define UNICODE
79 #endif
80 
81 #include <stddef.h>
82 #if ITT_PLATFORM==ITT_PLATFORM_WIN
83 #include <tchar.h>
84 #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
85 #include <stdint.h>
86 #if defined(UNICODE) || defined(_UNICODE)
87 #include <wchar.h>
88 #endif /* UNICODE || _UNICODE */
89 #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
90 
91 #ifndef ITTAPI_CDECL
92 #  if ITT_PLATFORM==ITT_PLATFORM_WIN
93 #    define ITTAPI_CDECL __cdecl
94 #  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
95 #    if defined _M_IX86 || defined __i386__
96 #      define ITTAPI_CDECL __attribute__ ((cdecl))
97 #    else  /* _M_IX86 || __i386__ */
98 #      define ITTAPI_CDECL /* actual only on x86 platform */
99 #    endif /* _M_IX86 || __i386__ */
100 #  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
101 #endif /* ITTAPI_CDECL */
102 
103 #ifndef STDCALL
104 #  if ITT_PLATFORM==ITT_PLATFORM_WIN
105 #    define STDCALL __stdcall
106 #  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
107 #    if defined _M_IX86 || defined __i386__
108 #      define STDCALL __attribute__ ((stdcall))
109 #    else  /* _M_IX86 || __i386__ */
110 #      define STDCALL /* supported only on x86 platform */
111 #    endif /* _M_IX86 || __i386__ */
112 #  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
113 #endif /* STDCALL */
114 
115 #define ITTAPI    ITTAPI_CDECL
116 #define LIBITTAPI ITTAPI_CDECL
117 
118 /* TODO: Temporary for compatibility! */
119 #define ITTAPI_CALL    ITTAPI_CDECL
120 #define LIBITTAPI_CALL ITTAPI_CDECL
121 
122 #if ITT_PLATFORM==ITT_PLATFORM_WIN
123 /* use __forceinline (VC++ specific) */
124 #if defined(__MINGW32__) && !defined(__cplusplus)
125 #define ITT_INLINE           static __inline__ __attribute__((__always_inline__,__gnu_inline__))
126 #else
127 #define ITT_INLINE           static __forceinline
128 #endif /* __MINGW32__ */
129 
130 #define ITT_INLINE_ATTRIBUTE /* nothing */
131 #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
132 /*
133  * Generally, functions are not inlined unless optimization is specified.
134  * For functions declared inline, this attribute inlines the function even
135  * if no optimization level was specified.
136  */
137 #ifdef __STRICT_ANSI__
138 #define ITT_INLINE           static
139 #define ITT_INLINE_ATTRIBUTE __attribute__((unused))
140 #else  /* __STRICT_ANSI__ */
141 #define ITT_INLINE           static inline
142 #define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused))
143 #endif /* __STRICT_ANSI__ */
144 #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
145 /** @endcond */
146 
147 #ifndef ITT_ARCH_IA32
148 #  define ITT_ARCH_IA32  1
149 #endif /* ITT_ARCH_IA32 */
150 
151 #ifndef ITT_ARCH_IA32E
152 #  define ITT_ARCH_IA32E 2
153 #endif /* ITT_ARCH_IA32E */
154 
155 #ifndef ITT_ARCH_IA64
156 #  define ITT_ARCH_IA64 3
157 #endif /* ITT_ARCH_IA64 */
158 
159 #ifndef ITT_ARCH_ARM
160 #  define ITT_ARCH_ARM  4
161 #endif /* ITT_ARCH_ARM */
162 
163 #ifndef ITT_ARCH_PPC64
164 #  define ITT_ARCH_PPC64  5
165 #endif /* ITT_ARCH_PPC64 */
166 
167 #ifndef ITT_ARCH_ARM64
168 #  define ITT_ARCH_ARM64  6
169 #endif /* ITT_ARCH_ARM64 */
170 
171 #ifndef ITT_ARCH_LOONGARCH64
172 #  define ITT_ARCH_LOONGARCH64  7
173 #endif /* ITT_ARCH_LOONGARCH64 */
174 
175 #ifndef ITT_ARCH_S390X
176 #  define ITT_ARCH_S390X  8
177 #endif /* ITT_ARCH_S390X */
178 
179 #ifndef ITT_ARCH_HPPA
180 #  define ITT_ARCH_HPPA  9
181 #endif /* ITT_ARCH_HPPA */
182 
183 #ifndef ITT_ARCH_RISCV64
184 #  define ITT_ARCH_RISCV64  10
185 #endif /* ITT_ARCH_RISCV64 */
186 
187 #ifndef ITT_ARCH
188 #  if defined _M_IX86 || defined __i386__
189 #    define ITT_ARCH ITT_ARCH_IA32
190 #  elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__
191 #    define ITT_ARCH ITT_ARCH_IA32E
192 #  elif defined _M_IA64 || defined __ia64__
193 #    define ITT_ARCH ITT_ARCH_IA64
194 #  elif defined _M_ARM || defined __arm__
195 #    define ITT_ARCH ITT_ARCH_ARM
196 #  elif defined __aarch64__
197 #    define ITT_ARCH ITT_ARCH_ARM64
198 #  elif defined __powerpc64__
199 #    define ITT_ARCH ITT_ARCH_PPC64
200 #  elif defined __loongarch__
201 #    define ITT_ARCH ITT_ARCH_LOONGARCH64
202 #  elif defined __s390__ || defined __s390x__
203 #    define ITT_ARCH ITT_ARCH_S390X
204 #  elif defined __hppa__
205 #    define ITT_ARCH ITT_ARCH_HPPA
206 #  elif defined __riscv && __riscv_xlen == 64
207 #    define ITT_ARCH ITT_ARCH_RISCV64
208 #  endif
209 
210 #endif
211 
212 #ifdef __cplusplus
213 #  define ITT_EXTERN_C extern "C"
214 #  define ITT_EXTERN_C_BEGIN extern "C" {
215 #  define ITT_EXTERN_C_END }
216 #else
217 #  define ITT_EXTERN_C /* nothing */
218 #  define ITT_EXTERN_C_BEGIN /* nothing */
219 #  define ITT_EXTERN_C_END /* nothing */
220 #endif /* __cplusplus */
221 
222 #define ITT_TO_STR_AUX(x) #x
223 #define ITT_TO_STR(x)     ITT_TO_STR_AUX(x)
224 
225 #define __ITT_BUILD_ASSERT(expr, suffix) do { \
226     static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \
227     __itt_build_check_##suffix[0] = 0; \
228 } while(0)
229 #define _ITT_BUILD_ASSERT(expr, suffix)  __ITT_BUILD_ASSERT((expr), suffix)
230 #define ITT_BUILD_ASSERT(expr)           _ITT_BUILD_ASSERT((expr), __LINE__)
231 
232 #define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }
233 
234 /* Replace with snapshot date YYYYMMDD for promotion build. */
235 #define API_VERSION_BUILD    20230630
236 
237 #ifndef API_VERSION_NUM
238 #define API_VERSION_NUM 3.24.2
239 #endif /* API_VERSION_NUM */
240 
241 #define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \
242                                 " (" ITT_TO_STR(API_VERSION_BUILD) ")"
243 
244 /* OS communication functions */
245 #if ITT_PLATFORM==ITT_PLATFORM_WIN
246 #include <windows.h>
247 typedef HMODULE           lib_t;
248 typedef DWORD             TIDT;
249 typedef CRITICAL_SECTION  mutex_t;
250 #ifdef __cplusplus
251 #define MUTEX_INITIALIZER {}
252 #else
253 #define MUTEX_INITIALIZER { 0 }
254 #endif
255 #define strong_alias(name, aliasname) /* empty for Windows */
256 #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
257 #include <dlfcn.h>
258 #if defined(UNICODE) || defined(_UNICODE)
259 #include <wchar.h>
260 #endif /* UNICODE */
261 #ifndef _GNU_SOURCE
262 #define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
263 #endif /* _GNU_SOURCE */
264 #ifndef __USE_UNIX98
265 #define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */
266 #endif /*__USE_UNIX98*/
267 #include <pthread.h>
268 typedef void*             lib_t;
269 typedef pthread_t         TIDT;
270 typedef pthread_mutex_t   mutex_t;
271 #define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
272 #define _strong_alias(name, aliasname) \
273             extern __typeof (name) aliasname __attribute__ ((alias (#name)));
274 #define strong_alias(name, aliasname) _strong_alias(name, aliasname)
275 #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
276 
277 #if ITT_PLATFORM==ITT_PLATFORM_WIN
278 #define __itt_get_proc(lib, name) GetProcAddress(lib, name)
279 #define __itt_mutex_init(mutex)   InitializeCriticalSection(mutex)
280 #define __itt_mutex_lock(mutex)   EnterCriticalSection(mutex)
281 #define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
282 #define __itt_mutex_destroy(mutex) DeleteCriticalSection(mutex)
283 #define __itt_load_lib(name)      LoadLibraryA(name)
284 #define __itt_unload_lib(handle)  FreeLibrary(handle)
285 #define __itt_system_error()      (int)GetLastError()
286 #define __itt_fstrcmp(s1, s2)     lstrcmpA(s1, s2)
287 #define __itt_fstrnlen(s, l)      strnlen_s(s, l)
288 #define __itt_fstrcpyn(s1, b, s2, l) strncpy_s(s1, b, s2, l)
289 #define __itt_thread_id()         GetCurrentThreadId()
290 #define __itt_thread_yield()      SwitchToThread()
291 #ifndef ITT_SIMPLE_INIT
292 ITT_INLINE long
293 __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
__itt_interlocked_increment(volatile long * ptr)294 ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
295 {
296     return InterlockedIncrement(ptr);
297 }
298 ITT_INLINE long
299 __itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) ITT_INLINE_ATTRIBUTE;
300 ITT_INLINE long
__itt_interlocked_compare_exchange(volatile long * ptr,long exchange,long comperand)301 __itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand)
302 {
303     return InterlockedCompareExchange(ptr, exchange, comperand);
304 }
305 #endif /* ITT_SIMPLE_INIT */
306 
307 #define DL_SYMBOLS (1)
308 #define PTHREAD_SYMBOLS (1)
309 
310 #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
311 #define __itt_get_proc(lib, name) dlsym(lib, name)
312 #define __itt_mutex_init(mutex)   {\
313     pthread_mutexattr_t mutex_attr;                                         \
314     int error_code = pthread_mutexattr_init(&mutex_attr);                   \
315     if (error_code)                                                         \
316         __itt_report_error(__itt_error_system, "pthread_mutexattr_init",    \
317                            error_code);                                     \
318     error_code = pthread_mutexattr_settype(&mutex_attr,                     \
319                                            PTHREAD_MUTEX_RECURSIVE);        \
320     if (error_code)                                                         \
321         __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \
322                            error_code);                                     \
323     error_code = pthread_mutex_init(mutex, &mutex_attr);                    \
324     if (error_code)                                                         \
325         __itt_report_error(__itt_error_system, "pthread_mutex_init",        \
326                            error_code);                                     \
327     error_code = pthread_mutexattr_destroy(&mutex_attr);                    \
328     if (error_code)                                                         \
329         __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \
330                            error_code);                                     \
331 }
332 #define __itt_mutex_lock(mutex)   pthread_mutex_lock(mutex)
333 #define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
334 #define __itt_mutex_destroy(mutex) pthread_mutex_destroy(mutex)
335 #define __itt_load_lib(name)      dlopen(name, RTLD_LAZY)
336 #define __itt_unload_lib(handle)  dlclose(handle)
337 #define __itt_system_error()      errno
338 #define __itt_fstrcmp(s1, s2)     strcmp(s1, s2)
339 
340 /* makes customer code define safe APIs for SDL_STRNLEN_S and SDL_STRNCPY_S */
341 #ifdef SDL_STRNLEN_S
342 #define __itt_fstrnlen(s, l)      SDL_STRNLEN_S(s, l)
343 #else
344 #define __itt_fstrnlen(s, l)      strlen(s)
345 #endif /* SDL_STRNLEN_S */
346 #ifdef SDL_STRNCPY_S
347 #define __itt_fstrcpyn(s1, b, s2, l) SDL_STRNCPY_S(s1, b, s2, l)
348 #else
349 #define __itt_fstrcpyn(s1, b, s2, l) {                                      \
350     if (b > 0) {                                                            \
351         /* 'volatile' is used to suppress the warning that a destination */ \
352         /*  bound depends on the length of the source.                   */ \
353         volatile size_t num_to_copy = (size_t)(b - 1) < (size_t)(l) ?       \
354                 (size_t)(b - 1) : (size_t)(l);                              \
355         strncpy(s1, s2, num_to_copy);                                       \
356         s1[num_to_copy] = 0;                                                \
357     }                                                                       \
358 }
359 #endif /* SDL_STRNCPY_S */
360 
361 #define __itt_thread_id()         pthread_self()
362 #define __itt_thread_yield()      sched_yield()
363 #if ITT_ARCH==ITT_ARCH_IA64
364 #ifdef __INTEL_COMPILER
365 #define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
366 #else  /* __INTEL_COMPILER */
367 #define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
368 #endif /* __INTEL_COMPILER */
369 #elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */
370 ITT_INLINE long
371 __TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;
__TBB_machine_fetchadd4(volatile void * ptr,long addend)372 ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)
373 {
374     long result;
375     __asm__ __volatile__("lock\nxadd %0,%1"
376                           : "=r"(result),"=m"(*(volatile int*)ptr)
377                           : "0"(addend), "m"(*(volatile int*)ptr)
378                           : "memory");
379     return result;
380 }
381 #else
382 #define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
383 #endif /* ITT_ARCH==ITT_ARCH_IA64 */
384 #ifndef ITT_SIMPLE_INIT
385 ITT_INLINE long
386 __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
__itt_interlocked_increment(volatile long * ptr)387 ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
388 {
389     return __TBB_machine_fetchadd4(ptr, 1) + 1L;
390 }
391 ITT_INLINE long
392 __itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) ITT_INLINE_ATTRIBUTE;
393 ITT_INLINE long
__itt_interlocked_compare_exchange(volatile long * ptr,long exchange,long comperand)394 __itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand)
395 {
396     return __sync_val_compare_and_swap(ptr, exchange, comperand);
397 }
398 #endif /* ITT_SIMPLE_INIT */
399 
400 void* dlopen(const char*, int) __attribute__((weak));
401 void* dlsym(void*, const char*) __attribute__((weak));
402 int dlclose(void*) __attribute__((weak));
403 #define DL_SYMBOLS (dlopen && dlsym && dlclose)
404 
405 int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*) __attribute__((weak));
406 int pthread_mutex_lock(pthread_mutex_t*) __attribute__((weak));
407 int pthread_mutex_unlock(pthread_mutex_t*) __attribute__((weak));
408 int pthread_mutex_destroy(pthread_mutex_t*) __attribute__((weak));
409 int pthread_mutexattr_init(pthread_mutexattr_t*) __attribute__((weak));
410 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) __attribute__((weak));
411 int pthread_mutexattr_destroy(pthread_mutexattr_t*) __attribute__((weak));
412 pthread_t pthread_self(void) __attribute__((weak));
413 #define PTHREAD_SYMBOLS (pthread_mutex_init && pthread_mutex_lock && pthread_mutex_unlock && pthread_mutex_destroy && pthread_mutexattr_init && pthread_mutexattr_settype && pthread_mutexattr_destroy && pthread_self)
414 
415 #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
416 
417 /* strdup() is not included into C99 which results in a compiler warning about
418  * implicitly declared symbol. To avoid the issue strdup is implemented
419  * manually.
420  */
421 #define ITT_STRDUP_MAX_STRING_SIZE 4096
422 #define __itt_fstrdup(s, new_s) do {                                        \
423     if (s != NULL) {                                                        \
424         size_t s_len = __itt_fstrnlen(s, ITT_STRDUP_MAX_STRING_SIZE);       \
425         new_s = (char *)malloc(s_len + 1);                                  \
426         if (new_s != NULL) {                                                \
427             __itt_fstrcpyn(new_s, s_len + 1, s, s_len);                     \
428         }                                                                   \
429     }                                                                       \
430 } while(0)
431 
432 typedef enum {
433     __itt_thread_normal  = 0,
434     __itt_thread_ignored = 1
435 } __itt_thread_state;
436 
437 #pragma pack(push, 8)
438 
439 typedef struct ___itt_thread_info
440 {
441     const char* nameA; /*!< Copy of original name in ASCII. */
442 #if defined(UNICODE) || defined(_UNICODE)
443     const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
444 #else  /* UNICODE || _UNICODE */
445     void* nameW;
446 #endif /* UNICODE || _UNICODE */
447     TIDT               tid;
448     __itt_thread_state state;   /*!< Thread state (paused or normal) */
449     int                extra1;  /*!< Reserved to the runtime */
450     void*              extra2;  /*!< Reserved to the runtime */
451     struct ___itt_thread_info* next;
452 } __itt_thread_info;
453 
454 #include "ittnotify_types.h" /* For __itt_group_id definition */
455 
456 typedef struct ___itt_api_info_20101001
457 {
458     const char*    name;
459     void**         func_ptr;
460     void*          init_func;
461     __itt_group_id group;
462 }  __itt_api_info_20101001;
463 
464 typedef struct ___itt_api_info
465 {
466     const char*    name;
467     void**         func_ptr;
468     void*          init_func;
469     void*          null_func;
470     __itt_group_id group;
471 }  __itt_api_info;
472 
473 typedef struct __itt_counter_info
474 {
475     const char* nameA;  /*!< Copy of original name in ASCII. */
476 #if defined(UNICODE) || defined(_UNICODE)
477     const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
478 #else  /* UNICODE || _UNICODE */
479     void* nameW;
480 #endif /* UNICODE || _UNICODE */
481     const char* domainA;  /*!< Copy of original name in ASCII. */
482 #if defined(UNICODE) || defined(_UNICODE)
483     const wchar_t* domainW; /*!< Copy of original name in UNICODE. */
484 #else  /* UNICODE || _UNICODE */
485     void* domainW;
486 #endif /* UNICODE || _UNICODE */
487     int type;
488     long index;
489     int   extra1; /*!< Reserved to the runtime */
490     void* extra2; /*!< Reserved to the runtime */
491     struct __itt_counter_info* next;
492 }  __itt_counter_info_t;
493 
494 struct ___itt_domain;
495 struct ___itt_string_handle;
496 struct ___itt_histogram;
497 struct ___itt_counter_metadata;
498 
499 #include "ittnotify.h"
500 
501 typedef struct ___itt_global
502 {
503     unsigned char          magic[8];
504     unsigned long          version_major;
505     unsigned long          version_minor;
506     unsigned long          version_build;
507     volatile long          api_initialized;
508     volatile long          mutex_initialized;
509     volatile long          atomic_counter;
510     mutex_t                mutex;
511     lib_t                  lib;
512     void*                  error_handler;
513     const char**           dll_path_ptr;
514     __itt_api_info*        api_list_ptr;
515     struct ___itt_global*  next;
516     /* Joinable structures below */
517     __itt_thread_info*     thread_list;
518     struct ___itt_domain*  domain_list;
519     struct ___itt_string_handle* string_list;
520     __itt_collection_state state;
521     __itt_counter_info_t*  counter_list;
522     unsigned int           ipt_collect_events;
523     struct ___itt_histogram* histogram_list;
524     struct ___itt_counter_metadata* counter_metadata_list;
525 } __itt_global;
526 
527 #pragma pack(pop)
528 
529 #define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \
530     h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
531     if (h != NULL) { \
532         h->tid    = t; \
533         h->nameA  = NULL; \
534         h->nameW  = n ? _wcsdup(n) : NULL; \
535         h->state  = s; \
536         h->extra1 = 0;    /* reserved */ \
537         h->extra2 = NULL; /* reserved */ \
538         h->next   = NULL; \
539         if (h_tail == NULL) \
540             (gptr)->thread_list = h; \
541         else \
542             h_tail->next = h; \
543     } \
544 }
545 
546 #define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \
547     h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
548     if (h != NULL) { \
549         h->tid    = t; \
550         char *n_copy = NULL; \
551         __itt_fstrdup(n, n_copy); \
552         h->nameA  = n_copy; \
553         h->nameW  = NULL; \
554         h->state  = s; \
555         h->extra1 = 0;    /* reserved */ \
556         h->extra2 = NULL; /* reserved */ \
557         h->next   = NULL; \
558         if (h_tail == NULL) \
559             (gptr)->thread_list = h; \
560         else \
561             h_tail->next = h; \
562     } \
563 }
564 
565 #define NEW_DOMAIN_W(gptr,h,h_tail,name) { \
566     h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
567     if (h != NULL) { \
568         h->flags  = 1;    /* domain is enabled by default */ \
569         h->nameA  = NULL; \
570         h->nameW  = name ? _wcsdup(name) : NULL; \
571         h->extra1 = 0;    /* reserved */ \
572         h->extra2 = NULL; /* reserved */ \
573         h->next   = NULL; \
574         if (h_tail == NULL) \
575             (gptr)->domain_list = h; \
576         else \
577             h_tail->next = h; \
578     } \
579 }
580 
581 #define NEW_DOMAIN_A(gptr,h,h_tail,name) { \
582     h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
583     if (h != NULL) { \
584         h->flags  = 1;    /* domain is enabled by default */ \
585         char *name_copy = NULL; \
586         __itt_fstrdup(name, name_copy); \
587         h->nameA  = name_copy; \
588         h->nameW  = NULL; \
589         h->extra1 = 0;    /* reserved */ \
590         h->extra2 = NULL; /* reserved */ \
591         h->next   = NULL; \
592         if (h_tail == NULL) \
593             (gptr)->domain_list = h; \
594         else \
595             h_tail->next = h; \
596     } \
597 }
598 
599 #define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \
600     h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
601     if (h != NULL) { \
602         h->strA   = NULL; \
603         h->strW   = name ? _wcsdup(name) : NULL; \
604         h->extra1 = 0;    /* reserved */ \
605         h->extra2 = NULL; /* reserved */ \
606         h->next   = NULL; \
607         if (h_tail == NULL) \
608             (gptr)->string_list = h; \
609         else \
610             h_tail->next = h; \
611     } \
612 }
613 
614 #define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \
615     h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
616     if (h != NULL) { \
617         char *name_copy = NULL; \
618         __itt_fstrdup(name, name_copy); \
619         h->strA  = name_copy; \
620         h->strW   = NULL; \
621         h->extra1 = 0;    /* reserved */ \
622         h->extra2 = NULL; /* reserved */ \
623         h->next   = NULL; \
624         if (h_tail == NULL) \
625             (gptr)->string_list = h; \
626         else \
627             h_tail->next = h; \
628     } \
629 }
630 
631 #define NEW_COUNTER_W(gptr,h,h_tail,name,domain,type) { \
632     h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \
633     if (h != NULL) { \
634         h->nameA   = NULL; \
635         h->nameW   = name ? _wcsdup(name) : NULL; \
636         h->domainA   = NULL; \
637         h->domainW   = name ? _wcsdup(domain) : NULL; \
638         h->type = type; \
639         h->index = 0; \
640         h->next   = NULL; \
641         if (h_tail == NULL) \
642             (gptr)->counter_list = h; \
643         else \
644             h_tail->next = h; \
645     } \
646 }
647 
648 #define NEW_COUNTER_A(gptr,h,h_tail,name,domain,type) { \
649     h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \
650     if (h != NULL) { \
651         char *name_copy = NULL; \
652         __itt_fstrdup(name, name_copy); \
653         h->nameA  = name_copy; \
654         h->nameW   = NULL; \
655         char *domain_copy = NULL; \
656         __itt_fstrdup(domain, domain_copy); \
657         h->domainA  = domain_copy; \
658         h->domainW   = NULL; \
659         h->type = type; \
660         h->index = 0; \
661         h->next   = NULL; \
662         if (h_tail == NULL) \
663             (gptr)->counter_list = h; \
664         else \
665             h_tail->next = h; \
666     } \
667 }
668 
669 #define NEW_HISTOGRAM_W(gptr,h,h_tail,domain,name,x_type,y_type) { \
670     h = (__itt_histogram*)malloc(sizeof(__itt_histogram)); \
671     if (h != NULL) { \
672         h->domain = domain; \
673         h->nameA  = NULL; \
674         h->nameW  = name ? _wcsdup(name) : NULL; \
675         h->x_type = x_type; \
676         h->y_type = y_type; \
677         h->extra1 = 0; \
678         h->extra2 = NULL; \
679 	h->next = NULL; \
680         if (h_tail == NULL) \
681             (gptr)->histogram_list = h; \
682         else \
683             h_tail->next = h; \
684     } \
685 }
686 
687 #define NEW_HISTOGRAM_A(gptr,h,h_tail,domain,name,x_type,y_type) { \
688     h = (__itt_histogram*)malloc(sizeof(__itt_histogram)); \
689     if (h != NULL) { \
690         h->domain = domain; \
691         char *name_copy = NULL; \
692         __itt_fstrdup(name, name_copy); \
693         h->nameA  = name_copy; \
694         h->nameW  = NULL; \
695         h->x_type = x_type; \
696         h->y_type = y_type; \
697         h->extra1 = 0; \
698         h->extra2 = NULL; \
699 	h->next = NULL; \
700         if (h_tail == NULL) \
701             (gptr)->histogram_list = h; \
702         else \
703             h_tail->next = h; \
704     } \
705 }
706 
707 #define NEW_COUNTER_METADATA_NUM(gptr,h,h_tail,counter,type,value) { \
708     h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \
709     if (h != NULL) { \
710         h->counter = counter; \
711         h->type = type; \
712         h->str_valueA = NULL; \
713         h->str_valueW = NULL; \
714         h->value = value; \
715         h->extra1 = 0; \
716         h->extra2 = NULL; \
717         h->next   = NULL; \
718         if (h_tail == NULL) \
719             (gptr)->counter_metadata_list = h; \
720         else \
721             h_tail->next = h; \
722     } \
723 }
724 
725 #define NEW_COUNTER_METADATA_STR_A(gptr,h,h_tail,counter,type,str_valueA) { \
726     h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \
727     if (h != NULL) { \
728         h->counter = counter; \
729         h->type = type; \
730         char *str_value_copy = NULL; \
731         __itt_fstrdup(str_valueA, str_value_copy); \
732         h->str_valueA = str_value_copy; \
733         h->str_valueW = NULL; \
734         h->value = 0; \
735         h->extra1 = 0; \
736         h->extra2 = NULL; \
737         h->next   = NULL; \
738         if (h_tail == NULL) \
739             (gptr)->counter_metadata_list = h; \
740         else \
741             h_tail->next = h; \
742     } \
743 }
744 
745 #define NEW_COUNTER_METADATA_STR_W(gptr,h,h_tail,counter,type,str_valueW) { \
746     h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \
747     if (h != NULL) { \
748         h->counter = counter; \
749         h->type = type; \
750         h->str_valueA = NULL; \
751         h->str_valueW = str_valueW ? _wcsdup(str_valueW) : NULL; \
752         h->value = 0; \
753         h->extra1 = 0; \
754         h->extra2 = NULL; \
755         h->next   = NULL; \
756         if (h_tail == NULL) \
757             (gptr)->counter_metadata_list = h; \
758         else \
759             h_tail->next = h; \
760     } \
761 }
762 
763 #endif /* _ITTNOTIFY_CONFIG_H_ */
764