1243789Sdim/*===-- ittnotify_config.h - JIT Profiling API internal config-----*- C -*-===* 2243789Sdim * 3243789Sdim * The LLVM Compiler Infrastructure 4243789Sdim * 5243789Sdim * This file is distributed under the University of Illinois Open Source 6243789Sdim * License. See LICENSE.TXT for details. 7243789Sdim * 8243789Sdim *===----------------------------------------------------------------------===* 9243789Sdim * 10243789Sdim * This file provides Intel(R) Performance Analyzer JIT (Just-In-Time) 11243789Sdim * Profiling API internal config. 12243789Sdim * 13243789Sdim * NOTE: This file comes in a style different from the rest of LLVM 14243789Sdim * source base since this is a piece of code shared from Intel(R) 15243789Sdim * products. Please do not reformat / re-style this code to make 16243789Sdim * subsequent merges and contributions from the original source base eaiser. 17243789Sdim * 18243789Sdim *===----------------------------------------------------------------------===*/ 19243789Sdim#ifndef _ITTNOTIFY_CONFIG_H_ 20243789Sdim#define _ITTNOTIFY_CONFIG_H_ 21243789Sdim 22243789Sdim/** @cond exclude_from_documentation */ 23243789Sdim#ifndef ITT_OS_WIN 24243789Sdim# define ITT_OS_WIN 1 25243789Sdim#endif /* ITT_OS_WIN */ 26243789Sdim 27243789Sdim#ifndef ITT_OS_LINUX 28243789Sdim# define ITT_OS_LINUX 2 29243789Sdim#endif /* ITT_OS_LINUX */ 30243789Sdim 31243789Sdim#ifndef ITT_OS_MAC 32243789Sdim# define ITT_OS_MAC 3 33243789Sdim#endif /* ITT_OS_MAC */ 34243789Sdim 35243789Sdim#ifndef ITT_OS 36243789Sdim# if defined WIN32 || defined _WIN32 37243789Sdim# define ITT_OS ITT_OS_WIN 38243789Sdim# elif defined( __APPLE__ ) && defined( __MACH__ ) 39243789Sdim# define ITT_OS ITT_OS_MAC 40243789Sdim# else 41243789Sdim# define ITT_OS ITT_OS_LINUX 42243789Sdim# endif 43243789Sdim#endif /* ITT_OS */ 44243789Sdim 45243789Sdim#ifndef ITT_PLATFORM_WIN 46243789Sdim# define ITT_PLATFORM_WIN 1 47243789Sdim#endif /* ITT_PLATFORM_WIN */ 48243789Sdim 49243789Sdim#ifndef ITT_PLATFORM_POSIX 50243789Sdim# define ITT_PLATFORM_POSIX 2 51243789Sdim#endif /* ITT_PLATFORM_POSIX */ 52243789Sdim 53243789Sdim#ifndef ITT_PLATFORM 54243789Sdim# if ITT_OS==ITT_OS_WIN 55243789Sdim# define ITT_PLATFORM ITT_PLATFORM_WIN 56243789Sdim# else 57243789Sdim# define ITT_PLATFORM ITT_PLATFORM_POSIX 58243789Sdim# endif /* _WIN32 */ 59243789Sdim#endif /* ITT_PLATFORM */ 60243789Sdim 61243789Sdim#if defined(_UNICODE) && !defined(UNICODE) 62243789Sdim#define UNICODE 63243789Sdim#endif 64243789Sdim 65243789Sdim#include <stddef.h> 66243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN 67243789Sdim#include <tchar.h> 68243789Sdim#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 69243789Sdim#include <stdint.h> 70243789Sdim#if defined(UNICODE) || defined(_UNICODE) 71243789Sdim#include <wchar.h> 72243789Sdim#endif /* UNICODE || _UNICODE */ 73243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 74243789Sdim 75243789Sdim#ifndef CDECL 76243789Sdim# if ITT_PLATFORM==ITT_PLATFORM_WIN 77243789Sdim# define CDECL __cdecl 78243789Sdim# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 79243789Sdim# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 80243789Sdim# define CDECL /* not actual on x86_64 platform */ 81243789Sdim# else /* _M_X64 || _M_AMD64 || __x86_64__ */ 82243789Sdim# define CDECL __attribute__ ((cdecl)) 83243789Sdim# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ 84243789Sdim# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 85243789Sdim#endif /* CDECL */ 86243789Sdim 87243789Sdim#ifndef STDCALL 88243789Sdim# if ITT_PLATFORM==ITT_PLATFORM_WIN 89243789Sdim# define STDCALL __stdcall 90243789Sdim# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 91243789Sdim# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 92243789Sdim# define STDCALL /* not supported on x86_64 platform */ 93243789Sdim# else /* _M_X64 || _M_AMD64 || __x86_64__ */ 94243789Sdim# define STDCALL __attribute__ ((stdcall)) 95243789Sdim# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ 96243789Sdim# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 97243789Sdim#endif /* STDCALL */ 98243789Sdim 99243789Sdim#define ITTAPI CDECL 100243789Sdim#define LIBITTAPI CDECL 101243789Sdim 102243789Sdim/* TODO: Temporary for compatibility! */ 103243789Sdim#define ITTAPI_CALL CDECL 104243789Sdim#define LIBITTAPI_CALL CDECL 105243789Sdim 106243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN 107243789Sdim/* use __forceinline (VC++ specific) */ 108243789Sdim#define ITT_INLINE __forceinline 109243789Sdim#define ITT_INLINE_ATTRIBUTE /* nothing */ 110243789Sdim#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 111243789Sdim/* 112243789Sdim * Generally, functions are not inlined unless optimization is specified. 113243789Sdim * For functions declared inline, this attribute inlines the function even 114243789Sdim * if no optimization level was specified. 115243789Sdim */ 116243789Sdim#ifdef __STRICT_ANSI__ 117243789Sdim#define ITT_INLINE static 118243789Sdim#else /* __STRICT_ANSI__ */ 119243789Sdim#define ITT_INLINE static inline 120243789Sdim#endif /* __STRICT_ANSI__ */ 121243789Sdim#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline)) 122243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 123243789Sdim/** @endcond */ 124243789Sdim 125243789Sdim#ifndef ITT_ARCH_IA32 126243789Sdim# define ITT_ARCH_IA32 1 127243789Sdim#endif /* ITT_ARCH_IA32 */ 128243789Sdim 129243789Sdim#ifndef ITT_ARCH_IA32E 130243789Sdim# define ITT_ARCH_IA32E 2 131243789Sdim#endif /* ITT_ARCH_IA32E */ 132243789Sdim 133243789Sdim#ifndef ITT_ARCH_IA64 134243789Sdim# define ITT_ARCH_IA64 3 135243789Sdim#endif /* ITT_ARCH_IA64 */ 136243789Sdim 137243789Sdim#ifndef ITT_ARCH 138243789Sdim# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ 139243789Sdim# define ITT_ARCH ITT_ARCH_IA32E 140243789Sdim# elif defined _M_IA64 || defined __ia64 141243789Sdim# define ITT_ARCH ITT_ARCH_IA64 142243789Sdim# else 143243789Sdim# define ITT_ARCH ITT_ARCH_IA32 144243789Sdim# endif 145243789Sdim#endif 146243789Sdim 147243789Sdim#ifdef __cplusplus 148243789Sdim# define ITT_EXTERN_C extern "C" 149243789Sdim#else 150243789Sdim# define ITT_EXTERN_C /* nothing */ 151243789Sdim#endif /* __cplusplus */ 152243789Sdim 153243789Sdim#define ITT_TO_STR_AUX(x) #x 154243789Sdim#define ITT_TO_STR(x) ITT_TO_STR_AUX(x) 155243789Sdim 156243789Sdim#define __ITT_BUILD_ASSERT(expr, suffix) do { \ 157243789Sdim static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \ 158243789Sdim __itt_build_check_##suffix[0] = 0; \ 159243789Sdim} while(0) 160243789Sdim#define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix) 161243789Sdim#define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__) 162243789Sdim 163243789Sdim#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 } 164243789Sdim 165243789Sdim/* Replace with snapshot date YYYYMMDD for promotion build. */ 166243789Sdim#define API_VERSION_BUILD 20111111 167243789Sdim 168243789Sdim#ifndef API_VERSION_NUM 169243789Sdim#define API_VERSION_NUM 0.0.0 170243789Sdim#endif /* API_VERSION_NUM */ 171243789Sdim 172243789Sdim#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \ 173243789Sdim " (" ITT_TO_STR(API_VERSION_BUILD) ")" 174243789Sdim 175243789Sdim/* OS communication functions */ 176243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN 177243789Sdim#include <windows.h> 178243789Sdimtypedef HMODULE lib_t; 179243789Sdimtypedef DWORD TIDT; 180243789Sdimtypedef CRITICAL_SECTION mutex_t; 181243789Sdim#define MUTEX_INITIALIZER { 0 } 182243789Sdim#define strong_alias(name, aliasname) /* empty for Windows */ 183243789Sdim#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 184243789Sdim#include <dlfcn.h> 185243789Sdim#if defined(UNICODE) || defined(_UNICODE) 186243789Sdim#include <wchar.h> 187243789Sdim#endif /* UNICODE */ 188243789Sdim#ifndef _GNU_SOURCE 189243789Sdim#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */ 190243789Sdim#endif /* _GNU_SOURCE */ 191243789Sdim#include <pthread.h> 192243789Sdimtypedef void* lib_t; 193243789Sdimtypedef pthread_t TIDT; 194243789Sdimtypedef pthread_mutex_t mutex_t; 195243789Sdim#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 196243789Sdim#define _strong_alias(name, aliasname) \ 197243789Sdim extern __typeof (name) aliasname __attribute__ ((alias (#name))); 198243789Sdim#define strong_alias(name, aliasname) _strong_alias(name, aliasname) 199243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 200243789Sdim 201243789Sdim#if ITT_PLATFORM==ITT_PLATFORM_WIN 202243789Sdim#define __itt_get_proc(lib, name) GetProcAddress(lib, name) 203243789Sdim#define __itt_mutex_init(mutex) InitializeCriticalSection(mutex) 204243789Sdim#define __itt_mutex_lock(mutex) EnterCriticalSection(mutex) 205243789Sdim#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex) 206243789Sdim#define __itt_load_lib(name) LoadLibraryA(name) 207243789Sdim#define __itt_unload_lib(handle) FreeLibrary(handle) 208243789Sdim#define __itt_system_error() (int)GetLastError() 209243789Sdim#define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2) 210243789Sdim#define __itt_fstrlen(s) lstrlenA(s) 211243789Sdim#define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l) 212243789Sdim#define __itt_fstrdup(s) _strdup(s) 213243789Sdim#define __itt_thread_id() GetCurrentThreadId() 214243789Sdim#define __itt_thread_yield() SwitchToThread() 215243789Sdim#ifndef ITT_SIMPLE_INIT 216243789SdimITT_INLINE long 217243789Sdim__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; 218243789SdimITT_INLINE long __itt_interlocked_increment(volatile long* ptr) 219243789Sdim{ 220243789Sdim return InterlockedIncrement(ptr); 221243789Sdim} 222243789Sdim#endif /* ITT_SIMPLE_INIT */ 223243789Sdim#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ 224243789Sdim#define __itt_get_proc(lib, name) dlsym(lib, name) 225243789Sdim#define __itt_mutex_init(mutex) {\ 226243789Sdim pthread_mutexattr_t mutex_attr; \ 227243789Sdim int error_code = pthread_mutexattr_init(&mutex_attr); \ 228243789Sdim if (error_code) \ 229243789Sdim __itt_report_error(__itt_error_system, "pthread_mutexattr_init", \ 230243789Sdim error_code); \ 231243789Sdim error_code = pthread_mutexattr_settype(&mutex_attr, \ 232243789Sdim PTHREAD_MUTEX_RECURSIVE); \ 233243789Sdim if (error_code) \ 234243789Sdim __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \ 235243789Sdim error_code); \ 236243789Sdim error_code = pthread_mutex_init(mutex, &mutex_attr); \ 237243789Sdim if (error_code) \ 238243789Sdim __itt_report_error(__itt_error_system, "pthread_mutex_init", \ 239243789Sdim error_code); \ 240243789Sdim error_code = pthread_mutexattr_destroy(&mutex_attr); \ 241243789Sdim if (error_code) \ 242243789Sdim __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \ 243243789Sdim error_code); \ 244243789Sdim} 245243789Sdim#define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex) 246243789Sdim#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex) 247243789Sdim#define __itt_load_lib(name) dlopen(name, RTLD_LAZY) 248243789Sdim#define __itt_unload_lib(handle) dlclose(handle) 249243789Sdim#define __itt_system_error() errno 250243789Sdim#define __itt_fstrcmp(s1, s2) strcmp(s1, s2) 251243789Sdim#define __itt_fstrlen(s) strlen(s) 252243789Sdim#define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l) 253243789Sdim#define __itt_fstrdup(s) strdup(s) 254243789Sdim#define __itt_thread_id() pthread_self() 255243789Sdim#define __itt_thread_yield() sched_yield() 256243789Sdim#if ITT_ARCH==ITT_ARCH_IA64 257243789Sdim#ifdef __INTEL_COMPILER 258243789Sdim#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val) 259243789Sdim#else /* __INTEL_COMPILER */ 260243789Sdim/* TODO: Add Support for not Intel compilers for IA64 */ 261243789Sdim#endif /* __INTEL_COMPILER */ 262243789Sdim#else /* ITT_ARCH!=ITT_ARCH_IA64 */ 263243789SdimITT_INLINE long 264243789Sdim__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE; 265243789SdimITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend) 266243789Sdim{ 267243789Sdim long result; 268243789Sdim __asm__ __volatile__("lock\nxadd %0,%1" 269243789Sdim : "=r"(result),"=m"(*(long*)ptr) 270243789Sdim : "0"(addend), "m"(*(long*)ptr) 271243789Sdim : "memory"); 272243789Sdim return result; 273243789Sdim} 274243789Sdim#endif /* ITT_ARCH==ITT_ARCH_IA64 */ 275243789Sdim#ifndef ITT_SIMPLE_INIT 276243789SdimITT_INLINE long 277243789Sdim__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; 278243789SdimITT_INLINE long __itt_interlocked_increment(volatile long* ptr) 279243789Sdim{ 280243789Sdim return __TBB_machine_fetchadd4(ptr, 1) + 1L; 281243789Sdim} 282243789Sdim#endif /* ITT_SIMPLE_INIT */ 283243789Sdim#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 284243789Sdim 285243789Sdimtypedef enum { 286243789Sdim __itt_collection_normal = 0, 287243789Sdim __itt_collection_paused = 1 288243789Sdim} __itt_collection_state; 289243789Sdim 290243789Sdimtypedef enum { 291243789Sdim __itt_thread_normal = 0, 292243789Sdim __itt_thread_ignored = 1 293243789Sdim} __itt_thread_state; 294243789Sdim 295243789Sdim#pragma pack(push, 8) 296243789Sdim 297243789Sdimtypedef struct ___itt_thread_info 298243789Sdim{ 299243789Sdim const char* nameA; /*!< Copy of original name in ASCII. */ 300243789Sdim#if defined(UNICODE) || defined(_UNICODE) 301243789Sdim const wchar_t* nameW; /*!< Copy of original name in UNICODE. */ 302243789Sdim#else /* UNICODE || _UNICODE */ 303243789Sdim void* nameW; 304243789Sdim#endif /* UNICODE || _UNICODE */ 305243789Sdim TIDT tid; 306243789Sdim __itt_thread_state state; /*!< Thread state (paused or normal) */ 307243789Sdim int extra1; /*!< Reserved to the runtime */ 308243789Sdim void* extra2; /*!< Reserved to the runtime */ 309243789Sdim struct ___itt_thread_info* next; 310243789Sdim} __itt_thread_info; 311243789Sdim 312243789Sdim#include "ittnotify_types.h" /* For __itt_group_id definition */ 313243789Sdim 314243789Sdimtypedef struct ___itt_api_info_20101001 315243789Sdim{ 316243789Sdim const char* name; 317243789Sdim void** func_ptr; 318243789Sdim void* init_func; 319243789Sdim __itt_group_id group; 320243789Sdim} __itt_api_info_20101001; 321243789Sdim 322243789Sdimtypedef struct ___itt_api_info 323243789Sdim{ 324243789Sdim const char* name; 325243789Sdim void** func_ptr; 326243789Sdim void* init_func; 327243789Sdim void* null_func; 328243789Sdim __itt_group_id group; 329243789Sdim} __itt_api_info; 330243789Sdim 331243789Sdimstruct ___itt_domain; 332243789Sdimstruct ___itt_string_handle; 333243789Sdim 334243789Sdimtypedef struct ___itt_global 335243789Sdim{ 336243789Sdim unsigned char magic[8]; 337243789Sdim unsigned long version_major; 338243789Sdim unsigned long version_minor; 339243789Sdim unsigned long version_build; 340243789Sdim volatile long api_initialized; 341243789Sdim volatile long mutex_initialized; 342243789Sdim volatile long atomic_counter; 343243789Sdim mutex_t mutex; 344243789Sdim lib_t lib; 345243789Sdim void* error_handler; 346243789Sdim const char** dll_path_ptr; 347243789Sdim __itt_api_info* api_list_ptr; 348243789Sdim struct ___itt_global* next; 349243789Sdim /* Joinable structures below */ 350243789Sdim __itt_thread_info* thread_list; 351243789Sdim struct ___itt_domain* domain_list; 352243789Sdim struct ___itt_string_handle* string_list; 353243789Sdim __itt_collection_state state; 354243789Sdim} __itt_global; 355243789Sdim 356243789Sdim#pragma pack(pop) 357243789Sdim 358243789Sdim#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \ 359243789Sdim h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ 360243789Sdim if (h != NULL) { \ 361243789Sdim h->tid = t; \ 362243789Sdim h->nameA = NULL; \ 363243789Sdim h->nameW = n ? _wcsdup(n) : NULL; \ 364243789Sdim h->state = s; \ 365243789Sdim h->extra1 = 0; /* reserved */ \ 366243789Sdim h->extra2 = NULL; /* reserved */ \ 367243789Sdim h->next = NULL; \ 368243789Sdim if (h_tail == NULL) \ 369243789Sdim (gptr)->thread_list = h; \ 370243789Sdim else \ 371243789Sdim h_tail->next = h; \ 372243789Sdim } \ 373243789Sdim} 374243789Sdim 375243789Sdim#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \ 376243789Sdim h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ 377243789Sdim if (h != NULL) { \ 378243789Sdim h->tid = t; \ 379243789Sdim h->nameA = n ? __itt_fstrdup(n) : NULL; \ 380243789Sdim h->nameW = NULL; \ 381243789Sdim h->state = s; \ 382243789Sdim h->extra1 = 0; /* reserved */ \ 383243789Sdim h->extra2 = NULL; /* reserved */ \ 384243789Sdim h->next = NULL; \ 385243789Sdim if (h_tail == NULL) \ 386243789Sdim (gptr)->thread_list = h; \ 387243789Sdim else \ 388243789Sdim h_tail->next = h; \ 389243789Sdim } \ 390243789Sdim} 391243789Sdim 392243789Sdim#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \ 393243789Sdim h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ 394243789Sdim if (h != NULL) { \ 395243789Sdim h->flags = 0; /* domain is disabled by default */ \ 396243789Sdim h->nameA = NULL; \ 397243789Sdim h->nameW = name ? _wcsdup(name) : NULL; \ 398243789Sdim h->extra1 = 0; /* reserved */ \ 399243789Sdim h->extra2 = NULL; /* reserved */ \ 400243789Sdim h->next = NULL; \ 401243789Sdim if (h_tail == NULL) \ 402243789Sdim (gptr)->domain_list = h; \ 403243789Sdim else \ 404243789Sdim h_tail->next = h; \ 405243789Sdim } \ 406243789Sdim} 407243789Sdim 408243789Sdim#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \ 409243789Sdim h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ 410243789Sdim if (h != NULL) { \ 411243789Sdim h->flags = 0; /* domain is disabled by default */ \ 412243789Sdim h->nameA = name ? __itt_fstrdup(name) : NULL; \ 413243789Sdim h->nameW = NULL; \ 414243789Sdim h->extra1 = 0; /* reserved */ \ 415243789Sdim h->extra2 = NULL; /* reserved */ \ 416243789Sdim h->next = NULL; \ 417243789Sdim if (h_tail == NULL) \ 418243789Sdim (gptr)->domain_list = h; \ 419243789Sdim else \ 420243789Sdim h_tail->next = h; \ 421243789Sdim } \ 422243789Sdim} 423243789Sdim 424243789Sdim#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \ 425243789Sdim h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ 426243789Sdim if (h != NULL) { \ 427243789Sdim h->strA = NULL; \ 428243789Sdim h->strW = name ? _wcsdup(name) : NULL; \ 429243789Sdim h->extra1 = 0; /* reserved */ \ 430243789Sdim h->extra2 = NULL; /* reserved */ \ 431243789Sdim h->next = NULL; \ 432243789Sdim if (h_tail == NULL) \ 433243789Sdim (gptr)->string_list = h; \ 434243789Sdim else \ 435243789Sdim h_tail->next = h; \ 436243789Sdim } \ 437243789Sdim} 438243789Sdim 439243789Sdim#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \ 440243789Sdim h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ 441243789Sdim if (h != NULL) { \ 442243789Sdim h->strA = name ? __itt_fstrdup(name) : NULL; \ 443243789Sdim h->strW = NULL; \ 444243789Sdim h->extra1 = 0; /* reserved */ \ 445243789Sdim h->extra2 = NULL; /* reserved */ \ 446243789Sdim h->next = NULL; \ 447243789Sdim if (h_tail == NULL) \ 448243789Sdim (gptr)->string_list = h; \ 449243789Sdim else \ 450243789Sdim h_tail->next = h; \ 451243789Sdim } \ 452243789Sdim} 453243789Sdim 454243789Sdim#endif /* _ITTNOTIFY_CONFIG_H_ */ 455