xref: /oneTBB/src/tbb/tools_api/ittnotify_static.c (revision 706ad867)
151c0b2f7Stbbdev /*
2*706ad867SJhaShweta1     Copyright (c) 2005-2023 Intel Corporation
351c0b2f7Stbbdev 
451c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev     you may not use this file except in compliance with the License.
651c0b2f7Stbbdev     You may obtain a copy of the License at
751c0b2f7Stbbdev 
851c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev 
1051c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev     See the License for the specific language governing permissions and
1451c0b2f7Stbbdev     limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev 
170e6d4699SAnuya Welling #define INTEL_NO_MACRO_BODY
180e6d4699SAnuya Welling #define INTEL_ITTNOTIFY_API_PRIVATE
1951c0b2f7Stbbdev #include "ittnotify_config.h"
2051c0b2f7Stbbdev 
2151c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
220e6d4699SAnuya Welling #if !defined(PATH_MAX)
2351c0b2f7Stbbdev #define PATH_MAX 512
240e6d4699SAnuya Welling #endif
2551c0b2f7Stbbdev #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
2651c0b2f7Stbbdev #include <limits.h>
2751c0b2f7Stbbdev #include <dlfcn.h>
2851c0b2f7Stbbdev #include <errno.h>
2951c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
3051c0b2f7Stbbdev #include <stdio.h>
3151c0b2f7Stbbdev #include <stdlib.h>
3251c0b2f7Stbbdev #include <stdarg.h>
3351c0b2f7Stbbdev #include <string.h>
3451c0b2f7Stbbdev 
3551c0b2f7Stbbdev #include "ittnotify.h"
3651c0b2f7Stbbdev #include "legacy/ittnotify.h"
3751c0b2f7Stbbdev 
3851c0b2f7Stbbdev #include "disable_warnings.h"
3951c0b2f7Stbbdev 
4051c0b2f7Stbbdev static const char api_version[] = API_VERSION "\0\n@(#) $Revision$\n";
4151c0b2f7Stbbdev 
4251c0b2f7Stbbdev #define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
4351c0b2f7Stbbdev 
44478de5b1Stbbdev #ifndef HAS_CPP_ATTR
45478de5b1Stbbdev #if defined(__cplusplus) && defined(__has_cpp_attribute)
46478de5b1Stbbdev #define HAS_CPP_ATTR(X) __has_cpp_attribute(X)
47478de5b1Stbbdev #else
48478de5b1Stbbdev #define HAS_CPP_ATTR(X) 0
49478de5b1Stbbdev #endif
50478de5b1Stbbdev #endif
51478de5b1Stbbdev 
52478de5b1Stbbdev #ifndef HAS_C_ATTR
53478de5b1Stbbdev #if defined(__STDC__) && defined(__has_c_attribute)
54478de5b1Stbbdev #define HAS_C_ATTR(X) __has_c_attribute(X)
55478de5b1Stbbdev #else
56478de5b1Stbbdev #define HAS_C_ATTR(X) 0
57478de5b1Stbbdev #endif
58478de5b1Stbbdev #endif
59478de5b1Stbbdev 
60478de5b1Stbbdev #ifndef HAS_GNU_ATTR
61478de5b1Stbbdev #if defined(__has_attribute)
62478de5b1Stbbdev #define HAS_GNU_ATTR(X) __has_attribute(X)
63478de5b1Stbbdev #else
64478de5b1Stbbdev #define HAS_GNU_ATTR(X) 0
65478de5b1Stbbdev #endif
66478de5b1Stbbdev #endif
67478de5b1Stbbdev 
68478de5b1Stbbdev #ifndef ITT_ATTRIBUTE_FALLTHROUGH
69478de5b1Stbbdev #if (HAS_CPP_ATTR(fallthrough) || HAS_C_ATTR(fallthrough)) && (__cplusplus >= 201703L || _MSVC_LANG >= 201703L)
70478de5b1Stbbdev #define ITT_ATTRIBUTE_FALLTHROUGH [[fallthrough]]
71478de5b1Stbbdev #elif HAS_CPP_ATTR(gnu::fallthrough)
72478de5b1Stbbdev #define ITT_ATTRIBUTE_FALLTHROUGH [[gnu::fallthrough]]
73478de5b1Stbbdev #elif HAS_CPP_ATTR(clang::fallthrough)
74478de5b1Stbbdev #define ITT_ATTRIBUTE_FALLTHROUGH [[clang::fallthrough]]
75478de5b1Stbbdev #elif HAS_GNU_ATTR(fallthrough) && !__INTEL_COMPILER
76478de5b1Stbbdev #define ITT_ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
77478de5b1Stbbdev #else
78478de5b1Stbbdev #define ITT_ATTRIBUTE_FALLTHROUGH
79478de5b1Stbbdev #endif
80478de5b1Stbbdev #endif
81478de5b1Stbbdev 
8251c0b2f7Stbbdev #if ITT_OS==ITT_OS_WIN
8351c0b2f7Stbbdev static const char* ittnotify_lib_name = "libittnotify.dll";
8451c0b2f7Stbbdev #elif ITT_OS==ITT_OS_LINUX || ITT_OS==ITT_OS_FREEBSD
8551c0b2f7Stbbdev static const char* ittnotify_lib_name = "libittnotify.so";
8651c0b2f7Stbbdev #elif ITT_OS==ITT_OS_MAC
8751c0b2f7Stbbdev static const char* ittnotify_lib_name = "libittnotify.dylib";
8851c0b2f7Stbbdev #else
8951c0b2f7Stbbdev #error Unsupported or unknown OS.
9051c0b2f7Stbbdev #endif
9151c0b2f7Stbbdev 
9251c0b2f7Stbbdev #ifdef __ANDROID__
9351c0b2f7Stbbdev #include <android/log.h>
9451c0b2f7Stbbdev #include <stdio.h>
9551c0b2f7Stbbdev #include <unistd.h>
9651c0b2f7Stbbdev #include <sys/types.h>
9751c0b2f7Stbbdev #include <sys/stat.h>
9851c0b2f7Stbbdev #include <fcntl.h>
9951c0b2f7Stbbdev #include <linux/limits.h>
10051c0b2f7Stbbdev 
10151c0b2f7Stbbdev #ifdef ITT_ANDROID_LOG
10251c0b2f7Stbbdev     #define ITT_ANDROID_LOG_TAG   "INTEL_VTUNE_USERAPI"
10351c0b2f7Stbbdev     #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
10451c0b2f7Stbbdev     #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
10551c0b2f7Stbbdev     #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
10651c0b2f7Stbbdev     #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
10751c0b2f7Stbbdev #else
10851c0b2f7Stbbdev     #define ITT_ANDROID_LOGI(...)
10951c0b2f7Stbbdev     #define ITT_ANDROID_LOGW(...)
11051c0b2f7Stbbdev     #define ITT_ANDROID_LOGE(...)
11151c0b2f7Stbbdev     #define ITT_ANDROID_LOGD(...)
11251c0b2f7Stbbdev #endif
11351c0b2f7Stbbdev 
11451c0b2f7Stbbdev /* default location of userapi collector on Android */
11551c0b2f7Stbbdev #define ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(x)  "/data/data/com.intel.vtune/perfrun/lib" \
11651c0b2f7Stbbdev                                                 #x "/runtime/libittnotify.so"
11751c0b2f7Stbbdev 
11851c0b2f7Stbbdev #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
11951c0b2f7Stbbdev #define ANDROID_ITTNOTIFY_DEFAULT_PATH  ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(32)
12051c0b2f7Stbbdev #else
12151c0b2f7Stbbdev #define ANDROID_ITTNOTIFY_DEFAULT_PATH  ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(64)
12251c0b2f7Stbbdev #endif
12351c0b2f7Stbbdev 
12451c0b2f7Stbbdev #endif
12551c0b2f7Stbbdev 
12651c0b2f7Stbbdev 
12751c0b2f7Stbbdev #ifndef LIB_VAR_NAME
12851c0b2f7Stbbdev #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
12951c0b2f7Stbbdev #define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
13051c0b2f7Stbbdev #else
13151c0b2f7Stbbdev #define LIB_VAR_NAME INTEL_LIBITTNOTIFY64
13251c0b2f7Stbbdev #endif
13351c0b2f7Stbbdev #endif /* LIB_VAR_NAME */
13451c0b2f7Stbbdev 
13551c0b2f7Stbbdev #define ITT_MUTEX_INIT_AND_LOCK(p) {                                 \
13651c0b2f7Stbbdev     if (PTHREAD_SYMBOLS)                                             \
13751c0b2f7Stbbdev     {                                                                \
13851c0b2f7Stbbdev         if (!p.mutex_initialized)                                    \
13951c0b2f7Stbbdev         {                                                            \
1400e6d4699SAnuya Welling             if (__itt_interlocked_compare_exchange(&p.atomic_counter, 1, 0) == 0) \
14151c0b2f7Stbbdev             {                                                        \
14251c0b2f7Stbbdev                 __itt_mutex_init(&p.mutex);                          \
14351c0b2f7Stbbdev                 p.mutex_initialized = 1;                             \
14451c0b2f7Stbbdev             }                                                        \
14551c0b2f7Stbbdev             else                                                     \
14651c0b2f7Stbbdev                 while (!p.mutex_initialized)                         \
14751c0b2f7Stbbdev                     __itt_thread_yield();                            \
14851c0b2f7Stbbdev         }                                                            \
14951c0b2f7Stbbdev         __itt_mutex_lock(&p.mutex);                                  \
15051c0b2f7Stbbdev     }                                                                \
15151c0b2f7Stbbdev }
15251c0b2f7Stbbdev 
1530e6d4699SAnuya Welling #define ITT_MUTEX_DESTROY(p) {                                       \
1540e6d4699SAnuya Welling     if (PTHREAD_SYMBOLS)                                             \
1550e6d4699SAnuya Welling     {                                                                \
1560e6d4699SAnuya Welling         if (p.mutex_initialized)                                     \
1570e6d4699SAnuya Welling         {                                                            \
1580e6d4699SAnuya Welling             if (__itt_interlocked_compare_exchange(&p.atomic_counter, 0, 1) == 1) \
1590e6d4699SAnuya Welling             {                                                        \
1600e6d4699SAnuya Welling                 __itt_mutex_destroy(&p.mutex);                       \
1610e6d4699SAnuya Welling                 p.mutex_initialized = 0;                             \
1620e6d4699SAnuya Welling             }                                                        \
1630e6d4699SAnuya Welling         }                                                            \
1640e6d4699SAnuya Welling     }                                                                \
1650e6d4699SAnuya Welling }
1660e6d4699SAnuya Welling 
167478de5b1Stbbdev #define ITT_MODULE_OBJECT_VERSION 1
16851c0b2f7Stbbdev 
16951c0b2f7Stbbdev typedef int (__itt_init_ittlib_t)(const char*, __itt_group_id);
17051c0b2f7Stbbdev 
17151c0b2f7Stbbdev /* this define used to control initialization function name. */
17251c0b2f7Stbbdev #ifndef __itt_init_ittlib_name
17351c0b2f7Stbbdev ITT_EXTERN_C int _N_(init_ittlib)(const char*, __itt_group_id);
17451c0b2f7Stbbdev static __itt_init_ittlib_t* __itt_init_ittlib_ptr = _N_(init_ittlib);
17551c0b2f7Stbbdev #define __itt_init_ittlib_name __itt_init_ittlib_ptr
17651c0b2f7Stbbdev #endif /* __itt_init_ittlib_name */
17751c0b2f7Stbbdev 
17851c0b2f7Stbbdev typedef void (__itt_fini_ittlib_t)(void);
17951c0b2f7Stbbdev 
18051c0b2f7Stbbdev /* this define used to control finalization function name. */
18151c0b2f7Stbbdev #ifndef __itt_fini_ittlib_name
18251c0b2f7Stbbdev ITT_EXTERN_C void _N_(fini_ittlib)(void);
18351c0b2f7Stbbdev static __itt_fini_ittlib_t* __itt_fini_ittlib_ptr = _N_(fini_ittlib);
18451c0b2f7Stbbdev #define __itt_fini_ittlib_name __itt_fini_ittlib_ptr
18551c0b2f7Stbbdev #endif /* __itt_fini_ittlib_name */
18651c0b2f7Stbbdev 
18751c0b2f7Stbbdev extern __itt_global _N_(_ittapi_global);
18851c0b2f7Stbbdev 
18951c0b2f7Stbbdev /* building pointers to imported funcs */
19051c0b2f7Stbbdev #undef ITT_STUBV
19151c0b2f7Stbbdev #undef ITT_STUB
19251c0b2f7Stbbdev #define ITT_STUB(api,type,name,args,params,ptr,group,format)   \
19351c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
19451c0b2f7Stbbdev typedef type api ITT_JOIN(_N_(name),_t) args;                  \
19551c0b2f7Stbbdev ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
19651c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
19751c0b2f7Stbbdev {                                                              \
19851c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \
19951c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);         \
20051c0b2f7Stbbdev     if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
20151c0b2f7Stbbdev         return ITTNOTIFY_NAME(name) params;                    \
20251c0b2f7Stbbdev     else                                                       \
20351c0b2f7Stbbdev         return (type)0;                                        \
20451c0b2f7Stbbdev }
20551c0b2f7Stbbdev 
20651c0b2f7Stbbdev #define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \
20751c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
20851c0b2f7Stbbdev typedef type api ITT_JOIN(_N_(name),_t) args;                  \
20951c0b2f7Stbbdev ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
21051c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
21151c0b2f7Stbbdev {                                                              \
21251c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \
21351c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);         \
21451c0b2f7Stbbdev     if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
21551c0b2f7Stbbdev         ITTNOTIFY_NAME(name) params;                           \
21651c0b2f7Stbbdev     else                                                       \
21751c0b2f7Stbbdev         return;                                                \
21851c0b2f7Stbbdev }
21951c0b2f7Stbbdev 
22051c0b2f7Stbbdev #undef __ITT_INTERNAL_INIT
22151c0b2f7Stbbdev #include "ittnotify_static.h"
22251c0b2f7Stbbdev 
22351c0b2f7Stbbdev #undef ITT_STUB
22451c0b2f7Stbbdev #undef ITT_STUBV
22551c0b2f7Stbbdev #define ITT_STUB(api,type,name,args,params,ptr,group,format)   \
22651c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
22751c0b2f7Stbbdev typedef type api ITT_JOIN(_N_(name),_t) args;                  \
22851c0b2f7Stbbdev ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
22951c0b2f7Stbbdev 
23051c0b2f7Stbbdev #define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \
23151c0b2f7Stbbdev static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
23251c0b2f7Stbbdev typedef type api ITT_JOIN(_N_(name),_t) args;                  \
23351c0b2f7Stbbdev ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
23451c0b2f7Stbbdev 
23551c0b2f7Stbbdev #define __ITT_INTERNAL_INIT
23651c0b2f7Stbbdev #include "ittnotify_static.h"
23751c0b2f7Stbbdev #undef __ITT_INTERNAL_INIT
23851c0b2f7Stbbdev 
23951c0b2f7Stbbdev ITT_GROUP_LIST(group_list);
24051c0b2f7Stbbdev 
24151c0b2f7Stbbdev #pragma pack(push, 8)
24251c0b2f7Stbbdev 
24351c0b2f7Stbbdev typedef struct ___itt_group_alias
24451c0b2f7Stbbdev {
24551c0b2f7Stbbdev     const char*    env_var;
24651c0b2f7Stbbdev     __itt_group_id groups;
24751c0b2f7Stbbdev } __itt_group_alias;
24851c0b2f7Stbbdev 
24951c0b2f7Stbbdev static __itt_group_alias group_alias[] = {
25051c0b2f7Stbbdev     { "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_mark) },
25151c0b2f7Stbbdev     { "KMP_FOR_TCHECK",   (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) },
25251c0b2f7Stbbdev     { NULL,               (__itt_group_none) },
25351c0b2f7Stbbdev     { api_version,        (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */
25451c0b2f7Stbbdev };
25551c0b2f7Stbbdev 
25651c0b2f7Stbbdev #pragma pack(pop)
25751c0b2f7Stbbdev 
2580e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
2590e6d4699SAnuya Welling #if _MSC_VER
26051c0b2f7Stbbdev #pragma warning(push)
26151c0b2f7Stbbdev #pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */
2620e6d4699SAnuya Welling #endif
26351c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
26451c0b2f7Stbbdev 
26551c0b2f7Stbbdev static __itt_api_info api_list[] = {
26651c0b2f7Stbbdev /* Define functions with static implementation */
26751c0b2f7Stbbdev #undef ITT_STUB
26851c0b2f7Stbbdev #undef ITT_STUBV
26951c0b2f7Stbbdev #define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},
27051c0b2f7Stbbdev #define ITT_STUBV ITT_STUB
27151c0b2f7Stbbdev #define __ITT_INTERNAL_INIT
27251c0b2f7Stbbdev #include "ittnotify_static.h"
27351c0b2f7Stbbdev #undef __ITT_INTERNAL_INIT
27451c0b2f7Stbbdev /* Define functions without static implementation */
27551c0b2f7Stbbdev #undef ITT_STUB
27651c0b2f7Stbbdev #undef ITT_STUBV
27751c0b2f7Stbbdev #define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},
27851c0b2f7Stbbdev #define ITT_STUBV ITT_STUB
27951c0b2f7Stbbdev #include "ittnotify_static.h"
28051c0b2f7Stbbdev     {NULL, NULL, NULL, NULL, __itt_group_none}
28151c0b2f7Stbbdev };
28251c0b2f7Stbbdev 
2830e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
2840e6d4699SAnuya Welling #if _MSC_VER
28551c0b2f7Stbbdev #pragma warning(pop)
2860e6d4699SAnuya Welling #endif
28751c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
28851c0b2f7Stbbdev 
28951c0b2f7Stbbdev /* static part descriptor which handles. all notification api attributes. */
29051c0b2f7Stbbdev __itt_global _N_(_ittapi_global) = {
29151c0b2f7Stbbdev     ITT_MAGIC,                                     /* identification info */
29251c0b2f7Stbbdev     ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD,       /* version info */
29351c0b2f7Stbbdev     0,                                             /* api_initialized */
29451c0b2f7Stbbdev     0,                                             /* mutex_initialized */
29551c0b2f7Stbbdev     0,                                             /* atomic_counter */
29651c0b2f7Stbbdev     MUTEX_INITIALIZER,                             /* mutex */
29751c0b2f7Stbbdev     NULL,                                          /* dynamic library handle */
29851c0b2f7Stbbdev     NULL,                                          /* error_handler */
299478de5b1Stbbdev     NULL,                                          /* dll_path_ptr */
30051c0b2f7Stbbdev     (__itt_api_info*)&api_list,                    /* api_list_ptr */
30151c0b2f7Stbbdev     NULL,                                          /* next __itt_global */
30251c0b2f7Stbbdev     NULL,                                          /* thread_list */
30351c0b2f7Stbbdev     NULL,                                          /* domain_list */
30451c0b2f7Stbbdev     NULL,                                          /* string_list */
3050e6d4699SAnuya Welling     __itt_collection_uninitialized,                /* collection state */
30651c0b2f7Stbbdev     NULL,                                          /* counter_list */
3070e6d4699SAnuya Welling     0,                                             /* ipt_collect_events */
308*706ad867SJhaShweta1     NULL,                                          /* histogram_list */
309*706ad867SJhaShweta1     NULL                                           /* counter_metadata_list */
31051c0b2f7Stbbdev };
31151c0b2f7Stbbdev 
31251c0b2f7Stbbdev typedef void (__itt_api_init_t)(__itt_global*, __itt_group_id);
31351c0b2f7Stbbdev typedef void (__itt_api_fini_t)(__itt_global*);
31451c0b2f7Stbbdev 
315478de5b1Stbbdev static __itt_domain dummy_domain;
31651c0b2f7Stbbdev /* ========================================================================= */
31751c0b2f7Stbbdev 
31851c0b2f7Stbbdev #ifdef ITT_NOTIFY_EXT_REPORT
31951c0b2f7Stbbdev ITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args);
32051c0b2f7Stbbdev #endif /* ITT_NOTIFY_EXT_REPORT */
32151c0b2f7Stbbdev 
3220e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
3230e6d4699SAnuya Welling #if _MSC_VER
32451c0b2f7Stbbdev #pragma warning(push)
32551c0b2f7Stbbdev #pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */
3260e6d4699SAnuya Welling #endif
32751c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
32851c0b2f7Stbbdev 
__itt_report_error(int code,...)329478de5b1Stbbdev static void __itt_report_error(int code, ...)
330478de5b1Stbbdev {
33151c0b2f7Stbbdev     va_list args;
33251c0b2f7Stbbdev     va_start(args, code);
33351c0b2f7Stbbdev     if (_N_(_ittapi_global).error_handler != NULL)
33451c0b2f7Stbbdev     {
33551c0b2f7Stbbdev         __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
33651c0b2f7Stbbdev         handler((__itt_error_code)code, args);
33751c0b2f7Stbbdev     }
33851c0b2f7Stbbdev #ifdef ITT_NOTIFY_EXT_REPORT
339478de5b1Stbbdev     _N_(error_handler)((__itt_error_code)code, args);
34051c0b2f7Stbbdev #endif /* ITT_NOTIFY_EXT_REPORT */
34151c0b2f7Stbbdev     va_end(args);
34251c0b2f7Stbbdev }
34351c0b2f7Stbbdev 
3440e6d4699SAnuya Welling static int __itt_is_collector_available(void);
3450e6d4699SAnuya Welling 
3460e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
3470e6d4699SAnuya Welling #if _MSC_VER
34851c0b2f7Stbbdev #pragma warning(pop)
3490e6d4699SAnuya Welling #endif
35051c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
35151c0b2f7Stbbdev 
35251c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (domain_createW),_init))35351c0b2f7Stbbdev static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(const wchar_t* name)
35451c0b2f7Stbbdev {
35551c0b2f7Stbbdev     __itt_domain *h_tail = NULL, *h = NULL;
35651c0b2f7Stbbdev 
35751c0b2f7Stbbdev     if (name == NULL)
35851c0b2f7Stbbdev     {
35951c0b2f7Stbbdev         return NULL;
36051c0b2f7Stbbdev     }
36151c0b2f7Stbbdev 
36251c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
36351c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
36451c0b2f7Stbbdev     {
36551c0b2f7Stbbdev         if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init)))
36651c0b2f7Stbbdev         {
36751c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
36851c0b2f7Stbbdev             return ITTNOTIFY_NAME(domain_createW)(name);
36951c0b2f7Stbbdev         }
370478de5b1Stbbdev         else
371478de5b1Stbbdev         {
372478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
373478de5b1Stbbdev             return &dummy_domain;
374478de5b1Stbbdev         }
37551c0b2f7Stbbdev     }
3760e6d4699SAnuya Welling     if (__itt_is_collector_available())
3770e6d4699SAnuya Welling     {
37851c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
37951c0b2f7Stbbdev         {
38051c0b2f7Stbbdev             if (h->nameW != NULL && !wcscmp(h->nameW, name)) break;
38151c0b2f7Stbbdev         }
38251c0b2f7Stbbdev         if (h == NULL)
38351c0b2f7Stbbdev         {
38451c0b2f7Stbbdev             NEW_DOMAIN_W(&_N_(_ittapi_global), h, h_tail, name);
38551c0b2f7Stbbdev         }
3860e6d4699SAnuya Welling     }
38751c0b2f7Stbbdev     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
38851c0b2f7Stbbdev     return h;
38951c0b2f7Stbbdev }
39051c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (domain_createA),_init))39151c0b2f7Stbbdev static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init))(const char* name)
39251c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
39351c0b2f7Stbbdev static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(const char* name)
39451c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
39551c0b2f7Stbbdev {
39651c0b2f7Stbbdev     __itt_domain *h_tail = NULL, *h = NULL;
39751c0b2f7Stbbdev 
39851c0b2f7Stbbdev     if (name == NULL)
39951c0b2f7Stbbdev     {
40051c0b2f7Stbbdev         return NULL;
40151c0b2f7Stbbdev     }
40251c0b2f7Stbbdev 
40351c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
40451c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
40551c0b2f7Stbbdev     {
40651c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
40751c0b2f7Stbbdev         if (ITTNOTIFY_NAME(domain_createA) && ITTNOTIFY_NAME(domain_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init)))
40851c0b2f7Stbbdev         {
40951c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
41051c0b2f7Stbbdev             return ITTNOTIFY_NAME(domain_createA)(name);
41151c0b2f7Stbbdev         }
41251c0b2f7Stbbdev #else
41351c0b2f7Stbbdev         if (ITTNOTIFY_NAME(domain_create) && ITTNOTIFY_NAME(domain_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init)))
41451c0b2f7Stbbdev         {
41551c0b2f7Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
41651c0b2f7Stbbdev             return ITTNOTIFY_NAME(domain_create)(name);
41751c0b2f7Stbbdev         }
41851c0b2f7Stbbdev #endif
419478de5b1Stbbdev         else
420478de5b1Stbbdev         {
421478de5b1Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
422478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
423478de5b1Stbbdev #else
424478de5b1Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
425478de5b1Stbbdev #endif
426478de5b1Stbbdev             return &dummy_domain;
427478de5b1Stbbdev         }
42851c0b2f7Stbbdev     }
4290e6d4699SAnuya Welling     if (__itt_is_collector_available())
4300e6d4699SAnuya Welling     {
43151c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)
43251c0b2f7Stbbdev         {
43351c0b2f7Stbbdev             if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break;
43451c0b2f7Stbbdev         }
43551c0b2f7Stbbdev         if (h == NULL)
43651c0b2f7Stbbdev         {
43751c0b2f7Stbbdev             NEW_DOMAIN_A(&_N_(_ittapi_global), h, h_tail, name);
43851c0b2f7Stbbdev         }
4390e6d4699SAnuya Welling     }
44051c0b2f7Stbbdev     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
44151c0b2f7Stbbdev     return h;
44251c0b2f7Stbbdev }
44351c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (module_load_with_sections),_init))444478de5b1Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init))(__itt_module_object* module_obj)
445478de5b1Stbbdev {
446478de5b1Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
447478de5b1Stbbdev     {
448478de5b1Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
449478de5b1Stbbdev     }
450478de5b1Stbbdev     if (ITTNOTIFY_NAME(module_load_with_sections) && ITTNOTIFY_NAME(module_load_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init)))
451478de5b1Stbbdev     {
452478de5b1Stbbdev         if(module_obj != NULL)
453478de5b1Stbbdev         {
454478de5b1Stbbdev             module_obj->version = ITT_MODULE_OBJECT_VERSION;
455478de5b1Stbbdev             ITTNOTIFY_NAME(module_load_with_sections)(module_obj);
456478de5b1Stbbdev         }
457478de5b1Stbbdev     }
458478de5b1Stbbdev }
459478de5b1Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (module_unload_with_sections),_init))460478de5b1Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init))(__itt_module_object* module_obj)
461478de5b1Stbbdev {
462478de5b1Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
463478de5b1Stbbdev     {
464478de5b1Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
465478de5b1Stbbdev     }
466478de5b1Stbbdev     if (ITTNOTIFY_NAME(module_unload_with_sections) && ITTNOTIFY_NAME(module_unload_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init)))
467478de5b1Stbbdev     {
468478de5b1Stbbdev         if(module_obj != NULL)
469478de5b1Stbbdev         {
470478de5b1Stbbdev             module_obj->version = ITT_MODULE_OBJECT_VERSION;
471478de5b1Stbbdev             ITTNOTIFY_NAME(module_unload_with_sections)(module_obj);
472478de5b1Stbbdev         }
473478de5b1Stbbdev     }
474478de5b1Stbbdev }
475478de5b1Stbbdev 
47651c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (string_handle_createW),_init))47751c0b2f7Stbbdev static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))(const wchar_t* name)
47851c0b2f7Stbbdev {
47951c0b2f7Stbbdev     __itt_string_handle *h_tail = NULL, *h = NULL;
48051c0b2f7Stbbdev 
48151c0b2f7Stbbdev     if (name == NULL)
48251c0b2f7Stbbdev     {
48351c0b2f7Stbbdev         return NULL;
48451c0b2f7Stbbdev     }
48551c0b2f7Stbbdev 
48651c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
48751c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
48851c0b2f7Stbbdev     {
48951c0b2f7Stbbdev         if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init)))
49051c0b2f7Stbbdev         {
49151c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
49251c0b2f7Stbbdev             return ITTNOTIFY_NAME(string_handle_createW)(name);
49351c0b2f7Stbbdev         }
494478de5b1Stbbdev         else
495478de5b1Stbbdev         {
496478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
497478de5b1Stbbdev             return NULL;
498478de5b1Stbbdev         }
49951c0b2f7Stbbdev     }
5000e6d4699SAnuya Welling     if (__itt_is_collector_available())
5010e6d4699SAnuya Welling     {
50251c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
50351c0b2f7Stbbdev         {
50451c0b2f7Stbbdev             if (h->strW != NULL && !wcscmp(h->strW, name)) break;
50551c0b2f7Stbbdev         }
50651c0b2f7Stbbdev         if (h == NULL)
50751c0b2f7Stbbdev         {
50851c0b2f7Stbbdev             NEW_STRING_HANDLE_W(&_N_(_ittapi_global), h, h_tail, name);
50951c0b2f7Stbbdev         }
5100e6d4699SAnuya Welling     }
51151c0b2f7Stbbdev     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
51251c0b2f7Stbbdev     return h;
51351c0b2f7Stbbdev }
51451c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (string_handle_createA),_init))51551c0b2f7Stbbdev static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init))(const char* name)
51651c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
51751c0b2f7Stbbdev static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init))(const char* name)
51851c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
51951c0b2f7Stbbdev {
52051c0b2f7Stbbdev     __itt_string_handle *h_tail = NULL, *h = NULL;
52151c0b2f7Stbbdev 
52251c0b2f7Stbbdev     if (name == NULL)
52351c0b2f7Stbbdev     {
52451c0b2f7Stbbdev         return NULL;
52551c0b2f7Stbbdev     }
52651c0b2f7Stbbdev 
52751c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
52851c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
52951c0b2f7Stbbdev     {
53051c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
53151c0b2f7Stbbdev         if (ITTNOTIFY_NAME(string_handle_createA) && ITTNOTIFY_NAME(string_handle_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init)))
53251c0b2f7Stbbdev         {
53351c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
53451c0b2f7Stbbdev             return ITTNOTIFY_NAME(string_handle_createA)(name);
53551c0b2f7Stbbdev         }
53651c0b2f7Stbbdev #else
53751c0b2f7Stbbdev         if (ITTNOTIFY_NAME(string_handle_create) && ITTNOTIFY_NAME(string_handle_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init)))
53851c0b2f7Stbbdev         {
53951c0b2f7Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
54051c0b2f7Stbbdev             return ITTNOTIFY_NAME(string_handle_create)(name);
54151c0b2f7Stbbdev         }
54251c0b2f7Stbbdev #endif
543478de5b1Stbbdev         else
544478de5b1Stbbdev         {
545478de5b1Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
546478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
547478de5b1Stbbdev #else
548478de5b1Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
549478de5b1Stbbdev #endif
550478de5b1Stbbdev             return NULL;
551478de5b1Stbbdev         }
55251c0b2f7Stbbdev     }
5530e6d4699SAnuya Welling     if (__itt_is_collector_available())
5540e6d4699SAnuya Welling     {
55551c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)
55651c0b2f7Stbbdev         {
55751c0b2f7Stbbdev             if (h->strA != NULL && !__itt_fstrcmp(h->strA, name)) break;
55851c0b2f7Stbbdev         }
55951c0b2f7Stbbdev         if (h == NULL)
56051c0b2f7Stbbdev         {
56151c0b2f7Stbbdev             NEW_STRING_HANDLE_A(&_N_(_ittapi_global), h, h_tail, name);
56251c0b2f7Stbbdev         }
5630e6d4699SAnuya Welling     }
56451c0b2f7Stbbdev     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
56551c0b2f7Stbbdev     return h;
56651c0b2f7Stbbdev }
56751c0b2f7Stbbdev 
56851c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createW),_init))56951c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init))(const wchar_t *name, const wchar_t *domain)
57051c0b2f7Stbbdev {
57151c0b2f7Stbbdev     __itt_counter_info_t *h_tail = NULL, *h = NULL;
57251c0b2f7Stbbdev     __itt_metadata_type type = __itt_metadata_u64;
57351c0b2f7Stbbdev 
57451c0b2f7Stbbdev     if (name == NULL)
57551c0b2f7Stbbdev     {
57651c0b2f7Stbbdev         return NULL;
57751c0b2f7Stbbdev     }
57851c0b2f7Stbbdev 
57951c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
58051c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
58151c0b2f7Stbbdev     {
58251c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_createW) && ITTNOTIFY_NAME(counter_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init)))
58351c0b2f7Stbbdev         {
58451c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
58551c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_createW)(name, domain);
58651c0b2f7Stbbdev         }
587478de5b1Stbbdev         else
588478de5b1Stbbdev         {
589478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
590478de5b1Stbbdev             return NULL;
591478de5b1Stbbdev         }
59251c0b2f7Stbbdev     }
5930e6d4699SAnuya Welling     if (__itt_is_collector_available())
5940e6d4699SAnuya Welling     {
59551c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
59651c0b2f7Stbbdev         {
597478de5b1Stbbdev             if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) ||
59851c0b2f7Stbbdev                 (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break;
59951c0b2f7Stbbdev 
60051c0b2f7Stbbdev         }
60151c0b2f7Stbbdev         if (h == NULL)
60251c0b2f7Stbbdev         {
60351c0b2f7Stbbdev             NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type);
60451c0b2f7Stbbdev         }
6050e6d4699SAnuya Welling     }
60651c0b2f7Stbbdev     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
60751c0b2f7Stbbdev     return (__itt_counter)h;
60851c0b2f7Stbbdev }
60951c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createA),_init))61051c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init))(const char *name, const char *domain)
61151c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
61251c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init))(const char *name, const char *domain)
61351c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
61451c0b2f7Stbbdev {
61551c0b2f7Stbbdev     __itt_counter_info_t *h_tail = NULL, *h = NULL;
61651c0b2f7Stbbdev     __itt_metadata_type type = __itt_metadata_u64;
61751c0b2f7Stbbdev 
61851c0b2f7Stbbdev     if (name == NULL)
61951c0b2f7Stbbdev     {
62051c0b2f7Stbbdev         return NULL;
62151c0b2f7Stbbdev     }
62251c0b2f7Stbbdev 
62351c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
62451c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
62551c0b2f7Stbbdev     {
62651c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
62751c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_createA) && ITTNOTIFY_NAME(counter_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init)))
62851c0b2f7Stbbdev         {
62951c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
63051c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_createA)(name, domain);
63151c0b2f7Stbbdev         }
63251c0b2f7Stbbdev #else
63351c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_create) && ITTNOTIFY_NAME(counter_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init)))
63451c0b2f7Stbbdev         {
63551c0b2f7Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
63651c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_create)(name, domain);
63751c0b2f7Stbbdev         }
63851c0b2f7Stbbdev #endif
639478de5b1Stbbdev         else
640478de5b1Stbbdev         {
641478de5b1Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
642478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
643478de5b1Stbbdev #else
644478de5b1Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
645478de5b1Stbbdev #endif
646478de5b1Stbbdev             return NULL;
647478de5b1Stbbdev         }
64851c0b2f7Stbbdev     }
6490e6d4699SAnuya Welling     if (__itt_is_collector_available())
6500e6d4699SAnuya Welling     {
65151c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
65251c0b2f7Stbbdev         {
653478de5b1Stbbdev             if (h->nameA != NULL && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) ||
65451c0b2f7Stbbdev                 (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break;
65551c0b2f7Stbbdev         }
65651c0b2f7Stbbdev         if (h == NULL)
65751c0b2f7Stbbdev         {
65851c0b2f7Stbbdev             NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type);
65951c0b2f7Stbbdev         }
6600e6d4699SAnuya Welling     }
66151c0b2f7Stbbdev     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
66251c0b2f7Stbbdev     return (__itt_counter)h;
66351c0b2f7Stbbdev }
66451c0b2f7Stbbdev 
66551c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_create_typedW),_init))66651c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init))(const wchar_t *name, const wchar_t *domain, __itt_metadata_type type)
66751c0b2f7Stbbdev {
66851c0b2f7Stbbdev     __itt_counter_info_t *h_tail = NULL, *h = NULL;
66951c0b2f7Stbbdev 
67051c0b2f7Stbbdev     if (name == NULL)
67151c0b2f7Stbbdev     {
67251c0b2f7Stbbdev         return NULL;
67351c0b2f7Stbbdev     }
67451c0b2f7Stbbdev 
67551c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
67651c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
67751c0b2f7Stbbdev     {
67851c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_create_typedW) && ITTNOTIFY_NAME(counter_create_typedW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init)))
67951c0b2f7Stbbdev         {
68051c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
68151c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_create_typedW)(name, domain, type);
68251c0b2f7Stbbdev         }
683478de5b1Stbbdev         else
684478de5b1Stbbdev         {
685478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
686478de5b1Stbbdev             return NULL;
687478de5b1Stbbdev         }
68851c0b2f7Stbbdev     }
6890e6d4699SAnuya Welling     if (__itt_is_collector_available())
6900e6d4699SAnuya Welling     {
69151c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
69251c0b2f7Stbbdev         {
693478de5b1Stbbdev             if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) ||
69451c0b2f7Stbbdev                 (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break;
69551c0b2f7Stbbdev 
69651c0b2f7Stbbdev         }
69751c0b2f7Stbbdev         if (h == NULL)
69851c0b2f7Stbbdev         {
69951c0b2f7Stbbdev             NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type);
70051c0b2f7Stbbdev         }
7010e6d4699SAnuya Welling     }
70251c0b2f7Stbbdev     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
70351c0b2f7Stbbdev     return (__itt_counter)h;
70451c0b2f7Stbbdev }
70551c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_create_typedA),_init))70651c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init))(const char *name, const char *domain, __itt_metadata_type type)
70751c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
70851c0b2f7Stbbdev static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init))(const char *name, const char *domain, __itt_metadata_type type)
70951c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
71051c0b2f7Stbbdev {
71151c0b2f7Stbbdev     __itt_counter_info_t *h_tail = NULL, *h = NULL;
71251c0b2f7Stbbdev 
71351c0b2f7Stbbdev     if (name == NULL)
71451c0b2f7Stbbdev     {
71551c0b2f7Stbbdev         return NULL;
71651c0b2f7Stbbdev     }
71751c0b2f7Stbbdev 
71851c0b2f7Stbbdev     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
71951c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
72051c0b2f7Stbbdev     {
72151c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
72251c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_create_typedA) && ITTNOTIFY_NAME(counter_create_typedA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init)))
72351c0b2f7Stbbdev         {
72451c0b2f7Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
72551c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_create_typedA)(name, domain, type);
72651c0b2f7Stbbdev         }
72751c0b2f7Stbbdev #else
72851c0b2f7Stbbdev         if (ITTNOTIFY_NAME(counter_create_typed) && ITTNOTIFY_NAME(counter_create_typed) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init)))
72951c0b2f7Stbbdev         {
73051c0b2f7Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
73151c0b2f7Stbbdev             return ITTNOTIFY_NAME(counter_create_typed)(name, domain, type);
73251c0b2f7Stbbdev         }
73351c0b2f7Stbbdev #endif
734478de5b1Stbbdev         else
735478de5b1Stbbdev         {
736478de5b1Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
737478de5b1Stbbdev             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
738478de5b1Stbbdev #else
739478de5b1Stbbdev             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
740478de5b1Stbbdev #endif
741478de5b1Stbbdev             return NULL;
742478de5b1Stbbdev         }
74351c0b2f7Stbbdev     }
7440e6d4699SAnuya Welling     if (__itt_is_collector_available())
7450e6d4699SAnuya Welling     {
74651c0b2f7Stbbdev         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
74751c0b2f7Stbbdev         {
748478de5b1Stbbdev             if (h->nameA != NULL && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) ||
74951c0b2f7Stbbdev                 (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break;
75051c0b2f7Stbbdev         }
75151c0b2f7Stbbdev         if (h == NULL)
75251c0b2f7Stbbdev         {
75351c0b2f7Stbbdev             NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type);
75451c0b2f7Stbbdev         }
7550e6d4699SAnuya Welling     }
75651c0b2f7Stbbdev     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
75751c0b2f7Stbbdev     return (__itt_counter)h;
75851c0b2f7Stbbdev }
75951c0b2f7Stbbdev 
7600e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (histogram_createW),_init))7610e6d4699SAnuya Welling static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW),_init))(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type x_type, __itt_metadata_type y_type)
7620e6d4699SAnuya Welling {
7630e6d4699SAnuya Welling     __itt_histogram *h_tail = NULL, *h = NULL;
7640e6d4699SAnuya Welling 
7650e6d4699SAnuya Welling     if (domain == NULL || name == NULL)
7660e6d4699SAnuya Welling     {
7670e6d4699SAnuya Welling         return NULL;
7680e6d4699SAnuya Welling     }
7690e6d4699SAnuya Welling 
7700e6d4699SAnuya Welling     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
7710e6d4699SAnuya Welling     if (_N_(_ittapi_global).api_initialized)
7720e6d4699SAnuya Welling     {
7730e6d4699SAnuya Welling         if (ITTNOTIFY_NAME(histogram_createW) && ITTNOTIFY_NAME(histogram_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW),_init)))
7740e6d4699SAnuya Welling         {
7750e6d4699SAnuya Welling             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
7760e6d4699SAnuya Welling             return ITTNOTIFY_NAME(histogram_createW)(domain, name, x_type, y_type);
7770e6d4699SAnuya Welling         }
7780e6d4699SAnuya Welling         else
7790e6d4699SAnuya Welling         {
7800e6d4699SAnuya Welling             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
7810e6d4699SAnuya Welling             return NULL;
7820e6d4699SAnuya Welling         }
7830e6d4699SAnuya Welling     }
7840e6d4699SAnuya Welling     if (__itt_is_collector_available())
7850e6d4699SAnuya Welling     {
7860e6d4699SAnuya Welling         for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL; h_tail = h, h = h->next)
7870e6d4699SAnuya Welling         {
7880e6d4699SAnuya Welling             if (h->domain == NULL) continue;
7890e6d4699SAnuya Welling             else if (h->domain == domain && h->nameW != NULL && !wcscmp(h->nameW, name)) break;
7900e6d4699SAnuya Welling         }
7910e6d4699SAnuya Welling         if (h == NULL)
7920e6d4699SAnuya Welling         {
7930e6d4699SAnuya Welling             NEW_HISTOGRAM_W(&_N_(_ittapi_global), h, h_tail, domain, name, x_type, y_type);
7940e6d4699SAnuya Welling         }
7950e6d4699SAnuya Welling     }
7960e6d4699SAnuya Welling     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
7970e6d4699SAnuya Welling     return (__itt_histogram*)h;
7980e6d4699SAnuya Welling }
7990e6d4699SAnuya Welling 
ITT_VERSIONIZE(ITT_JOIN (_N_ (histogram_createA),_init))8000e6d4699SAnuya Welling static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type)
8010e6d4699SAnuya Welling #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
8020e6d4699SAnuya Welling static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_create),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type)
8030e6d4699SAnuya Welling #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
8040e6d4699SAnuya Welling {
8050e6d4699SAnuya Welling     __itt_histogram *h_tail = NULL, *h = NULL;
8060e6d4699SAnuya Welling 
8070e6d4699SAnuya Welling     if (domain == NULL || name == NULL)
8080e6d4699SAnuya Welling     {
8090e6d4699SAnuya Welling         return NULL;
8100e6d4699SAnuya Welling     }
8110e6d4699SAnuya Welling 
8120e6d4699SAnuya Welling     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
8130e6d4699SAnuya Welling     if (_N_(_ittapi_global).api_initialized)
8140e6d4699SAnuya Welling     {
8150e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
8160e6d4699SAnuya Welling         if (ITTNOTIFY_NAME(histogram_createA) && ITTNOTIFY_NAME(histogram_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA),_init)))
8170e6d4699SAnuya Welling         {
8180e6d4699SAnuya Welling             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
8190e6d4699SAnuya Welling             return ITTNOTIFY_NAME(histogram_createA)(domain, name, x_type, y_type);
8200e6d4699SAnuya Welling         }
8210e6d4699SAnuya Welling #else
8220e6d4699SAnuya Welling         if (ITTNOTIFY_NAME(histogram_create) && ITTNOTIFY_NAME(histogram_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_create),_init)))
8230e6d4699SAnuya Welling         {
8240e6d4699SAnuya Welling             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
8250e6d4699SAnuya Welling             return ITTNOTIFY_NAME(histogram_create)(domain, name, x_type, y_type);
8260e6d4699SAnuya Welling         }
8270e6d4699SAnuya Welling #endif
8280e6d4699SAnuya Welling         else
8290e6d4699SAnuya Welling         {
8300e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
8310e6d4699SAnuya Welling             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
8320e6d4699SAnuya Welling #else
8330e6d4699SAnuya Welling             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
8340e6d4699SAnuya Welling #endif
8350e6d4699SAnuya Welling             return NULL;
8360e6d4699SAnuya Welling         }
8370e6d4699SAnuya Welling     }
8380e6d4699SAnuya Welling     if (__itt_is_collector_available())
8390e6d4699SAnuya Welling     {
8400e6d4699SAnuya Welling         for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL; h_tail = h, h = h->next)
8410e6d4699SAnuya Welling         {
8420e6d4699SAnuya Welling             if (h->domain == NULL) continue;
8430e6d4699SAnuya Welling             else if (h->domain == domain && h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break;
8440e6d4699SAnuya Welling         }
8450e6d4699SAnuya Welling         if (h == NULL)
8460e6d4699SAnuya Welling         {
8470e6d4699SAnuya Welling             NEW_HISTOGRAM_A(&_N_(_ittapi_global), h, h_tail, domain, name, x_type, y_type);
8480e6d4699SAnuya Welling         }
8490e6d4699SAnuya Welling     }
8500e6d4699SAnuya Welling     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
8510e6d4699SAnuya Welling     return (__itt_histogram*)h;
8520e6d4699SAnuya Welling }
8530e6d4699SAnuya Welling 
854*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createW_v3),_init))855*706ad867SJhaShweta1 static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW_v3),_init))(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type type)
856*706ad867SJhaShweta1 {
857*706ad867SJhaShweta1     __itt_counter_info_t *h_tail = NULL, *h = NULL;
858*706ad867SJhaShweta1 
859*706ad867SJhaShweta1     if (name == NULL || domain == NULL)
860*706ad867SJhaShweta1     {
861*706ad867SJhaShweta1         return NULL;
862*706ad867SJhaShweta1     }
863*706ad867SJhaShweta1 
864*706ad867SJhaShweta1     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
865*706ad867SJhaShweta1     if (_N_(_ittapi_global).api_initialized)
866*706ad867SJhaShweta1     {
867*706ad867SJhaShweta1         if (ITTNOTIFY_NAME(counter_createW_v3) && ITTNOTIFY_NAME(counter_createW_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW_v3),_init)))
868*706ad867SJhaShweta1         {
869*706ad867SJhaShweta1             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
870*706ad867SJhaShweta1             return ITTNOTIFY_NAME(counter_createW_v3)(domain, name, type);
871*706ad867SJhaShweta1         }
872*706ad867SJhaShweta1         else
873*706ad867SJhaShweta1         {
874*706ad867SJhaShweta1             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
875*706ad867SJhaShweta1             return NULL;
876*706ad867SJhaShweta1         }
877*706ad867SJhaShweta1     }
878*706ad867SJhaShweta1     if (__itt_is_collector_available())
879*706ad867SJhaShweta1     {
880*706ad867SJhaShweta1         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
881*706ad867SJhaShweta1         {
882*706ad867SJhaShweta1             if (h->nameW != NULL  && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain->nameW == NULL) ||
883*706ad867SJhaShweta1                 (h->domainW != NULL && domain->nameW != NULL && !wcscmp(h->domainW, domain->nameW)))) break;
884*706ad867SJhaShweta1 
885*706ad867SJhaShweta1         }
886*706ad867SJhaShweta1         if (h == NULL)
887*706ad867SJhaShweta1         {
888*706ad867SJhaShweta1             NEW_COUNTER_W(&_N_(_ittapi_global),h,h_tail,name,domain->nameW,type);
889*706ad867SJhaShweta1         }
890*706ad867SJhaShweta1     }
891*706ad867SJhaShweta1     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
892*706ad867SJhaShweta1     return (__itt_counter)h;
893*706ad867SJhaShweta1 }
894*706ad867SJhaShweta1 
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createA_v3),_init))895*706ad867SJhaShweta1 static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA_v3),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type type)
896*706ad867SJhaShweta1 #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
897*706ad867SJhaShweta1 static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_v3),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type type)
898*706ad867SJhaShweta1 #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
899*706ad867SJhaShweta1 {
900*706ad867SJhaShweta1     __itt_counter_info_t *h_tail = NULL, *h = NULL;
901*706ad867SJhaShweta1 
902*706ad867SJhaShweta1     if (name == NULL || domain == NULL)
903*706ad867SJhaShweta1     {
904*706ad867SJhaShweta1         return NULL;
905*706ad867SJhaShweta1     }
906*706ad867SJhaShweta1 
907*706ad867SJhaShweta1     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
908*706ad867SJhaShweta1     if (_N_(_ittapi_global).api_initialized)
909*706ad867SJhaShweta1     {
910*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
911*706ad867SJhaShweta1         if (ITTNOTIFY_NAME(counter_createA_v3) && ITTNOTIFY_NAME(counter_createA_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA_v3),_init)))
912*706ad867SJhaShweta1         {
913*706ad867SJhaShweta1             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
914*706ad867SJhaShweta1             return ITTNOTIFY_NAME(counter_createA_v3)(domain, name, type);
915*706ad867SJhaShweta1         }
916*706ad867SJhaShweta1 #else
917*706ad867SJhaShweta1         if (ITTNOTIFY_NAME(counter_create_v3) && ITTNOTIFY_NAME(counter_create_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_v3),_init)))
918*706ad867SJhaShweta1         {
919*706ad867SJhaShweta1             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
920*706ad867SJhaShweta1             return ITTNOTIFY_NAME(counter_create_v3)(domain, name, type);
921*706ad867SJhaShweta1         }
922*706ad867SJhaShweta1 #endif
923*706ad867SJhaShweta1         else
924*706ad867SJhaShweta1         {
925*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
926*706ad867SJhaShweta1             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
927*706ad867SJhaShweta1 #else
928*706ad867SJhaShweta1             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
929*706ad867SJhaShweta1 #endif
930*706ad867SJhaShweta1             return NULL;
931*706ad867SJhaShweta1         }
932*706ad867SJhaShweta1     }
933*706ad867SJhaShweta1     if (__itt_is_collector_available())
934*706ad867SJhaShweta1     {
935*706ad867SJhaShweta1         for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next)
936*706ad867SJhaShweta1         {
937*706ad867SJhaShweta1             if (h->nameA != NULL  && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain->nameA == NULL) ||
938*706ad867SJhaShweta1                 (h->domainA != NULL && domain->nameA != NULL && !__itt_fstrcmp(h->domainA, domain->nameA)))) break;
939*706ad867SJhaShweta1         }
940*706ad867SJhaShweta1         if (h == NULL)
941*706ad867SJhaShweta1         {
942*706ad867SJhaShweta1             NEW_COUNTER_A(&_N_(_ittapi_global),h,h_tail,name,domain->nameA,type);
943*706ad867SJhaShweta1         }
944*706ad867SJhaShweta1     }
945*706ad867SJhaShweta1     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
946*706ad867SJhaShweta1     return (__itt_counter)h;
947*706ad867SJhaShweta1 }
948*706ad867SJhaShweta1 
ITT_VERSIONIZE(ITT_JOIN (_N_ (bind_context_metadata_to_counter),_init))949*706ad867SJhaShweta1 static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(bind_context_metadata_to_counter),_init))(__itt_counter counter, size_t length, __itt_context_metadata* metadata)
950*706ad867SJhaShweta1 {
951*706ad867SJhaShweta1     __itt_counter_metadata *h_tail = NULL, *h = NULL;
952*706ad867SJhaShweta1 
953*706ad867SJhaShweta1     if (counter == NULL || length == 0 || metadata == NULL)
954*706ad867SJhaShweta1     {
955*706ad867SJhaShweta1         return;
956*706ad867SJhaShweta1     }
957*706ad867SJhaShweta1 
958*706ad867SJhaShweta1     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
959*706ad867SJhaShweta1     if (_N_(_ittapi_global).api_initialized)
960*706ad867SJhaShweta1     {
961*706ad867SJhaShweta1         if (ITTNOTIFY_NAME(bind_context_metadata_to_counter) && ITTNOTIFY_NAME(bind_context_metadata_to_counter) != ITT_VERSIONIZE(ITT_JOIN(_N_(bind_context_metadata_to_counter),_init)))
962*706ad867SJhaShweta1         {
963*706ad867SJhaShweta1             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
964*706ad867SJhaShweta1             ITTNOTIFY_NAME(bind_context_metadata_to_counter)(counter, length, metadata);
965*706ad867SJhaShweta1         }
966*706ad867SJhaShweta1         else
967*706ad867SJhaShweta1         {
968*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
969*706ad867SJhaShweta1             __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
970*706ad867SJhaShweta1 #else
971*706ad867SJhaShweta1             if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
972*706ad867SJhaShweta1 #endif
973*706ad867SJhaShweta1             return;
974*706ad867SJhaShweta1         }
975*706ad867SJhaShweta1     }
976*706ad867SJhaShweta1     if (__itt_is_collector_available())
977*706ad867SJhaShweta1     {
978*706ad867SJhaShweta1         size_t item;
979*706ad867SJhaShweta1         char* str_valueA = NULL;
980*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
981*706ad867SJhaShweta1         wchar_t* str_valueW = NULL;
982*706ad867SJhaShweta1 #endif
983*706ad867SJhaShweta1         unsigned long long value = 0;
984*706ad867SJhaShweta1         __itt_context_type type = __itt_context_unknown;
985*706ad867SJhaShweta1 
986*706ad867SJhaShweta1         for (item = 0; item < length; item++)
987*706ad867SJhaShweta1         {
988*706ad867SJhaShweta1             type = metadata[item].type;
989*706ad867SJhaShweta1             for (h_tail = NULL, h = _N_(_ittapi_global).counter_metadata_list; h != NULL; h_tail = h, h = h->next)
990*706ad867SJhaShweta1             {
991*706ad867SJhaShweta1                 if (h->counter != NULL && h->counter == counter && h->type == type) break;
992*706ad867SJhaShweta1             }
993*706ad867SJhaShweta1             if (h == NULL && counter != NULL && type != __itt_context_unknown)
994*706ad867SJhaShweta1             {
995*706ad867SJhaShweta1                 if (type == __itt_context_nameA || type == __itt_context_deviceA || type == __itt_context_unitsA || type == __itt_context_pci_addrA)
996*706ad867SJhaShweta1                 {
997*706ad867SJhaShweta1                     str_valueA = (char*)(metadata[item].value);
998*706ad867SJhaShweta1                     NEW_COUNTER_METADATA_STR_A(&_N_(_ittapi_global),h,h_tail,counter,type,str_valueA);
999*706ad867SJhaShweta1                 }
1000*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
1001*706ad867SJhaShweta1                 else if (type == __itt_context_nameW || type == __itt_context_deviceW || type == __itt_context_unitsW || type == __itt_context_pci_addrW)
1002*706ad867SJhaShweta1                 {
1003*706ad867SJhaShweta1                     str_valueW = (wchar_t*)(metadata[item].value);
1004*706ad867SJhaShweta1                     NEW_COUNTER_METADATA_STR_W(&_N_(_ittapi_global),h,h_tail,counter,type,str_valueW);
1005*706ad867SJhaShweta1                 }
1006*706ad867SJhaShweta1 #endif
1007*706ad867SJhaShweta1                 else if (type >= __itt_context_tid && type <= __itt_context_cpu_cycles_flag)
1008*706ad867SJhaShweta1                 {
1009*706ad867SJhaShweta1                     value = *(unsigned long long*)(metadata[item].value);
1010*706ad867SJhaShweta1                     NEW_COUNTER_METADATA_NUM(&_N_(_ittapi_global),h,h_tail,counter,type,value);
1011*706ad867SJhaShweta1                 }
1012*706ad867SJhaShweta1             }
1013*706ad867SJhaShweta1         }
1014*706ad867SJhaShweta1     }
1015*706ad867SJhaShweta1     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
1016*706ad867SJhaShweta1 }
101751c0b2f7Stbbdev /* -------------------------------------------------------------------------- */
101851c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (pause),_init))101951c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void)
102051c0b2f7Stbbdev {
102151c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
102251c0b2f7Stbbdev     {
102351c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
102451c0b2f7Stbbdev     }
102551c0b2f7Stbbdev     if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init)))
102651c0b2f7Stbbdev     {
102751c0b2f7Stbbdev         ITTNOTIFY_NAME(pause)();
102851c0b2f7Stbbdev     }
102951c0b2f7Stbbdev }
103051c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (resume),_init))103151c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void)
103251c0b2f7Stbbdev {
103351c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
103451c0b2f7Stbbdev     {
103551c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
103651c0b2f7Stbbdev     }
103751c0b2f7Stbbdev     if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init)))
103851c0b2f7Stbbdev     {
103951c0b2f7Stbbdev         ITTNOTIFY_NAME(resume)();
104051c0b2f7Stbbdev     }
104151c0b2f7Stbbdev }
104251c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (pause_scoped),_init))1043*706ad867SJhaShweta1 static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause_scoped),_init))(__itt_collection_scope scope)
1044*706ad867SJhaShweta1 {
1045*706ad867SJhaShweta1     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
1046*706ad867SJhaShweta1     {
1047*706ad867SJhaShweta1         __itt_init_ittlib_name(NULL, __itt_group_all);
1048*706ad867SJhaShweta1     }
1049*706ad867SJhaShweta1     if (ITTNOTIFY_NAME(pause_scoped) && ITTNOTIFY_NAME(pause_scoped) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause_scoped),_init)))
1050*706ad867SJhaShweta1     {
1051*706ad867SJhaShweta1         ITTNOTIFY_NAME(pause_scoped)(scope);
1052*706ad867SJhaShweta1     }
1053*706ad867SJhaShweta1 }
1054*706ad867SJhaShweta1 
ITT_VERSIONIZE(ITT_JOIN (_N_ (resume_scoped),_init))1055*706ad867SJhaShweta1 static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume_scoped),_init))(__itt_collection_scope scope)
1056*706ad867SJhaShweta1 {
1057*706ad867SJhaShweta1     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
1058*706ad867SJhaShweta1     {
1059*706ad867SJhaShweta1         __itt_init_ittlib_name(NULL, __itt_group_all);
1060*706ad867SJhaShweta1     }
1061*706ad867SJhaShweta1     if (ITTNOTIFY_NAME(resume_scoped) && ITTNOTIFY_NAME(resume_scoped) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume_scoped),_init)))
1062*706ad867SJhaShweta1     {
1063*706ad867SJhaShweta1         ITTNOTIFY_NAME(resume_scoped)(scope);
1064*706ad867SJhaShweta1     }
1065*706ad867SJhaShweta1 }
1066*706ad867SJhaShweta1 
106751c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_set_nameW),_init))106851c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const wchar_t* name)
106951c0b2f7Stbbdev {
107051c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
107151c0b2f7Stbbdev     {
107251c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
107351c0b2f7Stbbdev     }
107451c0b2f7Stbbdev     if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init)))
107551c0b2f7Stbbdev     {
107651c0b2f7Stbbdev         ITTNOTIFY_NAME(thread_set_nameW)(name);
107751c0b2f7Stbbdev     }
107851c0b2f7Stbbdev }
107951c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_setW),_init))108051c0b2f7Stbbdev static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen)
108151c0b2f7Stbbdev {
108251c0b2f7Stbbdev     (void)namelen;
108351c0b2f7Stbbdev     ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(name);
108451c0b2f7Stbbdev     return 0;
108551c0b2f7Stbbdev }
108651c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_set_nameA),_init))108751c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(const char* name)
108851c0b2f7Stbbdev #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
108951c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const char* name)
109051c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
109151c0b2f7Stbbdev {
109251c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
109351c0b2f7Stbbdev     {
109451c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
109551c0b2f7Stbbdev     }
109651c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
109751c0b2f7Stbbdev     if (ITTNOTIFY_NAME(thread_set_nameA) && ITTNOTIFY_NAME(thread_set_nameA) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init)))
109851c0b2f7Stbbdev     {
109951c0b2f7Stbbdev         ITTNOTIFY_NAME(thread_set_nameA)(name);
110051c0b2f7Stbbdev     }
110151c0b2f7Stbbdev #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
110251c0b2f7Stbbdev     if (ITTNOTIFY_NAME(thread_set_name) && ITTNOTIFY_NAME(thread_set_name) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init)))
110351c0b2f7Stbbdev     {
110451c0b2f7Stbbdev         ITTNOTIFY_NAME(thread_set_name)(name);
110551c0b2f7Stbbdev     }
110651c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
110751c0b2f7Stbbdev }
110851c0b2f7Stbbdev 
110951c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_setA),_init))111051c0b2f7Stbbdev static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setA),_init))(const char* name, int namelen)
111151c0b2f7Stbbdev {
111251c0b2f7Stbbdev     (void)namelen;
111351c0b2f7Stbbdev     ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(name);
111451c0b2f7Stbbdev     return 0;
111551c0b2f7Stbbdev }
111651c0b2f7Stbbdev #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_set),_init))111751c0b2f7Stbbdev static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_set),_init))(const char* name, int namelen)
111851c0b2f7Stbbdev {
111951c0b2f7Stbbdev     (void)namelen;
112051c0b2f7Stbbdev     ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(name);
112151c0b2f7Stbbdev     return 0;
112251c0b2f7Stbbdev }
112351c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
112451c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_ignore),_init))112551c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void)
112651c0b2f7Stbbdev {
112751c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
112851c0b2f7Stbbdev     {
112951c0b2f7Stbbdev         __itt_init_ittlib_name(NULL, __itt_group_all);
113051c0b2f7Stbbdev     }
113151c0b2f7Stbbdev     if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init)))
113251c0b2f7Stbbdev     {
113351c0b2f7Stbbdev         ITTNOTIFY_NAME(thread_ignore)();
113451c0b2f7Stbbdev     }
113551c0b2f7Stbbdev }
113651c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_ignore),_init))113751c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void)
113851c0b2f7Stbbdev {
113951c0b2f7Stbbdev     ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))();
114051c0b2f7Stbbdev }
114151c0b2f7Stbbdev 
ITT_VERSIONIZE(ITT_JOIN (_N_ (enable_attach),_init))114251c0b2f7Stbbdev static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void)
114351c0b2f7Stbbdev {
114451c0b2f7Stbbdev #ifdef __ANDROID__
114551c0b2f7Stbbdev     /*
114651c0b2f7Stbbdev      * if LIB_VAR_NAME env variable were set before then stay previous value
114751c0b2f7Stbbdev      * else set default path
114851c0b2f7Stbbdev     */
114951c0b2f7Stbbdev     setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0);
115051c0b2f7Stbbdev #endif
115151c0b2f7Stbbdev }
115251c0b2f7Stbbdev 
115351c0b2f7Stbbdev /* -------------------------------------------------------------------------- */
115451c0b2f7Stbbdev 
__itt_fsplit(const char * s,const char * sep,const char ** out,int * len)115551c0b2f7Stbbdev static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len)
115651c0b2f7Stbbdev {
115751c0b2f7Stbbdev     int i;
115851c0b2f7Stbbdev     int j;
115951c0b2f7Stbbdev 
116051c0b2f7Stbbdev     if (!s || !sep || !out || !len)
116151c0b2f7Stbbdev         return NULL;
116251c0b2f7Stbbdev 
116351c0b2f7Stbbdev     for (i = 0; s[i]; i++)
116451c0b2f7Stbbdev     {
116551c0b2f7Stbbdev         int b = 0;
116651c0b2f7Stbbdev         for (j = 0; sep[j]; j++)
116751c0b2f7Stbbdev             if (s[i] == sep[j])
116851c0b2f7Stbbdev             {
116951c0b2f7Stbbdev                 b = 1;
117051c0b2f7Stbbdev                 break;
117151c0b2f7Stbbdev             }
117251c0b2f7Stbbdev         if (!b)
117351c0b2f7Stbbdev             break;
117451c0b2f7Stbbdev     }
117551c0b2f7Stbbdev 
117651c0b2f7Stbbdev     if (!s[i])
117751c0b2f7Stbbdev         return NULL;
117851c0b2f7Stbbdev 
117951c0b2f7Stbbdev     *len = 0;
118051c0b2f7Stbbdev     *out = &s[i];
118151c0b2f7Stbbdev 
118251c0b2f7Stbbdev     for (; s[i]; i++, (*len)++)
118351c0b2f7Stbbdev     {
118451c0b2f7Stbbdev         int b = 0;
118551c0b2f7Stbbdev         for (j = 0; sep[j]; j++)
118651c0b2f7Stbbdev             if (s[i] == sep[j])
118751c0b2f7Stbbdev             {
118851c0b2f7Stbbdev                 b = 1;
118951c0b2f7Stbbdev                 break;
119051c0b2f7Stbbdev             }
119151c0b2f7Stbbdev         if (b)
119251c0b2f7Stbbdev             break;
119351c0b2f7Stbbdev     }
119451c0b2f7Stbbdev 
119551c0b2f7Stbbdev     for (; s[i]; i++)
119651c0b2f7Stbbdev     {
119751c0b2f7Stbbdev         int b = 0;
119851c0b2f7Stbbdev         for (j = 0; sep[j]; j++)
119951c0b2f7Stbbdev             if (s[i] == sep[j])
120051c0b2f7Stbbdev             {
120151c0b2f7Stbbdev                 b = 1;
120251c0b2f7Stbbdev                 break;
120351c0b2f7Stbbdev             }
120451c0b2f7Stbbdev         if (!b)
120551c0b2f7Stbbdev             break;
120651c0b2f7Stbbdev     }
120751c0b2f7Stbbdev 
120851c0b2f7Stbbdev     return &s[i];
120951c0b2f7Stbbdev }
121051c0b2f7Stbbdev 
121151c0b2f7Stbbdev /* This function return value of env variable that placed into static buffer.
121251c0b2f7Stbbdev  * !!! The same static buffer is used for subsequent calls. !!!
121351c0b2f7Stbbdev  * This was done to avoid dynamic allocation for few calls.
121451c0b2f7Stbbdev  * Actually we need this function only four times.
121551c0b2f7Stbbdev  */
__itt_get_env_var(const char * name)121651c0b2f7Stbbdev static const char* __itt_get_env_var(const char* name)
121751c0b2f7Stbbdev {
121851c0b2f7Stbbdev #define MAX_ENV_VALUE_SIZE 4086
121951c0b2f7Stbbdev     static char  env_buff[MAX_ENV_VALUE_SIZE];
122051c0b2f7Stbbdev     static char* env_value = (char*)env_buff;
122151c0b2f7Stbbdev 
122251c0b2f7Stbbdev     if (name != NULL)
122351c0b2f7Stbbdev     {
122451c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
122551c0b2f7Stbbdev         size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
122651c0b2f7Stbbdev         DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len);
122751c0b2f7Stbbdev         if (rc >= max_len)
122851c0b2f7Stbbdev             __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1, (size_t)(max_len - 1));
122951c0b2f7Stbbdev         else if (rc > 0)
123051c0b2f7Stbbdev         {
123151c0b2f7Stbbdev             const char* ret = (const char*)env_value;
123251c0b2f7Stbbdev             env_value += rc + 1;
123351c0b2f7Stbbdev             return ret;
123451c0b2f7Stbbdev         }
123551c0b2f7Stbbdev         else
123651c0b2f7Stbbdev         {
1237478de5b1Stbbdev             /* If environment variable is empty, GetEnvironmentVariables()
123851c0b2f7Stbbdev              * returns zero (number of characters (not including terminating null),
123951c0b2f7Stbbdev              * and GetLastError() returns ERROR_SUCCESS. */
124051c0b2f7Stbbdev             DWORD err = GetLastError();
124151c0b2f7Stbbdev             if (err == ERROR_SUCCESS)
124251c0b2f7Stbbdev                 return env_value;
124351c0b2f7Stbbdev 
124451c0b2f7Stbbdev             if (err != ERROR_ENVVAR_NOT_FOUND)
124551c0b2f7Stbbdev                 __itt_report_error(__itt_error_cant_read_env, name, (int)err);
124651c0b2f7Stbbdev         }
124751c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
124851c0b2f7Stbbdev         char* env = getenv(name);
124951c0b2f7Stbbdev         if (env != NULL)
125051c0b2f7Stbbdev         {
125151c0b2f7Stbbdev             size_t len = __itt_fstrnlen(env, MAX_ENV_VALUE_SIZE);
125251c0b2f7Stbbdev             size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
125351c0b2f7Stbbdev             if (len < max_len)
125451c0b2f7Stbbdev             {
125551c0b2f7Stbbdev                 const char* ret = (const char*)env_value;
125651c0b2f7Stbbdev                 __itt_fstrcpyn(env_value, max_len, env, len + 1);
125751c0b2f7Stbbdev                 env_value += len + 1;
125851c0b2f7Stbbdev                 return ret;
125951c0b2f7Stbbdev             } else
126051c0b2f7Stbbdev                 __itt_report_error(__itt_error_env_too_long, name, (size_t)len, (size_t)(max_len - 1));
126151c0b2f7Stbbdev         }
126251c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
126351c0b2f7Stbbdev     }
126451c0b2f7Stbbdev     return NULL;
126551c0b2f7Stbbdev }
126651c0b2f7Stbbdev 
__itt_get_lib_name(void)126751c0b2f7Stbbdev static const char* __itt_get_lib_name(void)
126851c0b2f7Stbbdev {
126951c0b2f7Stbbdev     const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
127051c0b2f7Stbbdev 
127151c0b2f7Stbbdev #ifdef __ANDROID__
127251c0b2f7Stbbdev     if (lib_name == NULL)
127351c0b2f7Stbbdev     {
127451c0b2f7Stbbdev 
127551c0b2f7Stbbdev #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
127651c0b2f7Stbbdev         const char* const marker_filename = "com.intel.itt.collector_lib_32";
127751c0b2f7Stbbdev #else
127851c0b2f7Stbbdev         const char* const marker_filename = "com.intel.itt.collector_lib_64";
127951c0b2f7Stbbdev #endif
128051c0b2f7Stbbdev 
128151c0b2f7Stbbdev         char system_wide_marker_filename[PATH_MAX] = {0};
128251c0b2f7Stbbdev         int itt_marker_file_fd = -1;
128351c0b2f7Stbbdev         ssize_t res = 0;
128451c0b2f7Stbbdev 
128551c0b2f7Stbbdev         res = snprintf(system_wide_marker_filename, PATH_MAX - 1, "%s%s", "/data/local/tmp/", marker_filename);
128651c0b2f7Stbbdev         if (res < 0)
128751c0b2f7Stbbdev         {
128851c0b2f7Stbbdev             ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
128951c0b2f7Stbbdev             return lib_name;
129051c0b2f7Stbbdev         }
129151c0b2f7Stbbdev         itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);
129251c0b2f7Stbbdev 
129351c0b2f7Stbbdev         if (itt_marker_file_fd == -1)
129451c0b2f7Stbbdev         {
129551c0b2f7Stbbdev             const pid_t my_pid = getpid();
129651c0b2f7Stbbdev             char cmdline_path[PATH_MAX] = {0};
129751c0b2f7Stbbdev             char package_name[PATH_MAX] = {0};
129851c0b2f7Stbbdev             char app_sandbox_file[PATH_MAX] = {0};
129951c0b2f7Stbbdev             int cmdline_fd = 0;
130051c0b2f7Stbbdev 
130151c0b2f7Stbbdev             ITT_ANDROID_LOGI("Unable to open system-wide marker file.");
130251c0b2f7Stbbdev             res = snprintf(cmdline_path, PATH_MAX - 1, "/proc/%d/cmdline", my_pid);
130351c0b2f7Stbbdev             if (res < 0)
130451c0b2f7Stbbdev             {
130551c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to get cmdline path string.");
130651c0b2f7Stbbdev                 return lib_name;
130751c0b2f7Stbbdev             }
130851c0b2f7Stbbdev 
130951c0b2f7Stbbdev             ITT_ANDROID_LOGI("CMD file: %s\n", cmdline_path);
131051c0b2f7Stbbdev             cmdline_fd = open(cmdline_path, O_RDONLY);
131151c0b2f7Stbbdev             if (cmdline_fd == -1)
131251c0b2f7Stbbdev             {
131351c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to open %s file!", cmdline_path);
131451c0b2f7Stbbdev                 return lib_name;
131551c0b2f7Stbbdev             }
131651c0b2f7Stbbdev             res = read(cmdline_fd, package_name, PATH_MAX - 1);
131751c0b2f7Stbbdev             if (res == -1)
131851c0b2f7Stbbdev             {
131951c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to read %s file!", cmdline_path);
132051c0b2f7Stbbdev                 res = close(cmdline_fd);
132151c0b2f7Stbbdev                 if (res == -1)
132251c0b2f7Stbbdev                 {
132351c0b2f7Stbbdev                     ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
132451c0b2f7Stbbdev                 }
132551c0b2f7Stbbdev                 return lib_name;
132651c0b2f7Stbbdev             }
132751c0b2f7Stbbdev             res = close(cmdline_fd);
132851c0b2f7Stbbdev             if (res == -1)
132951c0b2f7Stbbdev             {
133051c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
133151c0b2f7Stbbdev                 return lib_name;
133251c0b2f7Stbbdev             }
133351c0b2f7Stbbdev             ITT_ANDROID_LOGI("Package name: %s\n", package_name);
133451c0b2f7Stbbdev             res = snprintf(app_sandbox_file, PATH_MAX - 1, "/data/data/%s/%s", package_name, marker_filename);
133551c0b2f7Stbbdev             if (res < 0)
133651c0b2f7Stbbdev             {
133751c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
133851c0b2f7Stbbdev                 return lib_name;
133951c0b2f7Stbbdev             }
134051c0b2f7Stbbdev 
134151c0b2f7Stbbdev             ITT_ANDROID_LOGI("Lib marker file name: %s\n", app_sandbox_file);
134251c0b2f7Stbbdev             itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);
134351c0b2f7Stbbdev             if (itt_marker_file_fd == -1)
134451c0b2f7Stbbdev             {
134551c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to open app marker file!");
134651c0b2f7Stbbdev                 return lib_name;
134751c0b2f7Stbbdev             }
134851c0b2f7Stbbdev         }
134951c0b2f7Stbbdev 
135051c0b2f7Stbbdev         {
135151c0b2f7Stbbdev             char itt_lib_name[PATH_MAX] = {0};
135251c0b2f7Stbbdev 
135351c0b2f7Stbbdev             res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1);
135451c0b2f7Stbbdev             if (res == -1)
135551c0b2f7Stbbdev             {
135651c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to read %s file!", itt_marker_file_fd);
135751c0b2f7Stbbdev                 res = close(itt_marker_file_fd);
135851c0b2f7Stbbdev                 if (res == -1)
135951c0b2f7Stbbdev                 {
136051c0b2f7Stbbdev                     ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
136151c0b2f7Stbbdev                 }
136251c0b2f7Stbbdev                 return lib_name;
136351c0b2f7Stbbdev             }
136451c0b2f7Stbbdev             ITT_ANDROID_LOGI("ITT Lib path: %s", itt_lib_name);
136551c0b2f7Stbbdev             res = close(itt_marker_file_fd);
136651c0b2f7Stbbdev             if (res == -1)
136751c0b2f7Stbbdev             {
136851c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
136951c0b2f7Stbbdev                 return lib_name;
137051c0b2f7Stbbdev             }
137151c0b2f7Stbbdev             ITT_ANDROID_LOGI("Set env %s to %s", ITT_TO_STR(LIB_VAR_NAME), itt_lib_name);
137251c0b2f7Stbbdev             res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0);
137351c0b2f7Stbbdev             if (res == -1)
137451c0b2f7Stbbdev             {
137551c0b2f7Stbbdev                 ITT_ANDROID_LOGE("Unable to set env var!");
137651c0b2f7Stbbdev                 return lib_name;
137751c0b2f7Stbbdev             }
137851c0b2f7Stbbdev             lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
137951c0b2f7Stbbdev             ITT_ANDROID_LOGI("ITT Lib path from env: %s", lib_name);
138051c0b2f7Stbbdev         }
138151c0b2f7Stbbdev     }
138251c0b2f7Stbbdev #endif
138351c0b2f7Stbbdev 
138451c0b2f7Stbbdev     return lib_name;
138551c0b2f7Stbbdev }
138651c0b2f7Stbbdev 
138751c0b2f7Stbbdev /* Avoid clashes with std::min */
138851c0b2f7Stbbdev #define __itt_min(a,b) ((a) < (b) ? (a) : (b))
138951c0b2f7Stbbdev 
__itt_get_groups(void)139051c0b2f7Stbbdev static __itt_group_id __itt_get_groups(void)
139151c0b2f7Stbbdev {
139251c0b2f7Stbbdev     int i;
139351c0b2f7Stbbdev     __itt_group_id res = __itt_group_none;
139451c0b2f7Stbbdev     const char* var_name  = "INTEL_ITTNOTIFY_GROUPS";
139551c0b2f7Stbbdev     const char* group_str = __itt_get_env_var(var_name);
139651c0b2f7Stbbdev 
139751c0b2f7Stbbdev     if (group_str != NULL)
139851c0b2f7Stbbdev     {
139951c0b2f7Stbbdev         int len;
140051c0b2f7Stbbdev         char gr[255];
140151c0b2f7Stbbdev         const char* chunk;
140251c0b2f7Stbbdev         while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL)
140351c0b2f7Stbbdev         {
140451c0b2f7Stbbdev             int min_len = __itt_min(len, (int)(sizeof(gr) - 1));
140551c0b2f7Stbbdev             __itt_fstrcpyn(gr, sizeof(gr) - 1, chunk,  min_len);
140651c0b2f7Stbbdev             gr[min_len] = 0;
140751c0b2f7Stbbdev 
140851c0b2f7Stbbdev             for (i = 0; group_list[i].name != NULL; i++)
140951c0b2f7Stbbdev             {
141051c0b2f7Stbbdev                 if (!__itt_fstrcmp(gr, group_list[i].name))
141151c0b2f7Stbbdev                 {
141251c0b2f7Stbbdev                     res = (__itt_group_id)(res | group_list[i].id);
141351c0b2f7Stbbdev                     break;
141451c0b2f7Stbbdev                 }
141551c0b2f7Stbbdev             }
141651c0b2f7Stbbdev         }
141751c0b2f7Stbbdev         /* TODO: !!! Workaround for bug with warning for unknown group !!!
141851c0b2f7Stbbdev          * Should be fixed in new initialization scheme.
141951c0b2f7Stbbdev          * Now the following groups should be set always. */
142051c0b2f7Stbbdev         for (i = 0; group_list[i].id != __itt_group_none; i++)
142151c0b2f7Stbbdev             if (group_list[i].id != __itt_group_all &&
142251c0b2f7Stbbdev                 group_list[i].id > __itt_group_splitter_min &&
142351c0b2f7Stbbdev                 group_list[i].id < __itt_group_splitter_max)
142451c0b2f7Stbbdev                 res = (__itt_group_id)(res | group_list[i].id);
142551c0b2f7Stbbdev         return res;
142651c0b2f7Stbbdev     }
142751c0b2f7Stbbdev     else
142851c0b2f7Stbbdev     {
142951c0b2f7Stbbdev         for (i = 0; group_alias[i].env_var != NULL; i++)
143051c0b2f7Stbbdev             if (__itt_get_env_var(group_alias[i].env_var) != NULL)
143151c0b2f7Stbbdev                 return group_alias[i].groups;
143251c0b2f7Stbbdev     }
143351c0b2f7Stbbdev 
143451c0b2f7Stbbdev     return res;
143551c0b2f7Stbbdev }
143651c0b2f7Stbbdev 
143751c0b2f7Stbbdev #undef __itt_min
143851c0b2f7Stbbdev 
__itt_lib_version(lib_t lib)143951c0b2f7Stbbdev static int __itt_lib_version(lib_t lib)
144051c0b2f7Stbbdev {
144151c0b2f7Stbbdev     if (lib == NULL)
144251c0b2f7Stbbdev         return 0;
144351c0b2f7Stbbdev     if (__itt_get_proc(lib, "__itt_api_init"))
144451c0b2f7Stbbdev         return 2;
144551c0b2f7Stbbdev     if (__itt_get_proc(lib, "__itt_api_version"))
144651c0b2f7Stbbdev         return 1;
144751c0b2f7Stbbdev     return 0;
144851c0b2f7Stbbdev }
144951c0b2f7Stbbdev 
145051c0b2f7Stbbdev /* It's not used right now! Comment it out to avoid warnings.
145151c0b2f7Stbbdev static void __itt_reinit_all_pointers(void)
145251c0b2f7Stbbdev {
145351c0b2f7Stbbdev     register int i;
145451c0b2f7Stbbdev     // Fill all pointers with initial stubs
145551c0b2f7Stbbdev     for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
145651c0b2f7Stbbdev         *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func;
145751c0b2f7Stbbdev }
145851c0b2f7Stbbdev */
145951c0b2f7Stbbdev 
__itt_nullify_all_pointers(void)146051c0b2f7Stbbdev static void __itt_nullify_all_pointers(void)
146151c0b2f7Stbbdev {
146251c0b2f7Stbbdev     int i;
146351c0b2f7Stbbdev     /* Nulify all pointers except domain_create, string_handle_create  and counter_create */
146451c0b2f7Stbbdev     for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
146551c0b2f7Stbbdev         *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
146651c0b2f7Stbbdev }
146751c0b2f7Stbbdev 
__itt_is_collector_available(void)14680e6d4699SAnuya Welling static int __itt_is_collector_available(void)
14690e6d4699SAnuya Welling {
14700e6d4699SAnuya Welling     int is_available;
14710e6d4699SAnuya Welling 
14720e6d4699SAnuya Welling     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
14730e6d4699SAnuya Welling     if (_N_(_ittapi_global).state == __itt_collection_uninitialized)
14740e6d4699SAnuya Welling     {
14750e6d4699SAnuya Welling         _N_(_ittapi_global).state = (NULL == __itt_get_lib_name()) ? __itt_collection_collector_absent : __itt_collection_collector_exists;
14760e6d4699SAnuya Welling     }
14770e6d4699SAnuya Welling     is_available = (_N_(_ittapi_global).state == __itt_collection_collector_exists ||
14780e6d4699SAnuya Welling         _N_(_ittapi_global).state == __itt_collection_init_successful);
14790e6d4699SAnuya Welling     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
14800e6d4699SAnuya Welling     return is_available;
14810e6d4699SAnuya Welling }
14820e6d4699SAnuya Welling 
14830e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
14840e6d4699SAnuya Welling #if _MSC_VER
148551c0b2f7Stbbdev #pragma warning(push)
148651c0b2f7Stbbdev #pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */
148751c0b2f7Stbbdev #pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */
14880e6d4699SAnuya Welling #endif
148951c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
149051c0b2f7Stbbdev 
_N_(fini_ittlib)149151c0b2f7Stbbdev ITT_EXTERN_C void _N_(fini_ittlib)(void)
149251c0b2f7Stbbdev {
149351c0b2f7Stbbdev     __itt_api_fini_t* __itt_api_fini_ptr = NULL;
149451c0b2f7Stbbdev     static volatile TIDT current_thread = 0;
149551c0b2f7Stbbdev 
149651c0b2f7Stbbdev     if (_N_(_ittapi_global).api_initialized)
149751c0b2f7Stbbdev     {
149851c0b2f7Stbbdev         ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
149951c0b2f7Stbbdev         if (_N_(_ittapi_global).api_initialized)
150051c0b2f7Stbbdev         {
150151c0b2f7Stbbdev             if (current_thread == 0)
150251c0b2f7Stbbdev             {
150351c0b2f7Stbbdev                 if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id();
150451c0b2f7Stbbdev                 if (_N_(_ittapi_global).lib != NULL)
150551c0b2f7Stbbdev                 {
150651c0b2f7Stbbdev                     __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_fini");
150751c0b2f7Stbbdev                 }
150851c0b2f7Stbbdev                 if (__itt_api_fini_ptr)
150951c0b2f7Stbbdev                 {
151051c0b2f7Stbbdev                     __itt_api_fini_ptr(&_N_(_ittapi_global));
151151c0b2f7Stbbdev                 }
151251c0b2f7Stbbdev 
151351c0b2f7Stbbdev                 __itt_nullify_all_pointers();
151451c0b2f7Stbbdev 
151551c0b2f7Stbbdev  /* TODO: !!! not safe !!! don't support unload so far.
151651c0b2f7Stbbdev   *             if (_N_(_ittapi_global).lib != NULL)
151751c0b2f7Stbbdev   *                 __itt_unload_lib(_N_(_ittapi_global).lib);
151851c0b2f7Stbbdev   *             _N_(_ittapi_global).lib = NULL;
151951c0b2f7Stbbdev   */
152051c0b2f7Stbbdev                 _N_(_ittapi_global).api_initialized = 0;
152151c0b2f7Stbbdev                 current_thread = 0;
152251c0b2f7Stbbdev             }
152351c0b2f7Stbbdev         }
152451c0b2f7Stbbdev         if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
152551c0b2f7Stbbdev     }
152651c0b2f7Stbbdev }
152751c0b2f7Stbbdev 
15280e6d4699SAnuya Welling /* !!! this function should be called under mutex lock !!! */
__itt_free_allocated_resources(void)15290e6d4699SAnuya Welling static void __itt_free_allocated_resources(void)
15300e6d4699SAnuya Welling {
15310e6d4699SAnuya Welling     __itt_string_handle* current_string = _N_(_ittapi_global).string_list;
15320e6d4699SAnuya Welling     while (current_string != NULL)
15330e6d4699SAnuya Welling     {
15340e6d4699SAnuya Welling         __itt_string_handle* tmp = current_string->next;
15350e6d4699SAnuya Welling         free((char*)current_string->strA);
15360e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
15370e6d4699SAnuya Welling         free((wchar_t*)current_string->strW);
15380e6d4699SAnuya Welling #endif
15390e6d4699SAnuya Welling         free(current_string);
15400e6d4699SAnuya Welling         current_string = tmp;
15410e6d4699SAnuya Welling     }
15420e6d4699SAnuya Welling     _N_(_ittapi_global).string_list = NULL;
15430e6d4699SAnuya Welling 
15440e6d4699SAnuya Welling     __itt_domain* current_domain = _N_(_ittapi_global).domain_list;
15450e6d4699SAnuya Welling     while (current_domain != NULL)
15460e6d4699SAnuya Welling     {
15470e6d4699SAnuya Welling         __itt_domain* tmp = current_domain->next;
15480e6d4699SAnuya Welling         free((char*)current_domain->nameA);
15490e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
15500e6d4699SAnuya Welling         free((wchar_t*)current_domain->nameW);
15510e6d4699SAnuya Welling #endif
15520e6d4699SAnuya Welling         free(current_domain);
15530e6d4699SAnuya Welling         current_domain = tmp;
15540e6d4699SAnuya Welling     }
15550e6d4699SAnuya Welling     _N_(_ittapi_global).domain_list = NULL;
15560e6d4699SAnuya Welling 
15570e6d4699SAnuya Welling     __itt_counter_info_t* current_couter = _N_(_ittapi_global).counter_list;
15580e6d4699SAnuya Welling     while (current_couter != NULL)
15590e6d4699SAnuya Welling     {
15600e6d4699SAnuya Welling         __itt_counter_info_t* tmp = current_couter->next;
15610e6d4699SAnuya Welling         free((char*)current_couter->nameA);
15620e6d4699SAnuya Welling         free((char*)current_couter->domainA);
15630e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
15640e6d4699SAnuya Welling         free((wchar_t*)current_couter->nameW);
15650e6d4699SAnuya Welling         free((wchar_t*)current_couter->domainW);
15660e6d4699SAnuya Welling #endif
15670e6d4699SAnuya Welling         free(current_couter);
15680e6d4699SAnuya Welling         current_couter = tmp;
15690e6d4699SAnuya Welling     }
15700e6d4699SAnuya Welling     _N_(_ittapi_global).counter_list = NULL;
15710e6d4699SAnuya Welling 
15720e6d4699SAnuya Welling     __itt_histogram* current_histogram = _N_(_ittapi_global).histogram_list;
15730e6d4699SAnuya Welling     while (current_histogram != NULL)
15740e6d4699SAnuya Welling     {
15750e6d4699SAnuya Welling         __itt_histogram* tmp = current_histogram->next;
15760e6d4699SAnuya Welling         free((char*)current_histogram->nameA);
15770e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
15780e6d4699SAnuya Welling         free((wchar_t*)current_histogram->nameW);
15790e6d4699SAnuya Welling #endif
15800e6d4699SAnuya Welling         free(current_histogram);
15810e6d4699SAnuya Welling         current_histogram = tmp;
15820e6d4699SAnuya Welling     }
15830e6d4699SAnuya Welling     _N_(_ittapi_global).histogram_list = NULL;
1584*706ad867SJhaShweta1 
1585*706ad867SJhaShweta1 
1586*706ad867SJhaShweta1     __itt_counter_metadata* current_counter_metadata = _N_(_ittapi_global).counter_metadata_list;
1587*706ad867SJhaShweta1     while (current_counter_metadata != NULL)
1588*706ad867SJhaShweta1     {
1589*706ad867SJhaShweta1         __itt_counter_metadata* tmp = current_counter_metadata->next;
1590*706ad867SJhaShweta1         free((char*)current_counter_metadata->str_valueA);
1591*706ad867SJhaShweta1 #if ITT_PLATFORM==ITT_PLATFORM_WIN
1592*706ad867SJhaShweta1         free((wchar_t*)current_counter_metadata->str_valueW);
1593*706ad867SJhaShweta1 #endif
1594*706ad867SJhaShweta1         free(current_counter_metadata);
1595*706ad867SJhaShweta1         current_counter_metadata = tmp;
1596*706ad867SJhaShweta1     }
1597*706ad867SJhaShweta1     _N_(_ittapi_global).counter_metadata_list = NULL;
15980e6d4699SAnuya Welling }
15990e6d4699SAnuya Welling 
_N_(init_ittlib)160051c0b2f7Stbbdev ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_groups)
160151c0b2f7Stbbdev {
160251c0b2f7Stbbdev     int i;
160351c0b2f7Stbbdev     __itt_group_id groups;
160451c0b2f7Stbbdev #ifdef ITT_COMPLETE_GROUP
160551c0b2f7Stbbdev     __itt_group_id zero_group = __itt_group_none;
160651c0b2f7Stbbdev #endif /* ITT_COMPLETE_GROUP */
160751c0b2f7Stbbdev     static volatile TIDT current_thread = 0;
160851c0b2f7Stbbdev 
160951c0b2f7Stbbdev     if (!_N_(_ittapi_global).api_initialized)
161051c0b2f7Stbbdev     {
161151c0b2f7Stbbdev #ifndef ITT_SIMPLE_INIT
161251c0b2f7Stbbdev         ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
161351c0b2f7Stbbdev #endif /* ITT_SIMPLE_INIT */
161451c0b2f7Stbbdev 
161551c0b2f7Stbbdev         if (!_N_(_ittapi_global).api_initialized)
161651c0b2f7Stbbdev         {
161751c0b2f7Stbbdev             if (current_thread == 0)
161851c0b2f7Stbbdev             {
161951c0b2f7Stbbdev                 if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id();
162051c0b2f7Stbbdev                 if (lib_name == NULL)
162151c0b2f7Stbbdev                 {
162251c0b2f7Stbbdev                     lib_name = __itt_get_lib_name();
162351c0b2f7Stbbdev                 }
162451c0b2f7Stbbdev                 groups = __itt_get_groups();
162551c0b2f7Stbbdev                 if (DL_SYMBOLS && (groups != __itt_group_none || lib_name != NULL))
162651c0b2f7Stbbdev                 {
162751c0b2f7Stbbdev                     _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name);
162851c0b2f7Stbbdev 
162951c0b2f7Stbbdev                     if (_N_(_ittapi_global).lib != NULL)
163051c0b2f7Stbbdev                     {
16310e6d4699SAnuya Welling                         _N_(_ittapi_global).state = __itt_collection_init_successful;
163251c0b2f7Stbbdev                         __itt_api_init_t* __itt_api_init_ptr;
163351c0b2f7Stbbdev                         int lib_version = __itt_lib_version(_N_(_ittapi_global).lib);
163451c0b2f7Stbbdev 
1635478de5b1Stbbdev                         switch (lib_version)
1636478de5b1Stbbdev                         {
163751c0b2f7Stbbdev                         case 0:
163851c0b2f7Stbbdev                             groups = __itt_group_legacy;
1639478de5b1Stbbdev                             ITT_ATTRIBUTE_FALLTHROUGH;
164051c0b2f7Stbbdev                         case 1:
164151c0b2f7Stbbdev                             /* Fill all pointers from dynamic library */
164251c0b2f7Stbbdev                             for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
164351c0b2f7Stbbdev                             {
164451c0b2f7Stbbdev                                 if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups)
164551c0b2f7Stbbdev                                 {
164651c0b2f7Stbbdev                                     *_N_(_ittapi_global).api_list_ptr[i].func_ptr = (void*)__itt_get_proc(_N_(_ittapi_global).lib, _N_(_ittapi_global).api_list_ptr[i].name);
164751c0b2f7Stbbdev                                     if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL)
164851c0b2f7Stbbdev                                     {
164951c0b2f7Stbbdev                                         /* Restore pointers for function with static implementation */
165051c0b2f7Stbbdev                                         *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
165151c0b2f7Stbbdev                                         __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name);
165251c0b2f7Stbbdev #ifdef ITT_COMPLETE_GROUP
165351c0b2f7Stbbdev                                         zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group);
165451c0b2f7Stbbdev #endif /* ITT_COMPLETE_GROUP */
165551c0b2f7Stbbdev                                     }
165651c0b2f7Stbbdev                                 }
165751c0b2f7Stbbdev                                 else
165851c0b2f7Stbbdev                                     *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
165951c0b2f7Stbbdev                             }
166051c0b2f7Stbbdev 
166151c0b2f7Stbbdev                             if (groups == __itt_group_legacy)
166251c0b2f7Stbbdev                             {
166351c0b2f7Stbbdev                                 /* Compatibility with legacy tools */
166451c0b2f7Stbbdev                                 ITTNOTIFY_NAME(thread_ignore)  = ITTNOTIFY_NAME(thr_ignore);
166551c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
166651c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_createA)   = ITTNOTIFY_NAME(sync_set_nameA);
166751c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_createW)   = ITTNOTIFY_NAME(sync_set_nameW);
166851c0b2f7Stbbdev #else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
166951c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_create)    = ITTNOTIFY_NAME(sync_set_name);
167051c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
167151c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_prepare)   = ITTNOTIFY_NAME(notify_sync_prepare);
167251c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_cancel)    = ITTNOTIFY_NAME(notify_sync_cancel);
167351c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_acquired)  = ITTNOTIFY_NAME(notify_sync_acquired);
167451c0b2f7Stbbdev                                 ITTNOTIFY_NAME(sync_releasing) = ITTNOTIFY_NAME(notify_sync_releasing);
167551c0b2f7Stbbdev                             }
167651c0b2f7Stbbdev 
167751c0b2f7Stbbdev #ifdef ITT_COMPLETE_GROUP
167851c0b2f7Stbbdev                             for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
167951c0b2f7Stbbdev                                 if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group)
168051c0b2f7Stbbdev                                     *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;
168151c0b2f7Stbbdev #endif /* ITT_COMPLETE_GROUP */
168251c0b2f7Stbbdev                             break;
168351c0b2f7Stbbdev                         case 2:
168451c0b2f7Stbbdev                             __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_init");
168551c0b2f7Stbbdev                             if (__itt_api_init_ptr)
168651c0b2f7Stbbdev                                 __itt_api_init_ptr(&_N_(_ittapi_global), init_groups);
168751c0b2f7Stbbdev                             break;
168851c0b2f7Stbbdev                         }
168951c0b2f7Stbbdev                     }
169051c0b2f7Stbbdev                     else
169151c0b2f7Stbbdev                     {
16920e6d4699SAnuya Welling                         _N_(_ittapi_global).state = __itt_collection_init_fail;
16930e6d4699SAnuya Welling                         __itt_free_allocated_resources();
169451c0b2f7Stbbdev                         __itt_nullify_all_pointers();
169551c0b2f7Stbbdev 
1696478de5b1Stbbdev                         __itt_report_error(__itt_error_no_module, lib_name,
169751c0b2f7Stbbdev #if ITT_PLATFORM==ITT_PLATFORM_WIN
1698478de5b1Stbbdev                             __itt_system_error()
169951c0b2f7Stbbdev #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1700478de5b1Stbbdev                             dlerror()
170151c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1702478de5b1Stbbdev                         );
170351c0b2f7Stbbdev                     }
170451c0b2f7Stbbdev                 }
170551c0b2f7Stbbdev                 else
170651c0b2f7Stbbdev                 {
17070e6d4699SAnuya Welling                     _N_(_ittapi_global).state = __itt_collection_collector_absent;
170851c0b2f7Stbbdev                     __itt_nullify_all_pointers();
170951c0b2f7Stbbdev                 }
171051c0b2f7Stbbdev                 _N_(_ittapi_global).api_initialized = 1;
171151c0b2f7Stbbdev                 current_thread = 0;
171251c0b2f7Stbbdev                 /* !!! Just to avoid unused code elimination !!! */
171351c0b2f7Stbbdev                 if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0;
171451c0b2f7Stbbdev             }
171551c0b2f7Stbbdev         }
171651c0b2f7Stbbdev 
171751c0b2f7Stbbdev #ifndef ITT_SIMPLE_INIT
171851c0b2f7Stbbdev         if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
171951c0b2f7Stbbdev #endif /* ITT_SIMPLE_INIT */
172051c0b2f7Stbbdev     }
172151c0b2f7Stbbdev 
172251c0b2f7Stbbdev     /* Evaluating if any function ptr is non empty and it's in init_groups */
172351c0b2f7Stbbdev     for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
172451c0b2f7Stbbdev     {
172551c0b2f7Stbbdev         if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func &&
172651c0b2f7Stbbdev             _N_(_ittapi_global).api_list_ptr[i].group & init_groups)
172751c0b2f7Stbbdev         {
172851c0b2f7Stbbdev             return 1;
172951c0b2f7Stbbdev         }
173051c0b2f7Stbbdev     }
173151c0b2f7Stbbdev     return 0;
173251c0b2f7Stbbdev }
173351c0b2f7Stbbdev 
_N_(set_error_handler)173451c0b2f7Stbbdev ITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler)
173551c0b2f7Stbbdev {
173651c0b2f7Stbbdev     __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;
173751c0b2f7Stbbdev     _N_(_ittapi_global).error_handler = (void*)(size_t)handler;
173851c0b2f7Stbbdev     return prev;
173951c0b2f7Stbbdev }
174051c0b2f7Stbbdev 
17410e6d4699SAnuya Welling #if ITT_PLATFORM==ITT_PLATFORM_WIN
17420e6d4699SAnuya Welling #if _MSC_VER
174351c0b2f7Stbbdev #pragma warning(pop)
17440e6d4699SAnuya Welling #endif
174551c0b2f7Stbbdev #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
174651c0b2f7Stbbdev 
174751c0b2f7Stbbdev /** __itt_mark_pt_region functions marks region of interest
174851c0b2f7Stbbdev  * region parameter defines different regions.
174951c0b2f7Stbbdev  * 0 <= region < 8 */
175051c0b2f7Stbbdev 
175151c0b2f7Stbbdev #if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
175251c0b2f7Stbbdev void __itt_pt_mark(__itt_pt_region region);
175351c0b2f7Stbbdev void __itt_pt_mark_event(__itt_pt_region region);
175451c0b2f7Stbbdev #endif
175551c0b2f7Stbbdev 
_N_(mark_pt_region_begin)175651c0b2f7Stbbdev ITT_EXTERN_C void _N_(mark_pt_region_begin)(__itt_pt_region region)
175751c0b2f7Stbbdev {
175851c0b2f7Stbbdev #if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
175951c0b2f7Stbbdev     if (_N_(_ittapi_global).ipt_collect_events == 1)
176051c0b2f7Stbbdev     {
176151c0b2f7Stbbdev         __itt_pt_mark_event(2*region);
176251c0b2f7Stbbdev     }
176351c0b2f7Stbbdev     else
176451c0b2f7Stbbdev     {
176551c0b2f7Stbbdev         __itt_pt_mark(2*region);
176651c0b2f7Stbbdev     }
176751c0b2f7Stbbdev #else
176851c0b2f7Stbbdev     (void)region;
176951c0b2f7Stbbdev #endif
177051c0b2f7Stbbdev }
177151c0b2f7Stbbdev 
_N_(mark_pt_region_end)177251c0b2f7Stbbdev ITT_EXTERN_C void _N_(mark_pt_region_end)(__itt_pt_region region)
177351c0b2f7Stbbdev {
177451c0b2f7Stbbdev #if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__)
177551c0b2f7Stbbdev     if (_N_(_ittapi_global).ipt_collect_events == 1)
177651c0b2f7Stbbdev     {
177751c0b2f7Stbbdev         __itt_pt_mark_event(2*region + 1);
177851c0b2f7Stbbdev     }
177951c0b2f7Stbbdev     else
178051c0b2f7Stbbdev     {
178151c0b2f7Stbbdev         __itt_pt_mark(2*region + 1);
178251c0b2f7Stbbdev     }
178351c0b2f7Stbbdev #else
178451c0b2f7Stbbdev      (void)region;
178551c0b2f7Stbbdev #endif
178651c0b2f7Stbbdev }
17870e6d4699SAnuya Welling 
__itt_collection_state(_N_ (get_collection_state))17880e6d4699SAnuya Welling ITT_EXTERN_C __itt_collection_state (_N_(get_collection_state))(void)
17890e6d4699SAnuya Welling {
17900e6d4699SAnuya Welling     if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL)
17910e6d4699SAnuya Welling     {
17920e6d4699SAnuya Welling         __itt_init_ittlib_name(NULL, __itt_group_all);
17930e6d4699SAnuya Welling     }
17940e6d4699SAnuya Welling     return _N_(_ittapi_global).state;
17950e6d4699SAnuya Welling }
17960e6d4699SAnuya Welling 
17970e6d4699SAnuya Welling /* !!! should be called from the library destructor !!!
17980e6d4699SAnuya Welling  * this function destroys the mutex and frees resources
17990e6d4699SAnuya Welling  * allocated by ITT API static part
18000e6d4699SAnuya Welling  */
_N_(release_resources)18010e6d4699SAnuya Welling ITT_EXTERN_C void (_N_(release_resources))(void)
18020e6d4699SAnuya Welling {
18030e6d4699SAnuya Welling     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
18040e6d4699SAnuya Welling     __itt_free_allocated_resources();
18050e6d4699SAnuya Welling     if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
18060e6d4699SAnuya Welling     ITT_MUTEX_DESTROY(_N_(_ittapi_global));
18070e6d4699SAnuya Welling }
1808