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