1*0fca6ea1SDimitry Andric /*===-- ittnotify_config.h - JIT Profiling API internal config-----*- C -*-===* 2*0fca6ea1SDimitry Andric * 3*0fca6ea1SDimitry Andric * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric * See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric * 7*0fca6ea1SDimitry Andric *===----------------------------------------------------------------------===* 8*0fca6ea1SDimitry Andric * 9*0fca6ea1SDimitry Andric * This file provides Intel(R) Performance Analyzer JIT (Just-In-Time) 10*0fca6ea1SDimitry Andric * Profiling API internal config. 11*0fca6ea1SDimitry Andric * 12*0fca6ea1SDimitry Andric * NOTE: This file comes in a style different from the rest of LLVM 13*0fca6ea1SDimitry Andric * source base since this is a piece of code shared from Intel(R) 14*0fca6ea1SDimitry Andric * products. Please do not reformat / re-style this code to make 15*0fca6ea1SDimitry Andric * subsequent merges and contributions from the original source base eaiser. 16*0fca6ea1SDimitry Andric * 17*0fca6ea1SDimitry Andric *===----------------------------------------------------------------------===*/ 18*0fca6ea1SDimitry Andric #ifndef _ITTNOTIFY_CONFIG_H_ 19*0fca6ea1SDimitry Andric #define _ITTNOTIFY_CONFIG_H_ 20*0fca6ea1SDimitry Andric 21*0fca6ea1SDimitry Andric /** @cond exclude_from_documentation */ 22*0fca6ea1SDimitry Andric #ifndef ITT_OS_WIN 23*0fca6ea1SDimitry Andric # define ITT_OS_WIN 1 24*0fca6ea1SDimitry Andric #endif /* ITT_OS_WIN */ 25*0fca6ea1SDimitry Andric 26*0fca6ea1SDimitry Andric #ifndef ITT_OS_LINUX 27*0fca6ea1SDimitry Andric # define ITT_OS_LINUX 2 28*0fca6ea1SDimitry Andric #endif /* ITT_OS_LINUX */ 29*0fca6ea1SDimitry Andric 30*0fca6ea1SDimitry Andric #ifndef ITT_OS_MAC 31*0fca6ea1SDimitry Andric # define ITT_OS_MAC 3 32*0fca6ea1SDimitry Andric #endif /* ITT_OS_MAC */ 33*0fca6ea1SDimitry Andric 34*0fca6ea1SDimitry Andric #ifndef ITT_OS 35*0fca6ea1SDimitry Andric # if defined WIN32 || defined _WIN32 36*0fca6ea1SDimitry Andric # define ITT_OS ITT_OS_WIN 37*0fca6ea1SDimitry Andric # elif defined( __APPLE__ ) && defined( __MACH__ ) 38*0fca6ea1SDimitry Andric # define ITT_OS ITT_OS_MAC 39*0fca6ea1SDimitry Andric # else 40*0fca6ea1SDimitry Andric # define ITT_OS ITT_OS_LINUX 41*0fca6ea1SDimitry Andric # endif 42*0fca6ea1SDimitry Andric #endif /* ITT_OS */ 43*0fca6ea1SDimitry Andric 44*0fca6ea1SDimitry Andric #ifndef ITT_PLATFORM_WIN 45*0fca6ea1SDimitry Andric # define ITT_PLATFORM_WIN 1 46*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM_WIN */ 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric #ifndef ITT_PLATFORM_POSIX 49*0fca6ea1SDimitry Andric # define ITT_PLATFORM_POSIX 2 50*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM_POSIX */ 51*0fca6ea1SDimitry Andric 52*0fca6ea1SDimitry Andric #ifndef ITT_PLATFORM 53*0fca6ea1SDimitry Andric # if ITT_OS==ITT_OS_WIN 54*0fca6ea1SDimitry Andric # define ITT_PLATFORM ITT_PLATFORM_WIN 55*0fca6ea1SDimitry Andric # else 56*0fca6ea1SDimitry Andric # define ITT_PLATFORM ITT_PLATFORM_POSIX 57*0fca6ea1SDimitry Andric # endif /* _WIN32 */ 58*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM */ 59*0fca6ea1SDimitry Andric 60*0fca6ea1SDimitry Andric #if defined(_UNICODE) && !defined(UNICODE) 61*0fca6ea1SDimitry Andric #define UNICODE 62*0fca6ea1SDimitry Andric #endif 63*0fca6ea1SDimitry Andric 64*0fca6ea1SDimitry Andric #include <stddef.h> 65*0fca6ea1SDimitry Andric #if ITT_PLATFORM==ITT_PLATFORM_WIN 66*0fca6ea1SDimitry Andric #include <tchar.h> 67*0fca6ea1SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 68*0fca6ea1SDimitry Andric #include <stdint.h> 69*0fca6ea1SDimitry Andric #if defined(UNICODE) || defined(_UNICODE) 70*0fca6ea1SDimitry Andric #include <wchar.h> 71*0fca6ea1SDimitry Andric #endif /* UNICODE || _UNICODE */ 72*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 73*0fca6ea1SDimitry Andric 74*0fca6ea1SDimitry Andric #ifndef CDECL 75*0fca6ea1SDimitry Andric # if ITT_PLATFORM==ITT_PLATFORM_WIN 76*0fca6ea1SDimitry Andric # define CDECL __cdecl 77*0fca6ea1SDimitry Andric # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 78*0fca6ea1SDimitry Andric # if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 79*0fca6ea1SDimitry Andric # define CDECL /* not actual on x86_64 platform */ 80*0fca6ea1SDimitry Andric # else /* _M_X64 || _M_AMD64 || __x86_64__ */ 81*0fca6ea1SDimitry Andric # define CDECL __attribute__ ((cdecl)) 82*0fca6ea1SDimitry Andric # endif /* _M_X64 || _M_AMD64 || __x86_64__ */ 83*0fca6ea1SDimitry Andric # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 84*0fca6ea1SDimitry Andric #endif /* CDECL */ 85*0fca6ea1SDimitry Andric 86*0fca6ea1SDimitry Andric #ifndef STDCALL 87*0fca6ea1SDimitry Andric # if ITT_PLATFORM==ITT_PLATFORM_WIN 88*0fca6ea1SDimitry Andric # define STDCALL __stdcall 89*0fca6ea1SDimitry Andric # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 90*0fca6ea1SDimitry Andric # if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 91*0fca6ea1SDimitry Andric # define STDCALL /* not supported on x86_64 platform */ 92*0fca6ea1SDimitry Andric # else /* _M_X64 || _M_AMD64 || __x86_64__ */ 93*0fca6ea1SDimitry Andric # define STDCALL __attribute__ ((stdcall)) 94*0fca6ea1SDimitry Andric # endif /* _M_X64 || _M_AMD64 || __x86_64__ */ 95*0fca6ea1SDimitry Andric # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 96*0fca6ea1SDimitry Andric #endif /* STDCALL */ 97*0fca6ea1SDimitry Andric 98*0fca6ea1SDimitry Andric #define ITTAPI CDECL 99*0fca6ea1SDimitry Andric #define LIBITTAPI CDECL 100*0fca6ea1SDimitry Andric 101*0fca6ea1SDimitry Andric /* TODO: Temporary for compatibility! */ 102*0fca6ea1SDimitry Andric #define ITTAPI_CALL CDECL 103*0fca6ea1SDimitry Andric #define LIBITTAPI_CALL CDECL 104*0fca6ea1SDimitry Andric 105*0fca6ea1SDimitry Andric #if ITT_PLATFORM==ITT_PLATFORM_WIN 106*0fca6ea1SDimitry Andric /* use __forceinline (VC++ specific) */ 107*0fca6ea1SDimitry Andric #define ITT_INLINE __forceinline 108*0fca6ea1SDimitry Andric #define ITT_INLINE_ATTRIBUTE /* nothing */ 109*0fca6ea1SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 110*0fca6ea1SDimitry Andric /* 111*0fca6ea1SDimitry Andric * Generally, functions are not inlined unless optimization is specified. 112*0fca6ea1SDimitry Andric * For functions declared inline, this attribute inlines the function even 113*0fca6ea1SDimitry Andric * if no optimization level was specified. 114*0fca6ea1SDimitry Andric */ 115*0fca6ea1SDimitry Andric #ifdef __STRICT_ANSI__ 116*0fca6ea1SDimitry Andric #define ITT_INLINE static 117*0fca6ea1SDimitry Andric #else /* __STRICT_ANSI__ */ 118*0fca6ea1SDimitry Andric #define ITT_INLINE static inline 119*0fca6ea1SDimitry Andric #endif /* __STRICT_ANSI__ */ 120*0fca6ea1SDimitry Andric #define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline)) 121*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 122*0fca6ea1SDimitry Andric /** @endcond */ 123*0fca6ea1SDimitry Andric 124*0fca6ea1SDimitry Andric #ifndef ITT_ARCH_IA32 125*0fca6ea1SDimitry Andric # define ITT_ARCH_IA32 1 126*0fca6ea1SDimitry Andric #endif /* ITT_ARCH_IA32 */ 127*0fca6ea1SDimitry Andric 128*0fca6ea1SDimitry Andric #ifndef ITT_ARCH_IA32E 129*0fca6ea1SDimitry Andric # define ITT_ARCH_IA32E 2 130*0fca6ea1SDimitry Andric #endif /* ITT_ARCH_IA32E */ 131*0fca6ea1SDimitry Andric 132*0fca6ea1SDimitry Andric #ifndef ITT_ARCH_IA64 133*0fca6ea1SDimitry Andric # define ITT_ARCH_IA64 3 134*0fca6ea1SDimitry Andric #endif /* ITT_ARCH_IA64 */ 135*0fca6ea1SDimitry Andric 136*0fca6ea1SDimitry Andric #ifndef ITT_ARCH 137*0fca6ea1SDimitry Andric # if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 138*0fca6ea1SDimitry Andric # define ITT_ARCH ITT_ARCH_IA32E 139*0fca6ea1SDimitry Andric # elif defined _M_IA64 || defined __ia64 140*0fca6ea1SDimitry Andric # define ITT_ARCH ITT_ARCH_IA64 141*0fca6ea1SDimitry Andric # else 142*0fca6ea1SDimitry Andric # define ITT_ARCH ITT_ARCH_IA32 143*0fca6ea1SDimitry Andric # endif 144*0fca6ea1SDimitry Andric #endif 145*0fca6ea1SDimitry Andric 146*0fca6ea1SDimitry Andric #ifdef __cplusplus 147*0fca6ea1SDimitry Andric # define ITT_EXTERN_C extern "C" 148*0fca6ea1SDimitry Andric #else 149*0fca6ea1SDimitry Andric # define ITT_EXTERN_C /* nothing */ 150*0fca6ea1SDimitry Andric #endif /* __cplusplus */ 151*0fca6ea1SDimitry Andric 152*0fca6ea1SDimitry Andric #define ITT_TO_STR_AUX(x) #x 153*0fca6ea1SDimitry Andric #define ITT_TO_STR(x) ITT_TO_STR_AUX(x) 154*0fca6ea1SDimitry Andric 155*0fca6ea1SDimitry Andric #define __ITT_BUILD_ASSERT(expr, suffix) do { \ 156*0fca6ea1SDimitry Andric static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \ 157*0fca6ea1SDimitry Andric __itt_build_check_##suffix[0] = 0; \ 158*0fca6ea1SDimitry Andric } while(0) 159*0fca6ea1SDimitry Andric #define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix) 160*0fca6ea1SDimitry Andric #define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__) 161*0fca6ea1SDimitry Andric 162*0fca6ea1SDimitry Andric #define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 } 163*0fca6ea1SDimitry Andric 164*0fca6ea1SDimitry Andric /* Replace with snapshot date YYYYMMDD for promotion build. */ 165*0fca6ea1SDimitry Andric #define API_VERSION_BUILD 20111111 166*0fca6ea1SDimitry Andric 167*0fca6ea1SDimitry Andric #ifndef API_VERSION_NUM 168*0fca6ea1SDimitry Andric #define API_VERSION_NUM 0.0.0 169*0fca6ea1SDimitry Andric #endif /* API_VERSION_NUM */ 170*0fca6ea1SDimitry Andric 171*0fca6ea1SDimitry Andric #define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \ 172*0fca6ea1SDimitry Andric " (" ITT_TO_STR(API_VERSION_BUILD) ")" 173*0fca6ea1SDimitry Andric 174*0fca6ea1SDimitry Andric /* OS communication functions */ 175*0fca6ea1SDimitry Andric #if ITT_PLATFORM==ITT_PLATFORM_WIN 176*0fca6ea1SDimitry Andric #include <windows.h> 177*0fca6ea1SDimitry Andric typedef HMODULE lib_t; 178*0fca6ea1SDimitry Andric typedef DWORD TIDT; 179*0fca6ea1SDimitry Andric typedef CRITICAL_SECTION mutex_t; 180*0fca6ea1SDimitry Andric #define MUTEX_INITIALIZER { 0 } 181*0fca6ea1SDimitry Andric #define strong_alias(name, aliasname) /* empty for Windows */ 182*0fca6ea1SDimitry Andric #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 183*0fca6ea1SDimitry Andric #include <dlfcn.h> 184*0fca6ea1SDimitry Andric #if defined(UNICODE) || defined(_UNICODE) 185*0fca6ea1SDimitry Andric #include <wchar.h> 186*0fca6ea1SDimitry Andric #endif /* UNICODE */ 187*0fca6ea1SDimitry Andric #ifndef _GNU_SOURCE 188*0fca6ea1SDimitry Andric #define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */ 189*0fca6ea1SDimitry Andric #endif /* _GNU_SOURCE */ 190*0fca6ea1SDimitry Andric #include <pthread.h> 191*0fca6ea1SDimitry Andric typedef void* lib_t; 192*0fca6ea1SDimitry Andric typedef pthread_t TIDT; 193*0fca6ea1SDimitry Andric typedef pthread_mutex_t mutex_t; 194*0fca6ea1SDimitry Andric #define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 195*0fca6ea1SDimitry Andric #define _strong_alias(name, aliasname) \ 196*0fca6ea1SDimitry Andric extern __typeof (name) aliasname __attribute__ ((alias (#name))); 197*0fca6ea1SDimitry Andric #define strong_alias(name, aliasname) _strong_alias(name, aliasname) 198*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 199*0fca6ea1SDimitry Andric 200*0fca6ea1SDimitry Andric #if ITT_PLATFORM==ITT_PLATFORM_WIN 201*0fca6ea1SDimitry Andric #define __itt_get_proc(lib, name) GetProcAddress(lib, name) 202*0fca6ea1SDimitry Andric #define __itt_mutex_init(mutex) InitializeCriticalSection(mutex) 203*0fca6ea1SDimitry Andric #define __itt_mutex_lock(mutex) EnterCriticalSection(mutex) 204*0fca6ea1SDimitry Andric #define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex) 205*0fca6ea1SDimitry Andric #define __itt_load_lib(name) LoadLibraryA(name) 206*0fca6ea1SDimitry Andric #define __itt_unload_lib(handle) FreeLibrary(handle) 207*0fca6ea1SDimitry Andric #define __itt_system_error() (int)GetLastError() 208*0fca6ea1SDimitry Andric #define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2) 209*0fca6ea1SDimitry Andric #define __itt_fstrlen(s) lstrlenA(s) 210*0fca6ea1SDimitry Andric #define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l) 211*0fca6ea1SDimitry Andric #define __itt_fstrdup(s) _strdup(s) 212*0fca6ea1SDimitry Andric #define __itt_thread_id() GetCurrentThreadId() 213*0fca6ea1SDimitry Andric #define __itt_thread_yield() SwitchToThread() 214*0fca6ea1SDimitry Andric #ifndef ITT_SIMPLE_INIT 215*0fca6ea1SDimitry Andric ITT_INLINE long 216*0fca6ea1SDimitry Andric __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; 217*0fca6ea1SDimitry Andric ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) 218*0fca6ea1SDimitry Andric { 219*0fca6ea1SDimitry Andric return InterlockedIncrement(ptr); 220*0fca6ea1SDimitry Andric } 221*0fca6ea1SDimitry Andric #endif /* ITT_SIMPLE_INIT */ 222*0fca6ea1SDimitry Andric #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ 223*0fca6ea1SDimitry Andric #define __itt_get_proc(lib, name) dlsym(lib, name) 224*0fca6ea1SDimitry Andric #define __itt_mutex_init(mutex) {\ 225*0fca6ea1SDimitry Andric pthread_mutexattr_t mutex_attr; \ 226*0fca6ea1SDimitry Andric int error_code = pthread_mutexattr_init(&mutex_attr); \ 227*0fca6ea1SDimitry Andric if (error_code) \ 228*0fca6ea1SDimitry Andric __itt_report_error(__itt_error_system, "pthread_mutexattr_init", \ 229*0fca6ea1SDimitry Andric error_code); \ 230*0fca6ea1SDimitry Andric error_code = pthread_mutexattr_settype(&mutex_attr, \ 231*0fca6ea1SDimitry Andric PTHREAD_MUTEX_RECURSIVE); \ 232*0fca6ea1SDimitry Andric if (error_code) \ 233*0fca6ea1SDimitry Andric __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \ 234*0fca6ea1SDimitry Andric error_code); \ 235*0fca6ea1SDimitry Andric error_code = pthread_mutex_init(mutex, &mutex_attr); \ 236*0fca6ea1SDimitry Andric if (error_code) \ 237*0fca6ea1SDimitry Andric __itt_report_error(__itt_error_system, "pthread_mutex_init", \ 238*0fca6ea1SDimitry Andric error_code); \ 239*0fca6ea1SDimitry Andric error_code = pthread_mutexattr_destroy(&mutex_attr); \ 240*0fca6ea1SDimitry Andric if (error_code) \ 241*0fca6ea1SDimitry Andric __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \ 242*0fca6ea1SDimitry Andric error_code); \ 243*0fca6ea1SDimitry Andric } 244*0fca6ea1SDimitry Andric #define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex) 245*0fca6ea1SDimitry Andric #define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex) 246*0fca6ea1SDimitry Andric #define __itt_load_lib(name) dlopen(name, RTLD_LAZY) 247*0fca6ea1SDimitry Andric #define __itt_unload_lib(handle) dlclose(handle) 248*0fca6ea1SDimitry Andric #define __itt_system_error() errno 249*0fca6ea1SDimitry Andric #define __itt_fstrcmp(s1, s2) strcmp(s1, s2) 250*0fca6ea1SDimitry Andric #define __itt_fstrlen(s) strlen(s) 251*0fca6ea1SDimitry Andric #define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l) 252*0fca6ea1SDimitry Andric #define __itt_fstrdup(s) strdup(s) 253*0fca6ea1SDimitry Andric #define __itt_thread_id() pthread_self() 254*0fca6ea1SDimitry Andric #define __itt_thread_yield() sched_yield() 255*0fca6ea1SDimitry Andric #if ITT_ARCH==ITT_ARCH_IA64 256*0fca6ea1SDimitry Andric #ifdef __INTEL_COMPILER 257*0fca6ea1SDimitry Andric #define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val) 258*0fca6ea1SDimitry Andric #else /* __INTEL_COMPILER */ 259*0fca6ea1SDimitry Andric /* TODO: Add Support for not Intel compilers for IA64 */ 260*0fca6ea1SDimitry Andric #endif /* __INTEL_COMPILER */ 261*0fca6ea1SDimitry Andric #else /* ITT_ARCH!=ITT_ARCH_IA64 */ 262*0fca6ea1SDimitry Andric ITT_INLINE long 263*0fca6ea1SDimitry Andric __TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE; 264*0fca6ea1SDimitry Andric ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend) 265*0fca6ea1SDimitry Andric { 266*0fca6ea1SDimitry Andric long result; 267*0fca6ea1SDimitry Andric __asm__ __volatile__("lock\nxadd %0,%1" 268*0fca6ea1SDimitry Andric : "=r"(result),"=m"(*(long*)ptr) 269*0fca6ea1SDimitry Andric : "0"(addend), "m"(*(long*)ptr) 270*0fca6ea1SDimitry Andric : "memory"); 271*0fca6ea1SDimitry Andric return result; 272*0fca6ea1SDimitry Andric } 273*0fca6ea1SDimitry Andric #endif /* ITT_ARCH==ITT_ARCH_IA64 */ 274*0fca6ea1SDimitry Andric #ifndef ITT_SIMPLE_INIT 275*0fca6ea1SDimitry Andric ITT_INLINE long 276*0fca6ea1SDimitry Andric __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; 277*0fca6ea1SDimitry Andric ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) 278*0fca6ea1SDimitry Andric { 279*0fca6ea1SDimitry Andric return __TBB_machine_fetchadd4(ptr, 1) + 1L; 280*0fca6ea1SDimitry Andric } 281*0fca6ea1SDimitry Andric #endif /* ITT_SIMPLE_INIT */ 282*0fca6ea1SDimitry Andric #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 283*0fca6ea1SDimitry Andric 284*0fca6ea1SDimitry Andric typedef enum { 285*0fca6ea1SDimitry Andric __itt_collection_normal = 0, 286*0fca6ea1SDimitry Andric __itt_collection_paused = 1 287*0fca6ea1SDimitry Andric } __itt_collection_state; 288*0fca6ea1SDimitry Andric 289*0fca6ea1SDimitry Andric typedef enum { 290*0fca6ea1SDimitry Andric __itt_thread_normal = 0, 291*0fca6ea1SDimitry Andric __itt_thread_ignored = 1 292*0fca6ea1SDimitry Andric } __itt_thread_state; 293*0fca6ea1SDimitry Andric 294*0fca6ea1SDimitry Andric #pragma pack(push, 8) 295*0fca6ea1SDimitry Andric 296*0fca6ea1SDimitry Andric typedef struct ___itt_thread_info 297*0fca6ea1SDimitry Andric { 298*0fca6ea1SDimitry Andric const char* nameA; /*!< Copy of original name in ASCII. */ 299*0fca6ea1SDimitry Andric #if defined(UNICODE) || defined(_UNICODE) 300*0fca6ea1SDimitry Andric const wchar_t* nameW; /*!< Copy of original name in UNICODE. */ 301*0fca6ea1SDimitry Andric #else /* UNICODE || _UNICODE */ 302*0fca6ea1SDimitry Andric void* nameW; 303*0fca6ea1SDimitry Andric #endif /* UNICODE || _UNICODE */ 304*0fca6ea1SDimitry Andric TIDT tid; 305*0fca6ea1SDimitry Andric __itt_thread_state state; /*!< Thread state (paused or normal) */ 306*0fca6ea1SDimitry Andric int extra1; /*!< Reserved to the runtime */ 307*0fca6ea1SDimitry Andric void* extra2; /*!< Reserved to the runtime */ 308*0fca6ea1SDimitry Andric struct ___itt_thread_info* next; 309*0fca6ea1SDimitry Andric } __itt_thread_info; 310*0fca6ea1SDimitry Andric 311*0fca6ea1SDimitry Andric #include "ittnotify_types.h" /* For __itt_group_id definition */ 312*0fca6ea1SDimitry Andric 313*0fca6ea1SDimitry Andric typedef struct ___itt_api_info_20101001 314*0fca6ea1SDimitry Andric { 315*0fca6ea1SDimitry Andric const char* name; 316*0fca6ea1SDimitry Andric void** func_ptr; 317*0fca6ea1SDimitry Andric void* init_func; 318*0fca6ea1SDimitry Andric __itt_group_id group; 319*0fca6ea1SDimitry Andric } __itt_api_info_20101001; 320*0fca6ea1SDimitry Andric 321*0fca6ea1SDimitry Andric typedef struct ___itt_api_info 322*0fca6ea1SDimitry Andric { 323*0fca6ea1SDimitry Andric const char* name; 324*0fca6ea1SDimitry Andric void** func_ptr; 325*0fca6ea1SDimitry Andric void* init_func; 326*0fca6ea1SDimitry Andric void* null_func; 327*0fca6ea1SDimitry Andric __itt_group_id group; 328*0fca6ea1SDimitry Andric } __itt_api_info; 329*0fca6ea1SDimitry Andric 330*0fca6ea1SDimitry Andric struct ___itt_domain; 331*0fca6ea1SDimitry Andric struct ___itt_string_handle; 332*0fca6ea1SDimitry Andric 333*0fca6ea1SDimitry Andric typedef struct ___itt_global 334*0fca6ea1SDimitry Andric { 335*0fca6ea1SDimitry Andric unsigned char magic[8]; 336*0fca6ea1SDimitry Andric unsigned long version_major; 337*0fca6ea1SDimitry Andric unsigned long version_minor; 338*0fca6ea1SDimitry Andric unsigned long version_build; 339*0fca6ea1SDimitry Andric volatile long api_initialized; 340*0fca6ea1SDimitry Andric volatile long mutex_initialized; 341*0fca6ea1SDimitry Andric volatile long atomic_counter; 342*0fca6ea1SDimitry Andric mutex_t mutex; 343*0fca6ea1SDimitry Andric lib_t lib; 344*0fca6ea1SDimitry Andric void* error_handler; 345*0fca6ea1SDimitry Andric const char** dll_path_ptr; 346*0fca6ea1SDimitry Andric __itt_api_info* api_list_ptr; 347*0fca6ea1SDimitry Andric struct ___itt_global* next; 348*0fca6ea1SDimitry Andric /* Joinable structures below */ 349*0fca6ea1SDimitry Andric __itt_thread_info* thread_list; 350*0fca6ea1SDimitry Andric struct ___itt_domain* domain_list; 351*0fca6ea1SDimitry Andric struct ___itt_string_handle* string_list; 352*0fca6ea1SDimitry Andric __itt_collection_state state; 353*0fca6ea1SDimitry Andric } __itt_global; 354*0fca6ea1SDimitry Andric 355*0fca6ea1SDimitry Andric #pragma pack(pop) 356*0fca6ea1SDimitry Andric 357*0fca6ea1SDimitry Andric #define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \ 358*0fca6ea1SDimitry Andric h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ 359*0fca6ea1SDimitry Andric if (h != NULL) { \ 360*0fca6ea1SDimitry Andric h->tid = t; \ 361*0fca6ea1SDimitry Andric h->nameA = NULL; \ 362*0fca6ea1SDimitry Andric h->nameW = n ? _wcsdup(n) : NULL; \ 363*0fca6ea1SDimitry Andric h->state = s; \ 364*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 365*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 366*0fca6ea1SDimitry Andric h->next = NULL; \ 367*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 368*0fca6ea1SDimitry Andric (gptr)->thread_list = h; \ 369*0fca6ea1SDimitry Andric else \ 370*0fca6ea1SDimitry Andric h_tail->next = h; \ 371*0fca6ea1SDimitry Andric } \ 372*0fca6ea1SDimitry Andric } 373*0fca6ea1SDimitry Andric 374*0fca6ea1SDimitry Andric #define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \ 375*0fca6ea1SDimitry Andric h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ 376*0fca6ea1SDimitry Andric if (h != NULL) { \ 377*0fca6ea1SDimitry Andric h->tid = t; \ 378*0fca6ea1SDimitry Andric h->nameA = n ? __itt_fstrdup(n) : NULL; \ 379*0fca6ea1SDimitry Andric h->nameW = NULL; \ 380*0fca6ea1SDimitry Andric h->state = s; \ 381*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 382*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 383*0fca6ea1SDimitry Andric h->next = NULL; \ 384*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 385*0fca6ea1SDimitry Andric (gptr)->thread_list = h; \ 386*0fca6ea1SDimitry Andric else \ 387*0fca6ea1SDimitry Andric h_tail->next = h; \ 388*0fca6ea1SDimitry Andric } \ 389*0fca6ea1SDimitry Andric } 390*0fca6ea1SDimitry Andric 391*0fca6ea1SDimitry Andric #define NEW_DOMAIN_W(gptr,h,h_tail,name) { \ 392*0fca6ea1SDimitry Andric h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ 393*0fca6ea1SDimitry Andric if (h != NULL) { \ 394*0fca6ea1SDimitry Andric h->flags = 0; /* domain is disabled by default */ \ 395*0fca6ea1SDimitry Andric h->nameA = NULL; \ 396*0fca6ea1SDimitry Andric h->nameW = name ? _wcsdup(name) : NULL; \ 397*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 398*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 399*0fca6ea1SDimitry Andric h->next = NULL; \ 400*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 401*0fca6ea1SDimitry Andric (gptr)->domain_list = h; \ 402*0fca6ea1SDimitry Andric else \ 403*0fca6ea1SDimitry Andric h_tail->next = h; \ 404*0fca6ea1SDimitry Andric } \ 405*0fca6ea1SDimitry Andric } 406*0fca6ea1SDimitry Andric 407*0fca6ea1SDimitry Andric #define NEW_DOMAIN_A(gptr,h,h_tail,name) { \ 408*0fca6ea1SDimitry Andric h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ 409*0fca6ea1SDimitry Andric if (h != NULL) { \ 410*0fca6ea1SDimitry Andric h->flags = 0; /* domain is disabled by default */ \ 411*0fca6ea1SDimitry Andric h->nameA = name ? __itt_fstrdup(name) : NULL; \ 412*0fca6ea1SDimitry Andric h->nameW = NULL; \ 413*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 414*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 415*0fca6ea1SDimitry Andric h->next = NULL; \ 416*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 417*0fca6ea1SDimitry Andric (gptr)->domain_list = h; \ 418*0fca6ea1SDimitry Andric else \ 419*0fca6ea1SDimitry Andric h_tail->next = h; \ 420*0fca6ea1SDimitry Andric } \ 421*0fca6ea1SDimitry Andric } 422*0fca6ea1SDimitry Andric 423*0fca6ea1SDimitry Andric #define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \ 424*0fca6ea1SDimitry Andric h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ 425*0fca6ea1SDimitry Andric if (h != NULL) { \ 426*0fca6ea1SDimitry Andric h->strA = NULL; \ 427*0fca6ea1SDimitry Andric h->strW = name ? _wcsdup(name) : NULL; \ 428*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 429*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 430*0fca6ea1SDimitry Andric h->next = NULL; \ 431*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 432*0fca6ea1SDimitry Andric (gptr)->string_list = h; \ 433*0fca6ea1SDimitry Andric else \ 434*0fca6ea1SDimitry Andric h_tail->next = h; \ 435*0fca6ea1SDimitry Andric } \ 436*0fca6ea1SDimitry Andric } 437*0fca6ea1SDimitry Andric 438*0fca6ea1SDimitry Andric #define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \ 439*0fca6ea1SDimitry Andric h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ 440*0fca6ea1SDimitry Andric if (h != NULL) { \ 441*0fca6ea1SDimitry Andric h->strA = name ? __itt_fstrdup(name) : NULL; \ 442*0fca6ea1SDimitry Andric h->strW = NULL; \ 443*0fca6ea1SDimitry Andric h->extra1 = 0; /* reserved */ \ 444*0fca6ea1SDimitry Andric h->extra2 = NULL; /* reserved */ \ 445*0fca6ea1SDimitry Andric h->next = NULL; \ 446*0fca6ea1SDimitry Andric if (h_tail == NULL) \ 447*0fca6ea1SDimitry Andric (gptr)->string_list = h; \ 448*0fca6ea1SDimitry Andric else \ 449*0fca6ea1SDimitry Andric h_tail->next = h; \ 450*0fca6ea1SDimitry Andric } \ 451*0fca6ea1SDimitry Andric } 452*0fca6ea1SDimitry Andric 453*0fca6ea1SDimitry Andric #endif /* _ITTNOTIFY_CONFIG_H_ */ 454