xref: /freebsd/contrib/llvm-project/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric 
20b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric //
40b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric //
80b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric #ifndef _ITTNOTIFY_CONFIG_H_
110b57cec5SDimitry Andric #define _ITTNOTIFY_CONFIG_H_
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric /** @cond exclude_from_documentation */
140b57cec5SDimitry Andric #ifndef ITT_OS_WIN
150b57cec5SDimitry Andric #define ITT_OS_WIN 1
160b57cec5SDimitry Andric #endif /* ITT_OS_WIN */
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric #ifndef ITT_OS_LINUX
190b57cec5SDimitry Andric #define ITT_OS_LINUX 2
200b57cec5SDimitry Andric #endif /* ITT_OS_LINUX */
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #ifndef ITT_OS_MAC
230b57cec5SDimitry Andric #define ITT_OS_MAC 3
240b57cec5SDimitry Andric #endif /* ITT_OS_MAC */
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric #ifndef ITT_OS_FREEBSD
270b57cec5SDimitry Andric #define ITT_OS_FREEBSD 4
280b57cec5SDimitry Andric #endif /* ITT_OS_FREEBSD */
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric #ifndef ITT_OS
310b57cec5SDimitry Andric #if defined WIN32 || defined _WIN32
320b57cec5SDimitry Andric #define ITT_OS ITT_OS_WIN
330b57cec5SDimitry Andric #elif defined(__APPLE__) && defined(__MACH__)
340b57cec5SDimitry Andric #define ITT_OS ITT_OS_MAC
350b57cec5SDimitry Andric #elif defined(__FreeBSD__)
360b57cec5SDimitry Andric #define ITT_OS ITT_OS_FREEBSD
370b57cec5SDimitry Andric #else
380b57cec5SDimitry Andric #define ITT_OS ITT_OS_LINUX
390b57cec5SDimitry Andric #endif
400b57cec5SDimitry Andric #endif /* ITT_OS */
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric #ifndef ITT_PLATFORM_WIN
430b57cec5SDimitry Andric #define ITT_PLATFORM_WIN 1
440b57cec5SDimitry Andric #endif /* ITT_PLATFORM_WIN */
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric #ifndef ITT_PLATFORM_POSIX
470b57cec5SDimitry Andric #define ITT_PLATFORM_POSIX 2
480b57cec5SDimitry Andric #endif /* ITT_PLATFORM_POSIX */
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric #ifndef ITT_PLATFORM_MAC
510b57cec5SDimitry Andric #define ITT_PLATFORM_MAC 3
520b57cec5SDimitry Andric #endif /* ITT_PLATFORM_MAC */
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric #ifndef ITT_PLATFORM_FREEBSD
550b57cec5SDimitry Andric #define ITT_PLATFORM_FREEBSD 4
560b57cec5SDimitry Andric #endif /* ITT_PLATFORM_FREEBSD */
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric #ifndef ITT_PLATFORM
590b57cec5SDimitry Andric #if ITT_OS == ITT_OS_WIN
600b57cec5SDimitry Andric #define ITT_PLATFORM ITT_PLATFORM_WIN
610b57cec5SDimitry Andric #elif ITT_OS == ITT_OS_MAC
620b57cec5SDimitry Andric #define ITT_PLATFORM ITT_PLATFORM_MAC
630b57cec5SDimitry Andric #elif ITT_OS == ITT_OS_FREEBSD
640b57cec5SDimitry Andric #define ITT_PLATFORM ITT_PLATFORM_FREEBSD
650b57cec5SDimitry Andric #else
660b57cec5SDimitry Andric #define ITT_PLATFORM ITT_PLATFORM_POSIX
670b57cec5SDimitry Andric #endif
680b57cec5SDimitry Andric #endif /* ITT_PLATFORM */
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric #if defined(_UNICODE) && !defined(UNICODE)
710b57cec5SDimitry Andric #define UNICODE
720b57cec5SDimitry Andric #endif
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric #include <stddef.h>
750b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
760b57cec5SDimitry Andric #include <tchar.h>
770b57cec5SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
780b57cec5SDimitry Andric #include <stdint.h>
790b57cec5SDimitry Andric #if defined(UNICODE) || defined(_UNICODE)
800b57cec5SDimitry Andric #include <wchar.h>
810b57cec5SDimitry Andric #endif /* UNICODE || _UNICODE */
820b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric #ifndef ITTAPI_CDECL
850b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
860b57cec5SDimitry Andric #define ITTAPI_CDECL __cdecl
870b57cec5SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
880b57cec5SDimitry Andric #if defined _M_IX86 || defined __i386__
890b57cec5SDimitry Andric #define ITTAPI_CDECL __attribute__((cdecl))
900b57cec5SDimitry Andric #else /* _M_IX86 || __i386__ */
910b57cec5SDimitry Andric #define ITTAPI_CDECL /* actual only on x86 platform */
920b57cec5SDimitry Andric #endif /* _M_IX86 || __i386__ */
930b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
940b57cec5SDimitry Andric #endif /* ITTAPI_CDECL */
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric #ifndef STDCALL
970b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
980b57cec5SDimitry Andric #define STDCALL __stdcall
990b57cec5SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1000b57cec5SDimitry Andric #if defined _M_IX86 || defined __i386__
1010b57cec5SDimitry Andric #define STDCALL __attribute__((stdcall))
1020b57cec5SDimitry Andric #else /* _M_IX86 || __i386__ */
1030b57cec5SDimitry Andric #define STDCALL /* supported only on x86 platform */
1040b57cec5SDimitry Andric #endif /* _M_IX86 || __i386__ */
1050b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1060b57cec5SDimitry Andric #endif /* STDCALL */
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric #define ITTAPI ITTAPI_CDECL
1090b57cec5SDimitry Andric #define LIBITTAPI ITTAPI_CDECL
1100b57cec5SDimitry Andric 
1110b57cec5SDimitry Andric /* TODO: Temporary for compatibility! */
1120b57cec5SDimitry Andric #define ITTAPI_CALL ITTAPI_CDECL
1130b57cec5SDimitry Andric #define LIBITTAPI_CALL ITTAPI_CDECL
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
1160b57cec5SDimitry Andric /* use __forceinline (VC++ specific) */
117349cc55cSDimitry Andric #if defined(__MINGW32__) && !defined(__cplusplus)
118349cc55cSDimitry Andric #define ITT_INLINE                                                             \
119349cc55cSDimitry Andric   static __inline__ __attribute__((__always_inline__, __gnu_inline__))
120349cc55cSDimitry Andric #else
121349cc55cSDimitry Andric #define ITT_INLINE static __forceinline
122349cc55cSDimitry Andric #endif /* __MINGW32__ */
123349cc55cSDimitry Andric 
1240b57cec5SDimitry Andric #define ITT_INLINE_ATTRIBUTE /* nothing */
1250b57cec5SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1260b57cec5SDimitry Andric /*
1270b57cec5SDimitry Andric  * Generally, functions are not inlined unless optimization is specified.
1280b57cec5SDimitry Andric  * For functions declared inline, this attribute inlines the function even
1290b57cec5SDimitry Andric  * if no optimization level was specified.
1300b57cec5SDimitry Andric  */
1310b57cec5SDimitry Andric #ifdef __STRICT_ANSI__
1320b57cec5SDimitry Andric #define ITT_INLINE static
1330b57cec5SDimitry Andric #define ITT_INLINE_ATTRIBUTE __attribute__((unused))
1340b57cec5SDimitry Andric #else /* __STRICT_ANSI__ */
1350b57cec5SDimitry Andric #define ITT_INLINE static inline
1360b57cec5SDimitry Andric #define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused))
1370b57cec5SDimitry Andric #endif /* __STRICT_ANSI__ */
1380b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1390b57cec5SDimitry Andric /** @endcond */
1400b57cec5SDimitry Andric 
1410b57cec5SDimitry Andric #ifndef ITT_ARCH_IA32
1420b57cec5SDimitry Andric #define ITT_ARCH_IA32 1
1430b57cec5SDimitry Andric #endif /* ITT_ARCH_IA32 */
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric #ifndef ITT_ARCH_IA32E
1460b57cec5SDimitry Andric #define ITT_ARCH_IA32E 2
1470b57cec5SDimitry Andric #endif /* ITT_ARCH_IA32E */
1480b57cec5SDimitry Andric 
149349cc55cSDimitry Andric #ifndef ITT_ARCH_IA64
150349cc55cSDimitry Andric #define ITT_ARCH_IA64 3
151349cc55cSDimitry Andric #endif /* ITT_ARCH_IA64 */
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric #ifndef ITT_ARCH_ARM
1540b57cec5SDimitry Andric #define ITT_ARCH_ARM 4
1550b57cec5SDimitry Andric #endif /* ITT_ARCH_ARM */
1560b57cec5SDimitry Andric 
1570b57cec5SDimitry Andric #ifndef ITT_ARCH_PPC64
1580b57cec5SDimitry Andric #define ITT_ARCH_PPC64 5
1590b57cec5SDimitry Andric #endif /* ITT_ARCH_PPC64 */
1600b57cec5SDimitry Andric 
161349cc55cSDimitry Andric #ifndef ITT_ARCH_ARM64
162349cc55cSDimitry Andric #define ITT_ARCH_ARM64 6
163349cc55cSDimitry Andric #endif /* ITT_ARCH_ARM64 */
164489b1cf2SDimitry Andric 
165*5f757f3fSDimitry Andric #ifndef ITT_ARCH_VE
166*5f757f3fSDimitry Andric #define ITT_ARCH_VE 8
167*5f757f3fSDimitry Andric #endif /* ITT_ARCH_VE */
168*5f757f3fSDimitry Andric 
169*5f757f3fSDimitry Andric #ifndef ITT_ARCH_S390X
170*5f757f3fSDimitry Andric #define ITT_ARCH_S390X 8
171*5f757f3fSDimitry Andric #endif /* ITT_ARCH_S390X */
172*5f757f3fSDimitry Andric 
1730b57cec5SDimitry Andric #ifndef ITT_ARCH
1740b57cec5SDimitry Andric #if defined _M_IX86 || defined __i386__
1750b57cec5SDimitry Andric #define ITT_ARCH ITT_ARCH_IA32
1760b57cec5SDimitry Andric #elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__
1770b57cec5SDimitry Andric #define ITT_ARCH ITT_ARCH_IA32E
1780b57cec5SDimitry Andric #elif defined _M_IA64 || defined __ia64__
1790b57cec5SDimitry Andric #define ITT_ARCH ITT_ARCH_IA64
1800b57cec5SDimitry Andric #elif defined _M_ARM || defined __arm__
1810b57cec5SDimitry Andric #define ITT_ARCH ITT_ARCH_ARM
182349cc55cSDimitry Andric #elif defined __aarch64__
183349cc55cSDimitry Andric #define ITT_ARCH ITT_ARCH_ARM64
1840b57cec5SDimitry Andric #elif defined __powerpc64__
1850b57cec5SDimitry Andric #define ITT_ARCH ITT_ARCH_PPC64
186*5f757f3fSDimitry Andric #elif defined __ve__
187*5f757f3fSDimitry Andric #define ITT_ARCH ITT_ARCH_VE
188*5f757f3fSDimitry Andric #elif defined __s390x__
189*5f757f3fSDimitry Andric #define ITT_ARCH ITT_ARCH_S390X
1900b57cec5SDimitry Andric #endif
1910b57cec5SDimitry Andric #endif
1920b57cec5SDimitry Andric 
1930b57cec5SDimitry Andric #ifdef __cplusplus
1940b57cec5SDimitry Andric #define ITT_EXTERN_C extern "C"
1950b57cec5SDimitry Andric #define ITT_EXTERN_C_BEGIN extern "C" {
1960b57cec5SDimitry Andric #define ITT_EXTERN_C_END }
1970b57cec5SDimitry Andric #else
1980b57cec5SDimitry Andric #define ITT_EXTERN_C /* nothing */
1990b57cec5SDimitry Andric #define ITT_EXTERN_C_BEGIN /* nothing */
2000b57cec5SDimitry Andric #define ITT_EXTERN_C_END /* nothing */
2010b57cec5SDimitry Andric #endif /* __cplusplus */
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric #define ITT_TO_STR_AUX(x) #x
2040b57cec5SDimitry Andric #define ITT_TO_STR(x) ITT_TO_STR_AUX(x)
2050b57cec5SDimitry Andric 
206fe6060f1SDimitry Andric #define __ITT_BUILD_ASSERT(expr, suffix)                                       \
207fe6060f1SDimitry Andric   do {                                                                         \
2080b57cec5SDimitry Andric     static char __itt_build_check_##suffix[(expr) ? 1 : -1];                   \
2090b57cec5SDimitry Andric     __itt_build_check_##suffix[0] = 0;                                         \
2100b57cec5SDimitry Andric   } while (0)
2110b57cec5SDimitry Andric #define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix)
2120b57cec5SDimitry Andric #define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__)
2130b57cec5SDimitry Andric 
214fe6060f1SDimitry Andric #define ITT_MAGIC                                                              \
215fe6060f1SDimitry Andric   { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }
2160b57cec5SDimitry Andric 
2170b57cec5SDimitry Andric /* Replace with snapshot date YYYYMMDD for promotion build. */
218349cc55cSDimitry Andric #define API_VERSION_BUILD 20180723
2190b57cec5SDimitry Andric 
2200b57cec5SDimitry Andric #ifndef API_VERSION_NUM
221349cc55cSDimitry Andric #define API_VERSION_NUM 3.20.1
2220b57cec5SDimitry Andric #endif /* API_VERSION_NUM */
2230b57cec5SDimitry Andric 
224fe6060f1SDimitry Andric #define API_VERSION                                                            \
225fe6060f1SDimitry Andric   "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) " (" ITT_TO_STR(              \
226fe6060f1SDimitry Andric       API_VERSION_BUILD) ")"
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric /* OS communication functions */
2290b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
2300b57cec5SDimitry Andric #include <windows.h>
2310b57cec5SDimitry Andric typedef HMODULE lib_t;
2320b57cec5SDimitry Andric typedef DWORD TIDT;
2330b57cec5SDimitry Andric typedef CRITICAL_SECTION mutex_t;
234349cc55cSDimitry Andric #ifdef __cplusplus
235349cc55cSDimitry Andric #define MUTEX_INITIALIZER                                                      \
236349cc55cSDimitry Andric   {}
237349cc55cSDimitry Andric #else
238fe6060f1SDimitry Andric #define MUTEX_INITIALIZER                                                      \
239fe6060f1SDimitry Andric   { 0 }
240349cc55cSDimitry Andric #endif
2410b57cec5SDimitry Andric #define strong_alias(name, aliasname) /* empty for Windows */
2420b57cec5SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
2430b57cec5SDimitry Andric #include <dlfcn.h>
2440b57cec5SDimitry Andric #if defined(UNICODE) || defined(_UNICODE)
2450b57cec5SDimitry Andric #include <wchar.h>
2460b57cec5SDimitry Andric #endif /* UNICODE */
2470b57cec5SDimitry Andric #ifndef _GNU_SOURCE
2480b57cec5SDimitry Andric #define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
2490b57cec5SDimitry Andric #endif /* _GNU_SOURCE */
2500b57cec5SDimitry Andric #ifndef __USE_UNIX98
251fe6060f1SDimitry Andric #define __USE_UNIX98                                                           \
252fe6060f1SDimitry Andric   1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein    \
253fe6060f1SDimitry Andric        pthread.h missing dependency on __USE_XOPEN2K8 */
2540b57cec5SDimitry Andric #endif /*__USE_UNIX98*/
2550b57cec5SDimitry Andric #include <pthread.h>
2560b57cec5SDimitry Andric typedef void *lib_t;
2570b57cec5SDimitry Andric typedef pthread_t TIDT;
2580b57cec5SDimitry Andric typedef pthread_mutex_t mutex_t;
2590b57cec5SDimitry Andric #define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
2600b57cec5SDimitry Andric #define _strong_alias(name, aliasname)                                         \
2610b57cec5SDimitry Andric   extern __typeof(name) aliasname __attribute__((alias(#name)));
2620b57cec5SDimitry Andric #define strong_alias(name, aliasname) _strong_alias(name, aliasname)
2630b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
2640b57cec5SDimitry Andric 
2650b57cec5SDimitry Andric #if ITT_PLATFORM == ITT_PLATFORM_WIN
2660b57cec5SDimitry Andric #define __itt_get_proc(lib, name) GetProcAddress(lib, name)
2670b57cec5SDimitry Andric #define __itt_mutex_init(mutex) InitializeCriticalSection(mutex)
2680b57cec5SDimitry Andric #define __itt_mutex_lock(mutex) EnterCriticalSection(mutex)
2690b57cec5SDimitry Andric #define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
2700b57cec5SDimitry Andric #define __itt_load_lib(name) LoadLibraryA(name)
2710b57cec5SDimitry Andric #define __itt_unload_lib(handle) FreeLibrary(handle)
2720b57cec5SDimitry Andric #define __itt_system_error() (int)GetLastError()
2730b57cec5SDimitry Andric #define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2)
2740b57cec5SDimitry Andric #define __itt_fstrnlen(s, l) strnlen_s(s, l)
2750b57cec5SDimitry Andric #define __itt_fstrcpyn(s1, b, s2, l) strncpy_s(s1, b, s2, l)
2760b57cec5SDimitry Andric #define __itt_fstrdup(s) _strdup(s)
2770b57cec5SDimitry Andric #define __itt_thread_id() GetCurrentThreadId()
2780b57cec5SDimitry Andric #define __itt_thread_yield() SwitchToThread()
2790b57cec5SDimitry Andric #ifndef ITT_SIMPLE_INIT
2800b57cec5SDimitry Andric ITT_INLINE long
2810b57cec5SDimitry Andric __itt_interlocked_increment(volatile long *ptr) ITT_INLINE_ATTRIBUTE;
282fe6060f1SDimitry Andric ITT_INLINE long __itt_interlocked_increment(volatile long *ptr) {
2830b57cec5SDimitry Andric   return InterlockedIncrement(ptr);
2840b57cec5SDimitry Andric }
2850b57cec5SDimitry Andric #endif /* ITT_SIMPLE_INIT */
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric #define DL_SYMBOLS (1)
2880b57cec5SDimitry Andric #define PTHREAD_SYMBOLS (1)
2890b57cec5SDimitry Andric 
2900b57cec5SDimitry Andric #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
2910b57cec5SDimitry Andric #define __itt_get_proc(lib, name) dlsym(lib, name)
292fe6060f1SDimitry Andric #define __itt_mutex_init(mutex)                                                \
293fe6060f1SDimitry Andric   {                                                                            \
2940b57cec5SDimitry Andric     pthread_mutexattr_t mutex_attr;                                            \
2950b57cec5SDimitry Andric     int error_code = pthread_mutexattr_init(&mutex_attr);                      \
2960b57cec5SDimitry Andric     if (error_code)                                                            \
2970b57cec5SDimitry Andric       __itt_report_error(__itt_error_system, "pthread_mutexattr_init",         \
2980b57cec5SDimitry Andric                          error_code);                                          \
299fe6060f1SDimitry Andric     error_code =                                                               \
300fe6060f1SDimitry Andric         pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);       \
3010b57cec5SDimitry Andric     if (error_code)                                                            \
3020b57cec5SDimitry Andric       __itt_report_error(__itt_error_system, "pthread_mutexattr_settype",      \
3030b57cec5SDimitry Andric                          error_code);                                          \
3040b57cec5SDimitry Andric     error_code = pthread_mutex_init(mutex, &mutex_attr);                       \
3050b57cec5SDimitry Andric     if (error_code)                                                            \
3060b57cec5SDimitry Andric       __itt_report_error(__itt_error_system, "pthread_mutex_init",             \
3070b57cec5SDimitry Andric                          error_code);                                          \
3080b57cec5SDimitry Andric     error_code = pthread_mutexattr_destroy(&mutex_attr);                       \
3090b57cec5SDimitry Andric     if (error_code)                                                            \
3100b57cec5SDimitry Andric       __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy",      \
3110b57cec5SDimitry Andric                          error_code);                                          \
3120b57cec5SDimitry Andric   }
3130b57cec5SDimitry Andric #define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex)
3140b57cec5SDimitry Andric #define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
3150b57cec5SDimitry Andric #define __itt_load_lib(name) dlopen(name, RTLD_LAZY)
3160b57cec5SDimitry Andric #define __itt_unload_lib(handle) dlclose(handle)
3170b57cec5SDimitry Andric #define __itt_system_error() errno
3180b57cec5SDimitry Andric #define __itt_fstrcmp(s1, s2) strcmp(s1, s2)
3190b57cec5SDimitry Andric 
3200b57cec5SDimitry Andric /* makes customer code define safe APIs for SDL_STRNLEN_S and SDL_STRNCPY_S */
3210b57cec5SDimitry Andric #ifdef SDL_STRNLEN_S
3220b57cec5SDimitry Andric #define __itt_fstrnlen(s, l) SDL_STRNLEN_S(s, l)
3230b57cec5SDimitry Andric #else
3240b57cec5SDimitry Andric #define __itt_fstrnlen(s, l) strlen(s)
3250b57cec5SDimitry Andric #endif /* SDL_STRNLEN_S */
3260b57cec5SDimitry Andric #ifdef SDL_STRNCPY_S
3270b57cec5SDimitry Andric #define __itt_fstrcpyn(s1, b, s2, l) SDL_STRNCPY_S(s1, b, s2, l)
3280b57cec5SDimitry Andric #else
329349cc55cSDimitry Andric #define __itt_fstrcpyn(s1, b, s2, l)                                           \
330349cc55cSDimitry Andric   {                                                                            \
331349cc55cSDimitry Andric     if (b > 0) {                                                               \
332349cc55cSDimitry Andric       /* 'volatile' is used to suppress the warning that a destination */      \
333349cc55cSDimitry Andric       /*  bound depends on the length of the source.                   */      \
334349cc55cSDimitry Andric       volatile size_t num_to_copy =                                            \
335349cc55cSDimitry Andric           (size_t)(b - 1) < (size_t)(l) ? (size_t)(b - 1) : (size_t)(l);       \
336349cc55cSDimitry Andric       strncpy(s1, s2, num_to_copy);                                            \
337349cc55cSDimitry Andric       s1[num_to_copy] = 0;                                                     \
338349cc55cSDimitry Andric     }                                                                          \
339349cc55cSDimitry Andric   }
3400b57cec5SDimitry Andric #endif /* SDL_STRNCPY_S */
3410b57cec5SDimitry Andric 
3420b57cec5SDimitry Andric #define __itt_fstrdup(s) strdup(s)
3430b57cec5SDimitry Andric #define __itt_thread_id() pthread_self()
3440b57cec5SDimitry Andric #define __itt_thread_yield() sched_yield()
3450b57cec5SDimitry Andric #if ITT_ARCH == ITT_ARCH_IA64
3460b57cec5SDimitry Andric #ifdef __INTEL_COMPILER
3470b57cec5SDimitry Andric #define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
3480b57cec5SDimitry Andric #else /* __INTEL_COMPILER */
3490b57cec5SDimitry Andric /* TODO: Add Support for not Intel compilers for IA-64 architecture */
3500b57cec5SDimitry Andric #endif /* __INTEL_COMPILER */
351fe6060f1SDimitry Andric #elif ITT_ARCH == ITT_ARCH_IA32 ||                                             \
352fe6060f1SDimitry Andric     ITT_ARCH == ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */
353fe6060f1SDimitry Andric ITT_INLINE long __TBB_machine_fetchadd4(volatile void *ptr,
354fe6060f1SDimitry Andric                                         long addend) ITT_INLINE_ATTRIBUTE;
355fe6060f1SDimitry Andric ITT_INLINE long __TBB_machine_fetchadd4(volatile void *ptr, long addend) {
3560b57cec5SDimitry Andric   long result;
3570b57cec5SDimitry Andric   __asm__ __volatile__("lock\nxadd %0,%1"
3580b57cec5SDimitry Andric                        : "=r"(result), "=m"(*(volatile int *)ptr)
3590b57cec5SDimitry Andric                        : "0"(addend), "m"(*(volatile int *)ptr)
3600b57cec5SDimitry Andric                        : "memory");
3610b57cec5SDimitry Andric   return result;
3620b57cec5SDimitry Andric }
363349cc55cSDimitry Andric #else
3640b57cec5SDimitry Andric #define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
3650b57cec5SDimitry Andric #endif /* ITT_ARCH==ITT_ARCH_IA64 */
3660b57cec5SDimitry Andric #ifndef ITT_SIMPLE_INIT
3670b57cec5SDimitry Andric ITT_INLINE long
3680b57cec5SDimitry Andric __itt_interlocked_increment(volatile long *ptr) ITT_INLINE_ATTRIBUTE;
369fe6060f1SDimitry Andric ITT_INLINE long __itt_interlocked_increment(volatile long *ptr) {
3700b57cec5SDimitry Andric   return __TBB_machine_fetchadd4(ptr, 1) + 1L;
3710b57cec5SDimitry Andric }
3720b57cec5SDimitry Andric #endif /* ITT_SIMPLE_INIT */
3730b57cec5SDimitry Andric 
3740b57cec5SDimitry Andric void *dlopen(const char *, int) __attribute__((weak));
3750b57cec5SDimitry Andric void *dlsym(void *, const char *) __attribute__((weak));
3760b57cec5SDimitry Andric int dlclose(void *) __attribute__((weak));
3770b57cec5SDimitry Andric #define DL_SYMBOLS (dlopen && dlsym && dlclose)
3780b57cec5SDimitry Andric 
379fe6060f1SDimitry Andric int pthread_mutex_init(pthread_mutex_t *, const pthread_mutexattr_t *)
380fe6060f1SDimitry Andric     __attribute__((weak));
3810b57cec5SDimitry Andric int pthread_mutex_lock(pthread_mutex_t *) __attribute__((weak));
3820b57cec5SDimitry Andric int pthread_mutex_unlock(pthread_mutex_t *) __attribute__((weak));
3830b57cec5SDimitry Andric int pthread_mutex_destroy(pthread_mutex_t *) __attribute__((weak));
3840b57cec5SDimitry Andric int pthread_mutexattr_init(pthread_mutexattr_t *) __attribute__((weak));
3850b57cec5SDimitry Andric int pthread_mutexattr_settype(pthread_mutexattr_t *, int) __attribute__((weak));
3860b57cec5SDimitry Andric int pthread_mutexattr_destroy(pthread_mutexattr_t *) __attribute__((weak));
3870b57cec5SDimitry Andric pthread_t pthread_self(void) __attribute__((weak));
388fe6060f1SDimitry Andric #define PTHREAD_SYMBOLS                                                        \
389fe6060f1SDimitry Andric   (pthread_mutex_init && pthread_mutex_lock && pthread_mutex_unlock &&         \
390fe6060f1SDimitry Andric    pthread_mutex_destroy && pthread_mutexattr_init &&                          \
391fe6060f1SDimitry Andric    pthread_mutexattr_settype && pthread_mutexattr_destroy && pthread_self)
3920b57cec5SDimitry Andric 
3930b57cec5SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
3940b57cec5SDimitry Andric 
3950b57cec5SDimitry Andric typedef enum {
3960b57cec5SDimitry Andric   __itt_collection_normal = 0,
3970b57cec5SDimitry Andric   __itt_collection_paused = 1
3980b57cec5SDimitry Andric } __itt_collection_state;
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric typedef enum {
4010b57cec5SDimitry Andric   __itt_thread_normal = 0,
4020b57cec5SDimitry Andric   __itt_thread_ignored = 1
4030b57cec5SDimitry Andric } __itt_thread_state;
4040b57cec5SDimitry Andric 
4050b57cec5SDimitry Andric #pragma pack(push, 8)
4060b57cec5SDimitry Andric 
407fe6060f1SDimitry Andric typedef struct ___itt_thread_info {
4080b57cec5SDimitry Andric   const char *nameA; /*!< Copy of original name in ASCII. */
4090b57cec5SDimitry Andric #if defined(UNICODE) || defined(_UNICODE)
4100b57cec5SDimitry Andric   const wchar_t *nameW; /*!< Copy of original name in UNICODE. */
4110b57cec5SDimitry Andric #else /* UNICODE || _UNICODE */
4120b57cec5SDimitry Andric   void *nameW;
4130b57cec5SDimitry Andric #endif /* UNICODE || _UNICODE */
4140b57cec5SDimitry Andric   TIDT tid;
4150b57cec5SDimitry Andric   __itt_thread_state state; /*!< Thread state (paused or normal) */
4160b57cec5SDimitry Andric   int extra1; /*!< Reserved to the runtime */
4170b57cec5SDimitry Andric   void *extra2; /*!< Reserved to the runtime */
4180b57cec5SDimitry Andric   struct ___itt_thread_info *next;
4190b57cec5SDimitry Andric } __itt_thread_info;
4200b57cec5SDimitry Andric 
4210b57cec5SDimitry Andric #include "ittnotify_types.h" /* For __itt_group_id definition */
4220b57cec5SDimitry Andric 
423fe6060f1SDimitry Andric typedef struct ___itt_api_info_20101001 {
4240b57cec5SDimitry Andric   const char *name;
4250b57cec5SDimitry Andric   void **func_ptr;
4260b57cec5SDimitry Andric   void *init_func;
4270b57cec5SDimitry Andric   __itt_group_id group;
4280b57cec5SDimitry Andric } __itt_api_info_20101001;
4290b57cec5SDimitry Andric 
430fe6060f1SDimitry Andric typedef struct ___itt_api_info {
4310b57cec5SDimitry Andric   const char *name;
4320b57cec5SDimitry Andric   void **func_ptr;
4330b57cec5SDimitry Andric   void *init_func;
4340b57cec5SDimitry Andric   void *null_func;
4350b57cec5SDimitry Andric   __itt_group_id group;
4360b57cec5SDimitry Andric } __itt_api_info;
4370b57cec5SDimitry Andric 
438fe6060f1SDimitry Andric typedef struct __itt_counter_info {
4390b57cec5SDimitry Andric   const char *nameA; /*!< Copy of original name in ASCII. */
4400b57cec5SDimitry Andric #if defined(UNICODE) || defined(_UNICODE)
4410b57cec5SDimitry Andric   const wchar_t *nameW; /*!< Copy of original name in UNICODE. */
4420b57cec5SDimitry Andric #else /* UNICODE || _UNICODE */
4430b57cec5SDimitry Andric   void *nameW;
4440b57cec5SDimitry Andric #endif /* UNICODE || _UNICODE */
4450b57cec5SDimitry Andric   const char *domainA; /*!< Copy of original name in ASCII. */
4460b57cec5SDimitry Andric #if defined(UNICODE) || defined(_UNICODE)
4470b57cec5SDimitry Andric   const wchar_t *domainW; /*!< Copy of original name in UNICODE. */
4480b57cec5SDimitry Andric #else /* UNICODE || _UNICODE */
4490b57cec5SDimitry Andric   void *domainW;
4500b57cec5SDimitry Andric #endif /* UNICODE || _UNICODE */
4510b57cec5SDimitry Andric   int type;
4520b57cec5SDimitry Andric   long index;
4530b57cec5SDimitry Andric   int extra1; /*!< Reserved to the runtime */
4540b57cec5SDimitry Andric   void *extra2; /*!< Reserved to the runtime */
4550b57cec5SDimitry Andric   struct __itt_counter_info *next;
4560b57cec5SDimitry Andric } __itt_counter_info_t;
4570b57cec5SDimitry Andric 
4580b57cec5SDimitry Andric struct ___itt_domain;
4590b57cec5SDimitry Andric struct ___itt_string_handle;
460349cc55cSDimitry Andric struct ___itt_histogram;
4610b57cec5SDimitry Andric 
462fe6060f1SDimitry Andric typedef struct ___itt_global {
4630b57cec5SDimitry Andric   unsigned char magic[8];
4640b57cec5SDimitry Andric   unsigned long version_major;
4650b57cec5SDimitry Andric   unsigned long version_minor;
4660b57cec5SDimitry Andric   unsigned long version_build;
4670b57cec5SDimitry Andric   volatile long api_initialized;
4680b57cec5SDimitry Andric   volatile long mutex_initialized;
4690b57cec5SDimitry Andric   volatile long atomic_counter;
4700b57cec5SDimitry Andric   mutex_t mutex;
4710b57cec5SDimitry Andric   lib_t lib;
4720b57cec5SDimitry Andric   void *error_handler;
4730b57cec5SDimitry Andric   const char **dll_path_ptr;
4740b57cec5SDimitry Andric   __itt_api_info *api_list_ptr;
4750b57cec5SDimitry Andric   struct ___itt_global *next;
4760b57cec5SDimitry Andric   /* Joinable structures below */
4770b57cec5SDimitry Andric   __itt_thread_info *thread_list;
4780b57cec5SDimitry Andric   struct ___itt_domain *domain_list;
4790b57cec5SDimitry Andric   struct ___itt_string_handle *string_list;
4800b57cec5SDimitry Andric   __itt_collection_state state;
4810b57cec5SDimitry Andric   __itt_counter_info_t *counter_list;
482349cc55cSDimitry Andric   unsigned int ipt_collect_events;
483349cc55cSDimitry Andric   struct ___itt_histogram *histogram_list;
4840b57cec5SDimitry Andric } __itt_global;
4850b57cec5SDimitry Andric 
4860b57cec5SDimitry Andric #pragma pack(pop)
4870b57cec5SDimitry Andric 
488fe6060f1SDimitry Andric #define NEW_THREAD_INFO_W(gptr, h, h_tail, t, s, n)                            \
489fe6060f1SDimitry Andric   {                                                                            \
4900b57cec5SDimitry Andric     h = (__itt_thread_info *)malloc(sizeof(__itt_thread_info));                \
4910b57cec5SDimitry Andric     if (h != NULL) {                                                           \
4920b57cec5SDimitry Andric       h->tid = t;                                                              \
4930b57cec5SDimitry Andric       h->nameA = NULL;                                                         \
4940b57cec5SDimitry Andric       h->nameW = n ? _wcsdup(n) : NULL;                                        \
4950b57cec5SDimitry Andric       h->state = s;                                                            \
4960b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
4970b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
4980b57cec5SDimitry Andric       h->next = NULL;                                                          \
4990b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5000b57cec5SDimitry Andric         (gptr)->thread_list = h;                                               \
5010b57cec5SDimitry Andric       else                                                                     \
5020b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5030b57cec5SDimitry Andric     }                                                                          \
5040b57cec5SDimitry Andric   }
5050b57cec5SDimitry Andric 
506fe6060f1SDimitry Andric #define NEW_THREAD_INFO_A(gptr, h, h_tail, t, s, n)                            \
507fe6060f1SDimitry Andric   {                                                                            \
5080b57cec5SDimitry Andric     h = (__itt_thread_info *)malloc(sizeof(__itt_thread_info));                \
5090b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5100b57cec5SDimitry Andric       h->tid = t;                                                              \
5110b57cec5SDimitry Andric       h->nameA = n ? __itt_fstrdup(n) : NULL;                                  \
5120b57cec5SDimitry Andric       h->nameW = NULL;                                                         \
5130b57cec5SDimitry Andric       h->state = s;                                                            \
5140b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
5150b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
5160b57cec5SDimitry Andric       h->next = NULL;                                                          \
5170b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5180b57cec5SDimitry Andric         (gptr)->thread_list = h;                                               \
5190b57cec5SDimitry Andric       else                                                                     \
5200b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5210b57cec5SDimitry Andric     }                                                                          \
5220b57cec5SDimitry Andric   }
5230b57cec5SDimitry Andric 
524fe6060f1SDimitry Andric #define NEW_DOMAIN_W(gptr, h, h_tail, name)                                    \
525fe6060f1SDimitry Andric   {                                                                            \
5260b57cec5SDimitry Andric     h = (__itt_domain *)malloc(sizeof(__itt_domain));                          \
5270b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5280b57cec5SDimitry Andric       h->flags = 1; /* domain is enabled by default */                         \
5290b57cec5SDimitry Andric       h->nameA = NULL;                                                         \
5300b57cec5SDimitry Andric       h->nameW = name ? _wcsdup(name) : NULL;                                  \
5310b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
5320b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
5330b57cec5SDimitry Andric       h->next = NULL;                                                          \
5340b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5350b57cec5SDimitry Andric         (gptr)->domain_list = h;                                               \
5360b57cec5SDimitry Andric       else                                                                     \
5370b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5380b57cec5SDimitry Andric     }                                                                          \
5390b57cec5SDimitry Andric   }
5400b57cec5SDimitry Andric 
541fe6060f1SDimitry Andric #define NEW_DOMAIN_A(gptr, h, h_tail, name)                                    \
542fe6060f1SDimitry Andric   {                                                                            \
5430b57cec5SDimitry Andric     h = (__itt_domain *)malloc(sizeof(__itt_domain));                          \
5440b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5450b57cec5SDimitry Andric       h->flags = 1; /* domain is enabled by default */                         \
5460b57cec5SDimitry Andric       h->nameA = name ? __itt_fstrdup(name) : NULL;                            \
5470b57cec5SDimitry Andric       h->nameW = NULL;                                                         \
5480b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
5490b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
5500b57cec5SDimitry Andric       h->next = NULL;                                                          \
5510b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5520b57cec5SDimitry Andric         (gptr)->domain_list = h;                                               \
5530b57cec5SDimitry Andric       else                                                                     \
5540b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5550b57cec5SDimitry Andric     }                                                                          \
5560b57cec5SDimitry Andric   }
5570b57cec5SDimitry Andric 
558fe6060f1SDimitry Andric #define NEW_STRING_HANDLE_W(gptr, h, h_tail, name)                             \
559fe6060f1SDimitry Andric   {                                                                            \
5600b57cec5SDimitry Andric     h = (__itt_string_handle *)malloc(sizeof(__itt_string_handle));            \
5610b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5620b57cec5SDimitry Andric       h->strA = NULL;                                                          \
5630b57cec5SDimitry Andric       h->strW = name ? _wcsdup(name) : NULL;                                   \
5640b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
5650b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
5660b57cec5SDimitry Andric       h->next = NULL;                                                          \
5670b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5680b57cec5SDimitry Andric         (gptr)->string_list = h;                                               \
5690b57cec5SDimitry Andric       else                                                                     \
5700b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5710b57cec5SDimitry Andric     }                                                                          \
5720b57cec5SDimitry Andric   }
5730b57cec5SDimitry Andric 
574fe6060f1SDimitry Andric #define NEW_STRING_HANDLE_A(gptr, h, h_tail, name)                             \
575fe6060f1SDimitry Andric   {                                                                            \
5760b57cec5SDimitry Andric     h = (__itt_string_handle *)malloc(sizeof(__itt_string_handle));            \
5770b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5780b57cec5SDimitry Andric       h->strA = name ? __itt_fstrdup(name) : NULL;                             \
5790b57cec5SDimitry Andric       h->strW = NULL;                                                          \
5800b57cec5SDimitry Andric       h->extra1 = 0; /* reserved */                                            \
5810b57cec5SDimitry Andric       h->extra2 = NULL; /* reserved */                                         \
5820b57cec5SDimitry Andric       h->next = NULL;                                                          \
5830b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
5840b57cec5SDimitry Andric         (gptr)->string_list = h;                                               \
5850b57cec5SDimitry Andric       else                                                                     \
5860b57cec5SDimitry Andric         h_tail->next = h;                                                      \
5870b57cec5SDimitry Andric     }                                                                          \
5880b57cec5SDimitry Andric   }
5890b57cec5SDimitry Andric 
590fe6060f1SDimitry Andric #define NEW_COUNTER_W(gptr, h, h_tail, name, domain, type)                     \
591fe6060f1SDimitry Andric   {                                                                            \
5920b57cec5SDimitry Andric     h = (__itt_counter_info_t *)malloc(sizeof(__itt_counter_info_t));          \
5930b57cec5SDimitry Andric     if (h != NULL) {                                                           \
5940b57cec5SDimitry Andric       h->nameA = NULL;                                                         \
5950b57cec5SDimitry Andric       h->nameW = name ? _wcsdup(name) : NULL;                                  \
5960b57cec5SDimitry Andric       h->domainA = NULL;                                                       \
5970b57cec5SDimitry Andric       h->domainW = name ? _wcsdup(domain) : NULL;                              \
5980b57cec5SDimitry Andric       h->type = type;                                                          \
5990b57cec5SDimitry Andric       h->index = 0;                                                            \
6000b57cec5SDimitry Andric       h->next = NULL;                                                          \
6010b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
6020b57cec5SDimitry Andric         (gptr)->counter_list = h;                                              \
6030b57cec5SDimitry Andric       else                                                                     \
6040b57cec5SDimitry Andric         h_tail->next = h;                                                      \
6050b57cec5SDimitry Andric     }                                                                          \
6060b57cec5SDimitry Andric   }
6070b57cec5SDimitry Andric 
608fe6060f1SDimitry Andric #define NEW_COUNTER_A(gptr, h, h_tail, name, domain, type)                     \
609fe6060f1SDimitry Andric   {                                                                            \
6100b57cec5SDimitry Andric     h = (__itt_counter_info_t *)malloc(sizeof(__itt_counter_info_t));          \
6110b57cec5SDimitry Andric     if (h != NULL) {                                                           \
6120b57cec5SDimitry Andric       h->nameA = name ? __itt_fstrdup(name) : NULL;                            \
6130b57cec5SDimitry Andric       h->nameW = NULL;                                                         \
6140b57cec5SDimitry Andric       h->domainA = domain ? __itt_fstrdup(domain) : NULL;                      \
6150b57cec5SDimitry Andric       h->domainW = NULL;                                                       \
6160b57cec5SDimitry Andric       h->type = type;                                                          \
6170b57cec5SDimitry Andric       h->index = 0;                                                            \
6180b57cec5SDimitry Andric       h->next = NULL;                                                          \
6190b57cec5SDimitry Andric       if (h_tail == NULL)                                                      \
6200b57cec5SDimitry Andric         (gptr)->counter_list = h;                                              \
6210b57cec5SDimitry Andric       else                                                                     \
6220b57cec5SDimitry Andric         h_tail->next = h;                                                      \
6230b57cec5SDimitry Andric     }                                                                          \
6240b57cec5SDimitry Andric   }
6250b57cec5SDimitry Andric 
626349cc55cSDimitry Andric #define NEW_HISTOGRAM_W(gptr, h, h_tail, domain, name, x_type, y_type)         \
627349cc55cSDimitry Andric   {                                                                            \
628349cc55cSDimitry Andric     h = (__itt_histogram *)malloc(sizeof(__itt_histogram));                    \
629349cc55cSDimitry Andric     if (h != NULL) {                                                           \
630349cc55cSDimitry Andric       h->domain = domain;                                                      \
631349cc55cSDimitry Andric       h->nameA = NULL;                                                         \
632349cc55cSDimitry Andric       h->nameW = name ? _wcsdup(name) : NULL;                                  \
633349cc55cSDimitry Andric       h->x_type = x_type;                                                      \
634349cc55cSDimitry Andric       h->y_type = y_type;                                                      \
635349cc55cSDimitry Andric       h->extra1 = 0;                                                           \
636349cc55cSDimitry Andric       h->extra2 = NULL;                                                        \
637349cc55cSDimitry Andric       if (h_tail == NULL)                                                      \
638349cc55cSDimitry Andric         (gptr)->histogram_list = h;                                            \
639349cc55cSDimitry Andric       else                                                                     \
640349cc55cSDimitry Andric         h_tail->next = h;                                                      \
641349cc55cSDimitry Andric     }                                                                          \
642349cc55cSDimitry Andric   }
643349cc55cSDimitry Andric 
644349cc55cSDimitry Andric #define NEW_HISTOGRAM_A(gptr, h, h_tail, domain, name, x_type, y_type)         \
645349cc55cSDimitry Andric   {                                                                            \
646349cc55cSDimitry Andric     h = (__itt_histogram *)malloc(sizeof(__itt_histogram));                    \
647349cc55cSDimitry Andric     if (h != NULL) {                                                           \
648349cc55cSDimitry Andric       h->domain = domain;                                                      \
649349cc55cSDimitry Andric       h->nameA = name ? __itt_fstrdup(name) : NULL;                            \
650349cc55cSDimitry Andric       h->nameW = NULL;                                                         \
651349cc55cSDimitry Andric       h->x_type = x_type;                                                      \
652349cc55cSDimitry Andric       h->y_type = y_type;                                                      \
653349cc55cSDimitry Andric       h->extra1 = 0;                                                           \
654349cc55cSDimitry Andric       h->extra2 = NULL;                                                        \
655349cc55cSDimitry Andric       if (h_tail == NULL)                                                      \
656349cc55cSDimitry Andric         (gptr)->histogram_list = h;                                            \
657349cc55cSDimitry Andric       else                                                                     \
658349cc55cSDimitry Andric         h_tail->next = h;                                                      \
659349cc55cSDimitry Andric     }                                                                          \
660349cc55cSDimitry Andric   }
661349cc55cSDimitry Andric 
6620b57cec5SDimitry Andric #endif /* _ITTNOTIFY_CONFIG_H_ */
663