152b87ac3SJonas Hahnfeld 
252b87ac3SJonas Hahnfeld //===----------------------------------------------------------------------===//
352b87ac3SJonas Hahnfeld //
452b87ac3SJonas Hahnfeld // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
552b87ac3SJonas Hahnfeld // See https://llvm.org/LICENSE.txt for license information.
652b87ac3SJonas Hahnfeld // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
752b87ac3SJonas Hahnfeld //
852b87ac3SJonas Hahnfeld //===----------------------------------------------------------------------===//
952b87ac3SJonas Hahnfeld 
10*7f1a6d89SAndreyChurbanov #include "kmp_config.h" // INTEL_ITTNOTIFY_PREFIX definition
1152b87ac3SJonas Hahnfeld #include "ittnotify_config.h"
1252b87ac3SJonas Hahnfeld 
1352b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
14*7f1a6d89SAndreyChurbanov #if !defined(PATH_MAX)
1552b87ac3SJonas Hahnfeld #define PATH_MAX 512
1652b87ac3SJonas Hahnfeld #endif
1752b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
1852b87ac3SJonas Hahnfeld #include <limits.h>
1952b87ac3SJonas Hahnfeld #include <dlfcn.h>
2052b87ac3SJonas Hahnfeld #include <errno.h>
2152b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
2252b87ac3SJonas Hahnfeld #include <stdio.h>
2352b87ac3SJonas Hahnfeld #include <stdlib.h>
2452b87ac3SJonas Hahnfeld #include <stdarg.h>
2552b87ac3SJonas Hahnfeld #include <string.h>
2652b87ac3SJonas Hahnfeld 
2752b87ac3SJonas Hahnfeld #define INTEL_NO_MACRO_BODY
2852b87ac3SJonas Hahnfeld #define INTEL_ITTNOTIFY_API_PRIVATE
2952b87ac3SJonas Hahnfeld #include "ittnotify.h"
3052b87ac3SJonas Hahnfeld #include "legacy/ittnotify.h"
3152b87ac3SJonas Hahnfeld 
3252b87ac3SJonas Hahnfeld #include "disable_warnings.h"
3352b87ac3SJonas Hahnfeld 
34*7f1a6d89SAndreyChurbanov static const char api_version[] = API_VERSION "\0\n@(#) $Revision$\n";
3552b87ac3SJonas Hahnfeld 
3652b87ac3SJonas Hahnfeld #define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, n)
3752b87ac3SJonas Hahnfeld 
38*7f1a6d89SAndreyChurbanov #ifndef HAS_CPP_ATTR
39*7f1a6d89SAndreyChurbanov #if defined(__cplusplus) && defined(__has_cpp_attribute)
40*7f1a6d89SAndreyChurbanov #define HAS_CPP_ATTR(X) __has_cpp_attribute(X)
41*7f1a6d89SAndreyChurbanov #else
42*7f1a6d89SAndreyChurbanov #define HAS_CPP_ATTR(X) 0
43*7f1a6d89SAndreyChurbanov #endif
44*7f1a6d89SAndreyChurbanov #endif
45*7f1a6d89SAndreyChurbanov 
46*7f1a6d89SAndreyChurbanov #ifndef HAS_C_ATTR
47*7f1a6d89SAndreyChurbanov #if defined(__STDC__) && defined(__has_c_attribute)
48*7f1a6d89SAndreyChurbanov #define HAS_C_ATTR(X) __has_c_attribute(X)
49*7f1a6d89SAndreyChurbanov #else
50*7f1a6d89SAndreyChurbanov #define HAS_C_ATTR(X) 0
51*7f1a6d89SAndreyChurbanov #endif
52*7f1a6d89SAndreyChurbanov #endif
53*7f1a6d89SAndreyChurbanov 
54*7f1a6d89SAndreyChurbanov #ifndef HAS_GNU_ATTR
55*7f1a6d89SAndreyChurbanov #if defined(__has_attribute)
56*7f1a6d89SAndreyChurbanov #define HAS_GNU_ATTR(X) __has_attribute(X)
57*7f1a6d89SAndreyChurbanov #else
58*7f1a6d89SAndreyChurbanov #define HAS_GNU_ATTR(X) 0
59*7f1a6d89SAndreyChurbanov #endif
60*7f1a6d89SAndreyChurbanov #endif
61*7f1a6d89SAndreyChurbanov 
62*7f1a6d89SAndreyChurbanov #ifndef ITT_ATTRIBUTE_FALLTHROUGH
63*7f1a6d89SAndreyChurbanov #if (HAS_CPP_ATTR(fallthrough) || HAS_C_ATTR(fallthrough)) &&                  \
64*7f1a6d89SAndreyChurbanov     (__cplusplus >= 201703L || _MSVC_LANG >= 201703L)
65*7f1a6d89SAndreyChurbanov #define ITT_ATTRIBUTE_FALLTHROUGH [[fallthrough]]
66*7f1a6d89SAndreyChurbanov #elif HAS_CPP_ATTR(gnu::fallthrough)
67*7f1a6d89SAndreyChurbanov #define ITT_ATTRIBUTE_FALLTHROUGH [[gnu::fallthrough]]
68*7f1a6d89SAndreyChurbanov #elif HAS_CPP_ATTR(clang::fallthrough)
69*7f1a6d89SAndreyChurbanov #define ITT_ATTRIBUTE_FALLTHROUGH [[clang::fallthrough]]
70*7f1a6d89SAndreyChurbanov #elif HAS_GNU_ATTR(fallthrough) && !__INTEL_COMPILER
71*7f1a6d89SAndreyChurbanov #define ITT_ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
72*7f1a6d89SAndreyChurbanov #else
73*7f1a6d89SAndreyChurbanov #define ITT_ATTRIBUTE_FALLTHROUGH
74*7f1a6d89SAndreyChurbanov #endif
75*7f1a6d89SAndreyChurbanov #endif
76*7f1a6d89SAndreyChurbanov 
7752b87ac3SJonas Hahnfeld #if ITT_OS == ITT_OS_WIN
7852b87ac3SJonas Hahnfeld static const char *ittnotify_lib_name = "libittnotify.dll";
7952b87ac3SJonas Hahnfeld #elif ITT_OS == ITT_OS_LINUX || ITT_OS == ITT_OS_FREEBSD
8052b87ac3SJonas Hahnfeld static const char *ittnotify_lib_name = "libittnotify.so";
8152b87ac3SJonas Hahnfeld #elif ITT_OS == ITT_OS_MAC
8252b87ac3SJonas Hahnfeld static const char *ittnotify_lib_name = "libittnotify.dylib";
8352b87ac3SJonas Hahnfeld #else
8452b87ac3SJonas Hahnfeld #error Unsupported or unknown OS.
8552b87ac3SJonas Hahnfeld #endif
8652b87ac3SJonas Hahnfeld 
8752b87ac3SJonas Hahnfeld #ifdef __ANDROID__
8852b87ac3SJonas Hahnfeld #include <android/log.h>
8952b87ac3SJonas Hahnfeld #include <stdio.h>
9052b87ac3SJonas Hahnfeld #include <unistd.h>
9152b87ac3SJonas Hahnfeld #include <sys/types.h>
9252b87ac3SJonas Hahnfeld #include <sys/stat.h>
9352b87ac3SJonas Hahnfeld #include <fcntl.h>
9452b87ac3SJonas Hahnfeld #include <linux/limits.h>
9552b87ac3SJonas Hahnfeld 
9652b87ac3SJonas Hahnfeld #ifdef ITT_ANDROID_LOG
9752b87ac3SJonas Hahnfeld #define ITT_ANDROID_LOG_TAG "INTEL_VTUNE_USERAPI"
98309b00a4SShilei Tian #define ITT_ANDROID_LOGI(...)                                                  \
99309b00a4SShilei Tian   ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG,            \
100309b00a4SShilei Tian                              __VA_ARGS__))
101309b00a4SShilei Tian #define ITT_ANDROID_LOGW(...)                                                  \
102309b00a4SShilei Tian   ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG,            \
103309b00a4SShilei Tian                              __VA_ARGS__))
104309b00a4SShilei Tian #define ITT_ANDROID_LOGE(...)                                                  \
105309b00a4SShilei Tian   ((void)__android_log_print(ANDROID_LOG_ERROR, ITT_ANDROID_LOG_TAG,           \
106309b00a4SShilei Tian                              __VA_ARGS__))
107309b00a4SShilei Tian #define ITT_ANDROID_LOGD(...)                                                  \
108309b00a4SShilei Tian   ((void)__android_log_print(ANDROID_LOG_DEBUG, ITT_ANDROID_LOG_TAG,           \
109309b00a4SShilei Tian                              __VA_ARGS__))
11052b87ac3SJonas Hahnfeld #else
11152b87ac3SJonas Hahnfeld #define ITT_ANDROID_LOGI(...)
11252b87ac3SJonas Hahnfeld #define ITT_ANDROID_LOGW(...)
11352b87ac3SJonas Hahnfeld #define ITT_ANDROID_LOGE(...)
11452b87ac3SJonas Hahnfeld #define ITT_ANDROID_LOGD(...)
11552b87ac3SJonas Hahnfeld #endif
11652b87ac3SJonas Hahnfeld 
11752b87ac3SJonas Hahnfeld /* default location of userapi collector on Android */
118309b00a4SShilei Tian #define ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(x)                                 \
119309b00a4SShilei Tian   "/data/data/com.intel.vtune/perfrun/lib" #x "/runtime/libittnotify.so"
12052b87ac3SJonas Hahnfeld 
12152b87ac3SJonas Hahnfeld #if ITT_ARCH == ITT_ARCH_IA32 || ITT_ARCH == ITT_ARCH_ARM
12252b87ac3SJonas Hahnfeld #define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(32)
12352b87ac3SJonas Hahnfeld #else
12452b87ac3SJonas Hahnfeld #define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(64)
12552b87ac3SJonas Hahnfeld #endif
12652b87ac3SJonas Hahnfeld 
12752b87ac3SJonas Hahnfeld #endif
12852b87ac3SJonas Hahnfeld 
12952b87ac3SJonas Hahnfeld #ifndef LIB_VAR_NAME
130*7f1a6d89SAndreyChurbanov #if ITT_ARCH == ITT_ARCH_IA32 || ITT_ARCH == ITT_ARCH_ARM
13152b87ac3SJonas Hahnfeld #define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
13252b87ac3SJonas Hahnfeld #else
13352b87ac3SJonas Hahnfeld #define LIB_VAR_NAME INTEL_LIBITTNOTIFY64
13452b87ac3SJonas Hahnfeld #endif
13552b87ac3SJonas Hahnfeld #endif /* LIB_VAR_NAME */
13652b87ac3SJonas Hahnfeld 
137309b00a4SShilei Tian #define ITT_MUTEX_INIT_AND_LOCK(p)                                             \
13852b87ac3SJonas Hahnfeld   {                                                                            \
139309b00a4SShilei Tian     if (PTHREAD_SYMBOLS) {                                                     \
140309b00a4SShilei Tian       if (!p.mutex_initialized) {                                              \
141309b00a4SShilei Tian         if (__itt_interlocked_increment(&p.atomic_counter) == 1) {             \
14252b87ac3SJonas Hahnfeld           __itt_mutex_init(&p.mutex);                                          \
14352b87ac3SJonas Hahnfeld           p.mutex_initialized = 1;                                             \
144309b00a4SShilei Tian         } else                                                                 \
14552b87ac3SJonas Hahnfeld           while (!p.mutex_initialized)                                         \
14652b87ac3SJonas Hahnfeld             __itt_thread_yield();                                              \
14752b87ac3SJonas Hahnfeld       }                                                                        \
14852b87ac3SJonas Hahnfeld       __itt_mutex_lock(&p.mutex);                                              \
14952b87ac3SJonas Hahnfeld     }                                                                          \
15052b87ac3SJonas Hahnfeld   }
15152b87ac3SJonas Hahnfeld 
152*7f1a6d89SAndreyChurbanov #define ITT_MODULE_OBJECT_VERSION 1
153*7f1a6d89SAndreyChurbanov 
15452b87ac3SJonas Hahnfeld typedef int(__itt_init_ittlib_t)(const char *, __itt_group_id);
15552b87ac3SJonas Hahnfeld 
15652b87ac3SJonas Hahnfeld /* this define used to control initialization function name. */
15752b87ac3SJonas Hahnfeld #ifndef __itt_init_ittlib_name
15852b87ac3SJonas Hahnfeld ITT_EXTERN_C int _N_(init_ittlib)(const char *, __itt_group_id);
15952b87ac3SJonas Hahnfeld static __itt_init_ittlib_t *__itt_init_ittlib_ptr = _N_(init_ittlib);
16052b87ac3SJonas Hahnfeld #define __itt_init_ittlib_name __itt_init_ittlib_ptr
16152b87ac3SJonas Hahnfeld #endif /* __itt_init_ittlib_name */
16252b87ac3SJonas Hahnfeld 
16352b87ac3SJonas Hahnfeld typedef void(__itt_fini_ittlib_t)(void);
16452b87ac3SJonas Hahnfeld 
16552b87ac3SJonas Hahnfeld /* this define used to control finalization function name. */
16652b87ac3SJonas Hahnfeld #ifndef __itt_fini_ittlib_name
16752b87ac3SJonas Hahnfeld ITT_EXTERN_C void _N_(fini_ittlib)(void);
16852b87ac3SJonas Hahnfeld static __itt_fini_ittlib_t *__itt_fini_ittlib_ptr = _N_(fini_ittlib);
16952b87ac3SJonas Hahnfeld #define __itt_fini_ittlib_name __itt_fini_ittlib_ptr
17052b87ac3SJonas Hahnfeld #endif /* __itt_fini_ittlib_name */
17152b87ac3SJonas Hahnfeld 
172*7f1a6d89SAndreyChurbanov extern __itt_global _N_(_ittapi_global);
173*7f1a6d89SAndreyChurbanov 
17452b87ac3SJonas Hahnfeld /* building pointers to imported funcs */
17552b87ac3SJonas Hahnfeld #undef ITT_STUBV
17652b87ac3SJonas Hahnfeld #undef ITT_STUB
17752b87ac3SJonas Hahnfeld #define ITT_STUB(api, type, name, args, params, ptr, group, format)            \
17852b87ac3SJonas Hahnfeld   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args;             \
17952b87ac3SJonas Hahnfeld   typedef type api ITT_JOIN(_N_(name), _t) args;                               \
180309b00a4SShilei Tian   ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name), _t) * ITTNOTIFY_NAME(name) =          \
181309b00a4SShilei Tian       ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init));                              \
182309b00a4SShilei Tian   ITT_EXTERN_C_END                                                             \
183309b00a4SShilei Tian   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args {            \
184*7f1a6d89SAndreyChurbanov     if (!_N_(_ittapi_global).api_initialized &&                                \
185*7f1a6d89SAndreyChurbanov         _N_(_ittapi_global).thread_list == NULL)                               \
18652b87ac3SJonas Hahnfeld       __itt_init_ittlib_name(NULL, __itt_group_all);                           \
187309b00a4SShilei Tian     if (ITTNOTIFY_NAME(name) &&                                                \
188309b00a4SShilei Tian         ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)))    \
18952b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(name) params;                                      \
19052b87ac3SJonas Hahnfeld     else                                                                       \
19152b87ac3SJonas Hahnfeld       return (type)0;                                                          \
19252b87ac3SJonas Hahnfeld   }
19352b87ac3SJonas Hahnfeld 
19452b87ac3SJonas Hahnfeld #define ITT_STUBV(api, type, name, args, params, ptr, group, format)           \
19552b87ac3SJonas Hahnfeld   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args;             \
19652b87ac3SJonas Hahnfeld   typedef type api ITT_JOIN(_N_(name), _t) args;                               \
197309b00a4SShilei Tian   ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name), _t) * ITTNOTIFY_NAME(name) =          \
198309b00a4SShilei Tian       ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init));                              \
199309b00a4SShilei Tian   ITT_EXTERN_C_END                                                             \
200309b00a4SShilei Tian   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args {            \
201*7f1a6d89SAndreyChurbanov     if (!_N_(_ittapi_global).api_initialized &&                                \
202*7f1a6d89SAndreyChurbanov         _N_(_ittapi_global).thread_list == NULL)                               \
20352b87ac3SJonas Hahnfeld       __itt_init_ittlib_name(NULL, __itt_group_all);                           \
204309b00a4SShilei Tian     if (ITTNOTIFY_NAME(name) &&                                                \
205309b00a4SShilei Tian         ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)))    \
20652b87ac3SJonas Hahnfeld       ITTNOTIFY_NAME(name) params;                                             \
20752b87ac3SJonas Hahnfeld     else                                                                       \
20852b87ac3SJonas Hahnfeld       return;                                                                  \
20952b87ac3SJonas Hahnfeld   }
21052b87ac3SJonas Hahnfeld 
21152b87ac3SJonas Hahnfeld #undef __ITT_INTERNAL_INIT
21252b87ac3SJonas Hahnfeld #include "ittnotify_static.h"
21352b87ac3SJonas Hahnfeld 
21452b87ac3SJonas Hahnfeld #undef ITT_STUB
21552b87ac3SJonas Hahnfeld #undef ITT_STUBV
21652b87ac3SJonas Hahnfeld #define ITT_STUB(api, type, name, args, params, ptr, group, format)            \
21752b87ac3SJonas Hahnfeld   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args;             \
21852b87ac3SJonas Hahnfeld   typedef type api ITT_JOIN(_N_(name), _t) args;                               \
219309b00a4SShilei Tian   ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name), _t) * ITTNOTIFY_NAME(name) =          \
220309b00a4SShilei Tian       ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init));                              \
221309b00a4SShilei Tian   ITT_EXTERN_C_END
22252b87ac3SJonas Hahnfeld 
22352b87ac3SJonas Hahnfeld #define ITT_STUBV(api, type, name, args, params, ptr, group, format)           \
22452b87ac3SJonas Hahnfeld   static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)) args;             \
22552b87ac3SJonas Hahnfeld   typedef type api ITT_JOIN(_N_(name), _t) args;                               \
226309b00a4SShilei Tian   ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name), _t) * ITTNOTIFY_NAME(name) =          \
227309b00a4SShilei Tian       ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init));                              \
228309b00a4SShilei Tian   ITT_EXTERN_C_END
22952b87ac3SJonas Hahnfeld 
23052b87ac3SJonas Hahnfeld #define __ITT_INTERNAL_INIT
23152b87ac3SJonas Hahnfeld #include "ittnotify_static.h"
23252b87ac3SJonas Hahnfeld #undef __ITT_INTERNAL_INIT
23352b87ac3SJonas Hahnfeld 
23452b87ac3SJonas Hahnfeld ITT_GROUP_LIST(group_list);
23552b87ac3SJonas Hahnfeld 
23652b87ac3SJonas Hahnfeld #pragma pack(push, 8)
23752b87ac3SJonas Hahnfeld 
238309b00a4SShilei Tian typedef struct ___itt_group_alias {
23952b87ac3SJonas Hahnfeld   const char *env_var;
24052b87ac3SJonas Hahnfeld   __itt_group_id groups;
24152b87ac3SJonas Hahnfeld } __itt_group_alias;
24252b87ac3SJonas Hahnfeld 
24352b87ac3SJonas Hahnfeld static __itt_group_alias group_alias[] = {
244309b00a4SShilei Tian     {"KMP_FOR_TPROFILE",
245309b00a4SShilei Tian      (__itt_group_id)(__itt_group_control | __itt_group_thread |
246309b00a4SShilei Tian                       __itt_group_sync | __itt_group_mark)},
247309b00a4SShilei Tian     {"KMP_FOR_TCHECK",
248309b00a4SShilei Tian      (__itt_group_id)(__itt_group_control | __itt_group_thread |
249309b00a4SShilei Tian                       __itt_group_sync | __itt_group_fsync | __itt_group_mark |
250309b00a4SShilei Tian                       __itt_group_suppress)},
25152b87ac3SJonas Hahnfeld     {NULL, (__itt_group_none)},
252309b00a4SShilei Tian     {api_version,
253309b00a4SShilei Tian      (__itt_group_none)} /* !!! Just to avoid unused code elimination !!! */
25452b87ac3SJonas Hahnfeld };
25552b87ac3SJonas Hahnfeld 
25652b87ac3SJonas Hahnfeld #pragma pack(pop)
25752b87ac3SJonas Hahnfeld 
258*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
259*7f1a6d89SAndreyChurbanov #if _MSC_VER
26052b87ac3SJonas Hahnfeld #pragma warning(push)
261*7f1a6d89SAndreyChurbanov #pragma warning(disable : 4054) /* warning C4054: 'type cast' : from function  \
262309b00a4SShilei Tian                                    pointer 'XXX' to data pointer 'void *' */
263*7f1a6d89SAndreyChurbanov #endif
26452b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
26552b87ac3SJonas Hahnfeld 
26652b87ac3SJonas Hahnfeld static __itt_api_info api_list[] = {
26752b87ac3SJonas Hahnfeld /* Define functions with static implementation */
26852b87ac3SJonas Hahnfeld #undef ITT_STUB
26952b87ac3SJonas Hahnfeld #undef ITT_STUBV
270309b00a4SShilei Tian #define ITT_STUB(api, type, name, args, params, nameindll, group, format)      \
271309b00a4SShilei Tian   {ITT_TO_STR(ITT_JOIN(__itt_, nameindll)),                                    \
272309b00a4SShilei Tian    (void **)(void *)&ITTNOTIFY_NAME(name),                                     \
273309b00a4SShilei Tian    (void *)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)),                \
274309b00a4SShilei Tian    (void *)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)),                \
275309b00a4SShilei Tian    (__itt_group_id)(group)},
27652b87ac3SJonas Hahnfeld #define ITT_STUBV ITT_STUB
27752b87ac3SJonas Hahnfeld #define __ITT_INTERNAL_INIT
27852b87ac3SJonas Hahnfeld #include "ittnotify_static.h"
27952b87ac3SJonas Hahnfeld #undef __ITT_INTERNAL_INIT
28052b87ac3SJonas Hahnfeld /* Define functions without static implementation */
28152b87ac3SJonas Hahnfeld #undef ITT_STUB
28252b87ac3SJonas Hahnfeld #undef ITT_STUBV
283309b00a4SShilei Tian #define ITT_STUB(api, type, name, args, params, nameindll, group, format)      \
284309b00a4SShilei Tian   {ITT_TO_STR(ITT_JOIN(__itt_, nameindll)),                                    \
285309b00a4SShilei Tian    (void **)(void *)&ITTNOTIFY_NAME(name),                                     \
286309b00a4SShilei Tian    (void *)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name), _init)), NULL,          \
287309b00a4SShilei Tian    (__itt_group_id)(group)},
28852b87ac3SJonas Hahnfeld #define ITT_STUBV ITT_STUB
28952b87ac3SJonas Hahnfeld #include "ittnotify_static.h"
290309b00a4SShilei Tian     {NULL, NULL, NULL, NULL, __itt_group_none}};
29152b87ac3SJonas Hahnfeld 
292*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
293*7f1a6d89SAndreyChurbanov #if _MSC_VER
29452b87ac3SJonas Hahnfeld #pragma warning(pop)
295*7f1a6d89SAndreyChurbanov #endif
29652b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
29752b87ac3SJonas Hahnfeld 
29852b87ac3SJonas Hahnfeld /* static part descriptor which handles. all notification api attributes. */
29952b87ac3SJonas Hahnfeld __itt_global _N_(_ittapi_global) = {
30052b87ac3SJonas Hahnfeld     ITT_MAGIC, /* identification info */
301309b00a4SShilei Tian     ITT_MAJOR,
302309b00a4SShilei Tian     ITT_MINOR,
303309b00a4SShilei Tian     API_VERSION_BUILD, /* version info */
30452b87ac3SJonas Hahnfeld     0, /* api_initialized */
30552b87ac3SJonas Hahnfeld     0, /* mutex_initialized */
30652b87ac3SJonas Hahnfeld     0, /* atomic_counter */
30752b87ac3SJonas Hahnfeld     MUTEX_INITIALIZER, /* mutex */
30852b87ac3SJonas Hahnfeld     NULL, /* dynamic library handle */
30952b87ac3SJonas Hahnfeld     NULL, /* error_handler */
3105eec1a9dSAndrey Churbanov     NULL, /* dll_path_ptr */
31152b87ac3SJonas Hahnfeld     (__itt_api_info *)&api_list, /* api_list_ptr */
31252b87ac3SJonas Hahnfeld     NULL, /* next __itt_global */
31352b87ac3SJonas Hahnfeld     NULL, /* thread_list */
31452b87ac3SJonas Hahnfeld     NULL, /* domain_list */
31552b87ac3SJonas Hahnfeld     NULL, /* string_list */
31652b87ac3SJonas Hahnfeld     __itt_collection_normal, /* collection state */
317*7f1a6d89SAndreyChurbanov     NULL, /* counter_list */
318*7f1a6d89SAndreyChurbanov     0, /* ipt_collect_events */
319*7f1a6d89SAndreyChurbanov     NULL /* histogram_list */
32052b87ac3SJonas Hahnfeld };
32152b87ac3SJonas Hahnfeld 
32252b87ac3SJonas Hahnfeld typedef void(__itt_api_init_t)(__itt_global *, __itt_group_id);
32352b87ac3SJonas Hahnfeld typedef void(__itt_api_fini_t)(__itt_global *);
32452b87ac3SJonas Hahnfeld 
325*7f1a6d89SAndreyChurbanov static __itt_domain dummy_domain;
32652b87ac3SJonas Hahnfeld /* ========================================================================= */
32752b87ac3SJonas Hahnfeld 
32852b87ac3SJonas Hahnfeld #ifdef ITT_NOTIFY_EXT_REPORT
32952b87ac3SJonas Hahnfeld ITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args);
33052b87ac3SJonas Hahnfeld #endif /* ITT_NOTIFY_EXT_REPORT */
33152b87ac3SJonas Hahnfeld 
332*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
333*7f1a6d89SAndreyChurbanov #if _MSC_VER
33452b87ac3SJonas Hahnfeld #pragma warning(push)
335*7f1a6d89SAndreyChurbanov #pragma warning(                                                               \
336*7f1a6d89SAndreyChurbanov     disable : 4055) /* warning C4055: 'type cast' : from data pointer 'void *' \
337*7f1a6d89SAndreyChurbanov                        to function pointer 'XXX' */
338*7f1a6d89SAndreyChurbanov #endif
33952b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
34052b87ac3SJonas Hahnfeld 
__itt_report_error(int code,...)341*7f1a6d89SAndreyChurbanov static void __itt_report_error(int code, ...) {
34252b87ac3SJonas Hahnfeld   va_list args;
343*7f1a6d89SAndreyChurbanov   va_start(args, code);
344309b00a4SShilei Tian   if (_N_(_ittapi_global).error_handler != NULL) {
345309b00a4SShilei Tian     __itt_error_handler_t *handler =
346309b00a4SShilei Tian         (__itt_error_handler_t *)(size_t)_N_(_ittapi_global).error_handler;
347*7f1a6d89SAndreyChurbanov     handler((__itt_error_code)code, args);
34852b87ac3SJonas Hahnfeld   }
34952b87ac3SJonas Hahnfeld #ifdef ITT_NOTIFY_EXT_REPORT
350*7f1a6d89SAndreyChurbanov   _N_(error_handler)((__itt_error_code)code, args);
35152b87ac3SJonas Hahnfeld #endif /* ITT_NOTIFY_EXT_REPORT */
35252b87ac3SJonas Hahnfeld   va_end(args);
35352b87ac3SJonas Hahnfeld }
35452b87ac3SJonas Hahnfeld 
355*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
356*7f1a6d89SAndreyChurbanov #if _MSC_VER
35752b87ac3SJonas Hahnfeld #pragma warning(pop)
358*7f1a6d89SAndreyChurbanov #endif
35952b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
36052b87ac3SJonas Hahnfeld 
36152b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
362309b00a4SShilei Tian static __itt_domain *ITTAPI
ITT_VERSIONIZE(ITT_JOIN (_N_ (domain_createW),_init))363309b00a4SShilei Tian ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW), _init))(const wchar_t *name) {
36452b87ac3SJonas Hahnfeld   __itt_domain *h_tail = NULL, *h = NULL;
36552b87ac3SJonas Hahnfeld 
366309b00a4SShilei Tian   if (name == NULL) {
36752b87ac3SJonas Hahnfeld     return NULL;
36852b87ac3SJonas Hahnfeld   }
36952b87ac3SJonas Hahnfeld 
37052b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
371309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
372309b00a4SShilei Tian     if (ITTNOTIFY_NAME(domain_createW) &&
373309b00a4SShilei Tian         ITTNOTIFY_NAME(domain_createW) !=
374309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW), _init))) {
37552b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
37652b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(domain_createW)(name);
377*7f1a6d89SAndreyChurbanov     } else {
378*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
379*7f1a6d89SAndreyChurbanov       return &dummy_domain;
38052b87ac3SJonas Hahnfeld     }
38152b87ac3SJonas Hahnfeld   }
382309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL;
383309b00a4SShilei Tian        h_tail = h, h = h->next) {
384309b00a4SShilei Tian     if (h->nameW != NULL && !wcscmp(h->nameW, name))
385309b00a4SShilei Tian       break;
38652b87ac3SJonas Hahnfeld   }
387309b00a4SShilei Tian   if (h == NULL) {
38852b87ac3SJonas Hahnfeld     NEW_DOMAIN_W(&_N_(_ittapi_global), h, h_tail, name);
38952b87ac3SJonas Hahnfeld   }
390309b00a4SShilei Tian   if (PTHREAD_SYMBOLS)
391309b00a4SShilei Tian     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
39252b87ac3SJonas Hahnfeld   return h;
39352b87ac3SJonas Hahnfeld }
39452b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (domain_createA),_init))395309b00a4SShilei Tian static __itt_domain *ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),
396309b00a4SShilei Tian                                                     _init))(const char *name)
39752b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
398309b00a4SShilei Tian static __itt_domain *ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),
399309b00a4SShilei Tian                                                     _init))(const char *name)
40052b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
40152b87ac3SJonas Hahnfeld {
40252b87ac3SJonas Hahnfeld   __itt_domain *h_tail = NULL, *h = NULL;
40352b87ac3SJonas Hahnfeld 
404309b00a4SShilei Tian   if (name == NULL) {
40552b87ac3SJonas Hahnfeld     return NULL;
40652b87ac3SJonas Hahnfeld   }
40752b87ac3SJonas Hahnfeld 
40852b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
409309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
41052b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
411309b00a4SShilei Tian     if (ITTNOTIFY_NAME(domain_createA) &&
412309b00a4SShilei Tian         ITTNOTIFY_NAME(domain_createA) !=
413309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA), _init))) {
41452b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
41552b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(domain_createA)(name);
41652b87ac3SJonas Hahnfeld     }
41752b87ac3SJonas Hahnfeld #else
418309b00a4SShilei Tian     if (ITTNOTIFY_NAME(domain_create) &&
419309b00a4SShilei Tian         ITTNOTIFY_NAME(domain_create) !=
420309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create), _init))) {
421309b00a4SShilei Tian       if (PTHREAD_SYMBOLS)
422309b00a4SShilei Tian         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
42352b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(domain_create)(name);
42452b87ac3SJonas Hahnfeld     }
42552b87ac3SJonas Hahnfeld #endif
426*7f1a6d89SAndreyChurbanov     else {
427*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
428*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
429*7f1a6d89SAndreyChurbanov #else
430*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
431*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
432*7f1a6d89SAndreyChurbanov #endif
433*7f1a6d89SAndreyChurbanov       return &dummy_domain;
434*7f1a6d89SAndreyChurbanov     }
43552b87ac3SJonas Hahnfeld   }
436309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL;
437309b00a4SShilei Tian        h_tail = h, h = h->next) {
438309b00a4SShilei Tian     if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name))
439309b00a4SShilei Tian       break;
44052b87ac3SJonas Hahnfeld   }
441309b00a4SShilei Tian   if (h == NULL) {
44252b87ac3SJonas Hahnfeld     NEW_DOMAIN_A(&_N_(_ittapi_global), h, h_tail, name);
44352b87ac3SJonas Hahnfeld   }
444309b00a4SShilei Tian   if (PTHREAD_SYMBOLS)
445309b00a4SShilei Tian     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
44652b87ac3SJonas Hahnfeld   return h;
44752b87ac3SJonas Hahnfeld }
44852b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (module_load_with_sections),_init))449*7f1a6d89SAndreyChurbanov static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(
450*7f1a6d89SAndreyChurbanov     _N_(module_load_with_sections), _init))(__itt_module_object *module_obj) {
451*7f1a6d89SAndreyChurbanov   if (!_N_(_ittapi_global).api_initialized &&
452*7f1a6d89SAndreyChurbanov       _N_(_ittapi_global).thread_list == NULL) {
453*7f1a6d89SAndreyChurbanov     __itt_init_ittlib_name(NULL, __itt_group_all);
454*7f1a6d89SAndreyChurbanov   }
455*7f1a6d89SAndreyChurbanov   if (ITTNOTIFY_NAME(module_load_with_sections) &&
456*7f1a6d89SAndreyChurbanov       ITTNOTIFY_NAME(module_load_with_sections) !=
457*7f1a6d89SAndreyChurbanov           ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections), _init))) {
458*7f1a6d89SAndreyChurbanov     if (module_obj != NULL) {
459*7f1a6d89SAndreyChurbanov       module_obj->version = ITT_MODULE_OBJECT_VERSION;
460*7f1a6d89SAndreyChurbanov       ITTNOTIFY_NAME(module_load_with_sections)(module_obj);
461*7f1a6d89SAndreyChurbanov     }
462*7f1a6d89SAndreyChurbanov   }
463*7f1a6d89SAndreyChurbanov }
464*7f1a6d89SAndreyChurbanov 
ITT_VERSIONIZE(ITT_JOIN (_N_ (module_unload_with_sections),_init))465*7f1a6d89SAndreyChurbanov static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(
466*7f1a6d89SAndreyChurbanov     _N_(module_unload_with_sections), _init))(__itt_module_object *module_obj) {
467*7f1a6d89SAndreyChurbanov   if (!_N_(_ittapi_global).api_initialized &&
468*7f1a6d89SAndreyChurbanov       _N_(_ittapi_global).thread_list == NULL) {
469*7f1a6d89SAndreyChurbanov     __itt_init_ittlib_name(NULL, __itt_group_all);
470*7f1a6d89SAndreyChurbanov   }
471*7f1a6d89SAndreyChurbanov   if (ITTNOTIFY_NAME(module_unload_with_sections) &&
472*7f1a6d89SAndreyChurbanov       ITTNOTIFY_NAME(module_unload_with_sections) !=
473*7f1a6d89SAndreyChurbanov           ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections), _init))) {
474*7f1a6d89SAndreyChurbanov     if (module_obj != NULL) {
475*7f1a6d89SAndreyChurbanov       module_obj->version = ITT_MODULE_OBJECT_VERSION;
476*7f1a6d89SAndreyChurbanov       ITTNOTIFY_NAME(module_unload_with_sections)(module_obj);
477*7f1a6d89SAndreyChurbanov     }
478*7f1a6d89SAndreyChurbanov   }
479*7f1a6d89SAndreyChurbanov }
480*7f1a6d89SAndreyChurbanov 
48152b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (string_handle_createW),_init))482309b00a4SShilei Tian static __itt_string_handle *ITTAPI ITT_VERSIONIZE(
483309b00a4SShilei Tian     ITT_JOIN(_N_(string_handle_createW), _init))(const wchar_t *name) {
48452b87ac3SJonas Hahnfeld   __itt_string_handle *h_tail = NULL, *h = NULL;
48552b87ac3SJonas Hahnfeld 
486309b00a4SShilei Tian   if (name == NULL) {
48752b87ac3SJonas Hahnfeld     return NULL;
48852b87ac3SJonas Hahnfeld   }
48952b87ac3SJonas Hahnfeld 
49052b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
491309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
492309b00a4SShilei Tian     if (ITTNOTIFY_NAME(string_handle_createW) &&
493309b00a4SShilei Tian         ITTNOTIFY_NAME(string_handle_createW) !=
494309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW), _init))) {
49552b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
49652b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(string_handle_createW)(name);
497*7f1a6d89SAndreyChurbanov     } else {
498*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
499*7f1a6d89SAndreyChurbanov       return NULL;
50052b87ac3SJonas Hahnfeld     }
50152b87ac3SJonas Hahnfeld   }
502309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL;
503309b00a4SShilei Tian        h_tail = h, h = h->next) {
504309b00a4SShilei Tian     if (h->strW != NULL && !wcscmp(h->strW, name))
505309b00a4SShilei Tian       break;
50652b87ac3SJonas Hahnfeld   }
507309b00a4SShilei Tian   if (h == NULL) {
50852b87ac3SJonas Hahnfeld     NEW_STRING_HANDLE_W(&_N_(_ittapi_global), h, h_tail, name);
50952b87ac3SJonas Hahnfeld   }
51052b87ac3SJonas Hahnfeld   __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
51152b87ac3SJonas Hahnfeld   return h;
51252b87ac3SJonas Hahnfeld }
51352b87ac3SJonas Hahnfeld 
514309b00a4SShilei Tian static __itt_string_handle *ITTAPI
ITT_VERSIONIZE(ITT_JOIN (_N_ (string_handle_createA),_init))515309b00a4SShilei Tian ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA), _init))(const char *name)
51652b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
517309b00a4SShilei Tian static __itt_string_handle *ITTAPI
518309b00a4SShilei Tian ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create), _init))(const char *name)
51952b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
52052b87ac3SJonas Hahnfeld {
52152b87ac3SJonas Hahnfeld   __itt_string_handle *h_tail = NULL, *h = NULL;
52252b87ac3SJonas Hahnfeld 
523309b00a4SShilei Tian   if (name == NULL) {
52452b87ac3SJonas Hahnfeld     return NULL;
52552b87ac3SJonas Hahnfeld   }
52652b87ac3SJonas Hahnfeld 
52752b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
528309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
52952b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
530309b00a4SShilei Tian     if (ITTNOTIFY_NAME(string_handle_createA) &&
531309b00a4SShilei Tian         ITTNOTIFY_NAME(string_handle_createA) !=
532309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA), _init))) {
53352b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
53452b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(string_handle_createA)(name);
53552b87ac3SJonas Hahnfeld     }
53652b87ac3SJonas Hahnfeld #else
537309b00a4SShilei Tian     if (ITTNOTIFY_NAME(string_handle_create) &&
538309b00a4SShilei Tian         ITTNOTIFY_NAME(string_handle_create) !=
539309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create), _init))) {
540309b00a4SShilei Tian       if (PTHREAD_SYMBOLS)
541309b00a4SShilei Tian         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
54252b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(string_handle_create)(name);
54352b87ac3SJonas Hahnfeld     }
54452b87ac3SJonas Hahnfeld #endif
545*7f1a6d89SAndreyChurbanov     else {
546*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
547*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
548*7f1a6d89SAndreyChurbanov #else
549*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
550*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
551*7f1a6d89SAndreyChurbanov #endif
552*7f1a6d89SAndreyChurbanov       return NULL;
553*7f1a6d89SAndreyChurbanov     }
55452b87ac3SJonas Hahnfeld   }
555309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL;
556309b00a4SShilei Tian        h_tail = h, h = h->next) {
557309b00a4SShilei Tian     if (h->strA != NULL && !__itt_fstrcmp(h->strA, name))
558309b00a4SShilei Tian       break;
55952b87ac3SJonas Hahnfeld   }
560309b00a4SShilei Tian   if (h == NULL) {
56152b87ac3SJonas Hahnfeld     NEW_STRING_HANDLE_A(&_N_(_ittapi_global), h, h_tail, name);
56252b87ac3SJonas Hahnfeld   }
563309b00a4SShilei Tian   if (PTHREAD_SYMBOLS)
564309b00a4SShilei Tian     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
56552b87ac3SJonas Hahnfeld   return h;
56652b87ac3SJonas Hahnfeld }
56752b87ac3SJonas Hahnfeld 
56852b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createW),_init))569309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(
570309b00a4SShilei Tian     _N_(counter_createW), _init))(const wchar_t *name, const wchar_t *domain) {
57152b87ac3SJonas Hahnfeld   __itt_counter_info_t *h_tail = NULL, *h = NULL;
57252b87ac3SJonas Hahnfeld   __itt_metadata_type type = __itt_metadata_u64;
57352b87ac3SJonas Hahnfeld 
574309b00a4SShilei Tian   if (name == NULL) {
57552b87ac3SJonas Hahnfeld     return NULL;
57652b87ac3SJonas Hahnfeld   }
57752b87ac3SJonas Hahnfeld 
57852b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
579309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
580309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_createW) &&
581309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_createW) !=
582309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW), _init))) {
58352b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
58452b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_createW)(name, domain);
585*7f1a6d89SAndreyChurbanov     } else {
586*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
587*7f1a6d89SAndreyChurbanov       return NULL;
58852b87ac3SJonas Hahnfeld     }
58952b87ac3SJonas Hahnfeld   }
590309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL;
591309b00a4SShilei Tian        h_tail = h, h = h->next) {
592*7f1a6d89SAndreyChurbanov     if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) &&
593309b00a4SShilei Tian         ((h->domainW == NULL && domain == NULL) ||
594309b00a4SShilei Tian          (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain))))
595309b00a4SShilei Tian       break;
59652b87ac3SJonas Hahnfeld   }
597309b00a4SShilei Tian   if (h == NULL) {
59852b87ac3SJonas Hahnfeld     NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type);
59952b87ac3SJonas Hahnfeld   }
60052b87ac3SJonas Hahnfeld   __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
60152b87ac3SJonas Hahnfeld   return (__itt_counter)h;
60252b87ac3SJonas Hahnfeld }
60352b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_createA),_init))604309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),
605309b00a4SShilei Tian                                                     _init))(const char *name,
606309b00a4SShilei Tian                                                             const char *domain)
60752b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
608309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),
609309b00a4SShilei Tian                                                     _init))(const char *name,
610309b00a4SShilei Tian                                                             const char *domain)
61152b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
61252b87ac3SJonas Hahnfeld {
61352b87ac3SJonas Hahnfeld   __itt_counter_info_t *h_tail = NULL, *h = NULL;
61452b87ac3SJonas Hahnfeld   __itt_metadata_type type = __itt_metadata_u64;
61552b87ac3SJonas Hahnfeld 
616309b00a4SShilei Tian   if (name == NULL) {
61752b87ac3SJonas Hahnfeld     return NULL;
61852b87ac3SJonas Hahnfeld   }
61952b87ac3SJonas Hahnfeld 
62052b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
621309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
62252b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
623309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_createA) &&
624309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_createA) !=
625309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA), _init))) {
62652b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
62752b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_createA)(name, domain);
62852b87ac3SJonas Hahnfeld     }
62952b87ac3SJonas Hahnfeld #else
630309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_create) &&
631309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_create) !=
632309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create), _init))) {
633309b00a4SShilei Tian       if (PTHREAD_SYMBOLS)
634309b00a4SShilei Tian         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
63552b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_create)(name, domain);
63652b87ac3SJonas Hahnfeld     }
63752b87ac3SJonas Hahnfeld #endif
638*7f1a6d89SAndreyChurbanov     else {
639*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
640*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
641*7f1a6d89SAndreyChurbanov #else
642*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
643*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
644*7f1a6d89SAndreyChurbanov #endif
645*7f1a6d89SAndreyChurbanov       return NULL;
646*7f1a6d89SAndreyChurbanov     }
64752b87ac3SJonas Hahnfeld   }
648309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL;
649309b00a4SShilei Tian        h_tail = h, h = h->next) {
650*7f1a6d89SAndreyChurbanov     if (h->nameA != NULL && h->type == (int)type &&
651*7f1a6d89SAndreyChurbanov         !__itt_fstrcmp(h->nameA, name) &&
652309b00a4SShilei Tian         ((h->domainA == NULL && domain == NULL) ||
653309b00a4SShilei Tian          (h->domainA != NULL && domain != NULL &&
654309b00a4SShilei Tian           !__itt_fstrcmp(h->domainA, domain))))
655309b00a4SShilei Tian       break;
65652b87ac3SJonas Hahnfeld   }
657309b00a4SShilei Tian   if (h == NULL) {
65852b87ac3SJonas Hahnfeld     NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type);
65952b87ac3SJonas Hahnfeld   }
660309b00a4SShilei Tian   if (PTHREAD_SYMBOLS)
661309b00a4SShilei Tian     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
66252b87ac3SJonas Hahnfeld   return (__itt_counter)h;
66352b87ac3SJonas Hahnfeld }
66452b87ac3SJonas Hahnfeld 
66552b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_create_typedW),_init))666309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),
667309b00a4SShilei Tian                                                     _init))(
668309b00a4SShilei Tian     const wchar_t *name, const wchar_t *domain, __itt_metadata_type type) {
66952b87ac3SJonas Hahnfeld   __itt_counter_info_t *h_tail = NULL, *h = NULL;
67052b87ac3SJonas Hahnfeld 
671309b00a4SShilei Tian   if (name == NULL) {
67252b87ac3SJonas Hahnfeld     return NULL;
67352b87ac3SJonas Hahnfeld   }
67452b87ac3SJonas Hahnfeld 
67552b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
676309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
677309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_create_typedW) &&
678309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_create_typedW) !=
679309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW), _init))) {
68052b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
68152b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_create_typedW)(name, domain, type);
682*7f1a6d89SAndreyChurbanov     } else {
683*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
684*7f1a6d89SAndreyChurbanov       return NULL;
68552b87ac3SJonas Hahnfeld     }
68652b87ac3SJonas Hahnfeld   }
687309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL;
688309b00a4SShilei Tian        h_tail = h, h = h->next) {
689*7f1a6d89SAndreyChurbanov     if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) &&
690309b00a4SShilei Tian         ((h->domainW == NULL && domain == NULL) ||
691309b00a4SShilei Tian          (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain))))
692309b00a4SShilei Tian       break;
69352b87ac3SJonas Hahnfeld   }
694309b00a4SShilei Tian   if (h == NULL) {
69552b87ac3SJonas Hahnfeld     NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type);
69652b87ac3SJonas Hahnfeld   }
69752b87ac3SJonas Hahnfeld   __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
69852b87ac3SJonas Hahnfeld   return (__itt_counter)h;
69952b87ac3SJonas Hahnfeld }
70052b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (counter_create_typedA),_init))701309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(
702309b00a4SShilei Tian     _N_(counter_create_typedA), _init))(const char *name, const char *domain,
703309b00a4SShilei Tian                                         __itt_metadata_type type)
70452b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
705309b00a4SShilei Tian static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(
706309b00a4SShilei Tian     _N_(counter_create_typed), _init))(const char *name, const char *domain,
707309b00a4SShilei Tian                                        __itt_metadata_type type)
70852b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
70952b87ac3SJonas Hahnfeld {
71052b87ac3SJonas Hahnfeld   __itt_counter_info_t *h_tail = NULL, *h = NULL;
71152b87ac3SJonas Hahnfeld 
712309b00a4SShilei Tian   if (name == NULL) {
71352b87ac3SJonas Hahnfeld     return NULL;
71452b87ac3SJonas Hahnfeld   }
71552b87ac3SJonas Hahnfeld 
71652b87ac3SJonas Hahnfeld   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
717309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
71852b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
719309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_create_typedA) &&
720309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_create_typedA) !=
721309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA), _init))) {
72252b87ac3SJonas Hahnfeld       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
72352b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_create_typedA)(name, domain, type);
72452b87ac3SJonas Hahnfeld     }
72552b87ac3SJonas Hahnfeld #else
726309b00a4SShilei Tian     if (ITTNOTIFY_NAME(counter_create_typed) &&
727309b00a4SShilei Tian         ITTNOTIFY_NAME(counter_create_typed) !=
728309b00a4SShilei Tian             ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed), _init))) {
729309b00a4SShilei Tian       if (PTHREAD_SYMBOLS)
730309b00a4SShilei Tian         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
73152b87ac3SJonas Hahnfeld       return ITTNOTIFY_NAME(counter_create_typed)(name, domain, type);
73252b87ac3SJonas Hahnfeld     }
73352b87ac3SJonas Hahnfeld #endif
734*7f1a6d89SAndreyChurbanov     else {
735*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
736*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
737*7f1a6d89SAndreyChurbanov #else
738*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
739*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
740*7f1a6d89SAndreyChurbanov #endif
741*7f1a6d89SAndreyChurbanov       return NULL;
742*7f1a6d89SAndreyChurbanov     }
74352b87ac3SJonas Hahnfeld   }
744309b00a4SShilei Tian   for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL;
745309b00a4SShilei Tian        h_tail = h, h = h->next) {
746*7f1a6d89SAndreyChurbanov     if (h->nameA != NULL && h->type == (int)type &&
747*7f1a6d89SAndreyChurbanov         !__itt_fstrcmp(h->nameA, name) &&
748309b00a4SShilei Tian         ((h->domainA == NULL && domain == NULL) ||
749309b00a4SShilei Tian          (h->domainA != NULL && domain != NULL &&
750309b00a4SShilei Tian           !__itt_fstrcmp(h->domainA, domain))))
751309b00a4SShilei Tian       break;
75252b87ac3SJonas Hahnfeld   }
753309b00a4SShilei Tian   if (h == NULL) {
75452b87ac3SJonas Hahnfeld     NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type);
75552b87ac3SJonas Hahnfeld   }
756309b00a4SShilei Tian   if (PTHREAD_SYMBOLS)
757309b00a4SShilei Tian     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
75852b87ac3SJonas Hahnfeld   return (__itt_counter)h;
75952b87ac3SJonas Hahnfeld }
76052b87ac3SJonas Hahnfeld 
761*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (histogram_createW),_init))762*7f1a6d89SAndreyChurbanov static __itt_histogram *ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW),
763*7f1a6d89SAndreyChurbanov                                                        _init))(
764*7f1a6d89SAndreyChurbanov     const __itt_domain *domain, const wchar_t *name, __itt_metadata_type x_type,
765*7f1a6d89SAndreyChurbanov     __itt_metadata_type y_type) {
766*7f1a6d89SAndreyChurbanov   __itt_histogram *h_tail = NULL, *h = NULL;
767*7f1a6d89SAndreyChurbanov 
768*7f1a6d89SAndreyChurbanov   if (domain == NULL || name == NULL) {
769*7f1a6d89SAndreyChurbanov     return NULL;
770*7f1a6d89SAndreyChurbanov   }
771*7f1a6d89SAndreyChurbanov 
772*7f1a6d89SAndreyChurbanov   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
773*7f1a6d89SAndreyChurbanov   if (_N_(_ittapi_global).api_initialized) {
774*7f1a6d89SAndreyChurbanov     if (ITTNOTIFY_NAME(histogram_createW) &&
775*7f1a6d89SAndreyChurbanov         ITTNOTIFY_NAME(histogram_createW) !=
776*7f1a6d89SAndreyChurbanov             ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW), _init))) {
777*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
778*7f1a6d89SAndreyChurbanov       return ITTNOTIFY_NAME(histogram_createW)(domain, name, x_type, y_type);
779*7f1a6d89SAndreyChurbanov     } else {
780*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
781*7f1a6d89SAndreyChurbanov       return NULL;
782*7f1a6d89SAndreyChurbanov     }
783*7f1a6d89SAndreyChurbanov   }
784*7f1a6d89SAndreyChurbanov   for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL;
785*7f1a6d89SAndreyChurbanov        h_tail = h, h = h->next) {
786*7f1a6d89SAndreyChurbanov     if (h->domain == NULL)
787*7f1a6d89SAndreyChurbanov       continue;
788*7f1a6d89SAndreyChurbanov     else if (h->domain != domain && h->nameW != NULL && !wcscmp(h->nameW, name))
789*7f1a6d89SAndreyChurbanov       break;
790*7f1a6d89SAndreyChurbanov   }
791*7f1a6d89SAndreyChurbanov   if (h == NULL) {
792*7f1a6d89SAndreyChurbanov     NEW_HISTOGRAM_W(&_N_(_ittapi_global), h, h_tail, domain, name, x_type,
793*7f1a6d89SAndreyChurbanov                     y_type);
794*7f1a6d89SAndreyChurbanov   }
795*7f1a6d89SAndreyChurbanov   __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
796*7f1a6d89SAndreyChurbanov   return (__itt_histogram *)h;
797*7f1a6d89SAndreyChurbanov }
798*7f1a6d89SAndreyChurbanov 
ITT_VERSIONIZE(ITT_JOIN (_N_ (histogram_createA),_init))799*7f1a6d89SAndreyChurbanov static __itt_histogram *ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA),
800*7f1a6d89SAndreyChurbanov                                                        _init))(
801*7f1a6d89SAndreyChurbanov     const __itt_domain *domain, const char *name, __itt_metadata_type x_type,
802*7f1a6d89SAndreyChurbanov     __itt_metadata_type y_type)
803*7f1a6d89SAndreyChurbanov #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
804*7f1a6d89SAndreyChurbanov static __itt_histogram *ITTAPI ITT_VERSIONIZE(ITT_JOIN(
805*7f1a6d89SAndreyChurbanov     _N_(histogram_create), _init))(const __itt_domain *domain, const char *name,
806*7f1a6d89SAndreyChurbanov                                    __itt_metadata_type x_type,
807*7f1a6d89SAndreyChurbanov                                    __itt_metadata_type y_type)
808*7f1a6d89SAndreyChurbanov #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
809*7f1a6d89SAndreyChurbanov {
810*7f1a6d89SAndreyChurbanov   __itt_histogram *h_tail = NULL, *h = NULL;
811*7f1a6d89SAndreyChurbanov 
812*7f1a6d89SAndreyChurbanov   if (domain == NULL || name == NULL) {
813*7f1a6d89SAndreyChurbanov     return NULL;
814*7f1a6d89SAndreyChurbanov   }
815*7f1a6d89SAndreyChurbanov 
816*7f1a6d89SAndreyChurbanov   ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
817*7f1a6d89SAndreyChurbanov   if (_N_(_ittapi_global).api_initialized) {
818*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
819*7f1a6d89SAndreyChurbanov     if (ITTNOTIFY_NAME(histogram_createA) &&
820*7f1a6d89SAndreyChurbanov         ITTNOTIFY_NAME(histogram_createA) !=
821*7f1a6d89SAndreyChurbanov             ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA), _init))) {
822*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
823*7f1a6d89SAndreyChurbanov       return ITTNOTIFY_NAME(histogram_createA)(domain, name, x_type, y_type);
824*7f1a6d89SAndreyChurbanov     }
825*7f1a6d89SAndreyChurbanov #else
826*7f1a6d89SAndreyChurbanov     if (ITTNOTIFY_NAME(histogram_create) &&
827*7f1a6d89SAndreyChurbanov         ITTNOTIFY_NAME(histogram_create) !=
828*7f1a6d89SAndreyChurbanov             ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_create), _init))) {
829*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
830*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
831*7f1a6d89SAndreyChurbanov       return ITTNOTIFY_NAME(histogram_create)(domain, name, x_type, y_type);
832*7f1a6d89SAndreyChurbanov     }
833*7f1a6d89SAndreyChurbanov #endif
834*7f1a6d89SAndreyChurbanov     else {
835*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
836*7f1a6d89SAndreyChurbanov       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
837*7f1a6d89SAndreyChurbanov #else
838*7f1a6d89SAndreyChurbanov       if (PTHREAD_SYMBOLS)
839*7f1a6d89SAndreyChurbanov         __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
840*7f1a6d89SAndreyChurbanov #endif
841*7f1a6d89SAndreyChurbanov       return NULL;
842*7f1a6d89SAndreyChurbanov     }
843*7f1a6d89SAndreyChurbanov   }
844*7f1a6d89SAndreyChurbanov   for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL;
845*7f1a6d89SAndreyChurbanov        h_tail = h, h = h->next) {
846*7f1a6d89SAndreyChurbanov     if (h->domain == NULL)
847*7f1a6d89SAndreyChurbanov       continue;
848*7f1a6d89SAndreyChurbanov     else if (h->domain != domain && h->nameA != NULL &&
849*7f1a6d89SAndreyChurbanov              !__itt_fstrcmp(h->nameA, name))
850*7f1a6d89SAndreyChurbanov       break;
851*7f1a6d89SAndreyChurbanov   }
852*7f1a6d89SAndreyChurbanov   if (h == NULL) {
853*7f1a6d89SAndreyChurbanov     NEW_HISTOGRAM_A(&_N_(_ittapi_global), h, h_tail, domain, name, x_type,
854*7f1a6d89SAndreyChurbanov                     y_type);
855*7f1a6d89SAndreyChurbanov   }
856*7f1a6d89SAndreyChurbanov   if (PTHREAD_SYMBOLS)
857*7f1a6d89SAndreyChurbanov     __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
858*7f1a6d89SAndreyChurbanov   return (__itt_histogram *)h;
859*7f1a6d89SAndreyChurbanov }
860*7f1a6d89SAndreyChurbanov 
86152b87ac3SJonas Hahnfeld /* -------------------------------------------------------------------------- */
86252b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (pause),_init))863309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause), _init))(void) {
864309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized &&
865309b00a4SShilei Tian       _N_(_ittapi_global).thread_list == NULL) {
86652b87ac3SJonas Hahnfeld     __itt_init_ittlib_name(NULL, __itt_group_all);
86752b87ac3SJonas Hahnfeld   }
868309b00a4SShilei Tian   if (ITTNOTIFY_NAME(pause) &&
869309b00a4SShilei Tian       ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause), _init))) {
87052b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(pause)();
871309b00a4SShilei Tian   } else {
87252b87ac3SJonas Hahnfeld     _N_(_ittapi_global).state = __itt_collection_paused;
87352b87ac3SJonas Hahnfeld   }
87452b87ac3SJonas Hahnfeld }
87552b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (resume),_init))876309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume), _init))(void) {
877309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized &&
878309b00a4SShilei Tian       _N_(_ittapi_global).thread_list == NULL) {
87952b87ac3SJonas Hahnfeld     __itt_init_ittlib_name(NULL, __itt_group_all);
88052b87ac3SJonas Hahnfeld   }
881309b00a4SShilei Tian   if (ITTNOTIFY_NAME(resume) &&
882309b00a4SShilei Tian       ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume), _init))) {
88352b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(resume)();
884309b00a4SShilei Tian   } else {
88552b87ac3SJonas Hahnfeld     _N_(_ittapi_global).state = __itt_collection_normal;
88652b87ac3SJonas Hahnfeld   }
88752b87ac3SJonas Hahnfeld }
88852b87ac3SJonas Hahnfeld 
88952b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_set_nameW),_init))890309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),
891309b00a4SShilei Tian                                            _init))(const wchar_t *name) {
892309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized &&
893309b00a4SShilei Tian       _N_(_ittapi_global).thread_list == NULL) {
89452b87ac3SJonas Hahnfeld     __itt_init_ittlib_name(NULL, __itt_group_all);
89552b87ac3SJonas Hahnfeld   }
896309b00a4SShilei Tian   if (ITTNOTIFY_NAME(thread_set_nameW) &&
897309b00a4SShilei Tian       ITTNOTIFY_NAME(thread_set_nameW) !=
898309b00a4SShilei Tian           ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW), _init))) {
89952b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(thread_set_nameW)(name);
90052b87ac3SJonas Hahnfeld   }
90152b87ac3SJonas Hahnfeld }
90252b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_setW),_init))903309b00a4SShilei Tian static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),
904309b00a4SShilei Tian                                           _init))(const wchar_t *name,
905309b00a4SShilei Tian                                                   int namelen) {
90652b87ac3SJonas Hahnfeld   (void)namelen;
90752b87ac3SJonas Hahnfeld   ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW), _init))(name);
90852b87ac3SJonas Hahnfeld   return 0;
90952b87ac3SJonas Hahnfeld }
91052b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_set_nameA),_init))911309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),
912309b00a4SShilei Tian                                            _init))(const char *name)
91352b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
914309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),
915309b00a4SShilei Tian                                            _init))(const char *name)
91652b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
91752b87ac3SJonas Hahnfeld {
918309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized &&
919309b00a4SShilei Tian       _N_(_ittapi_global).thread_list == NULL) {
92052b87ac3SJonas Hahnfeld     __itt_init_ittlib_name(NULL, __itt_group_all);
92152b87ac3SJonas Hahnfeld   }
92252b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
923309b00a4SShilei Tian   if (ITTNOTIFY_NAME(thread_set_nameA) &&
924309b00a4SShilei Tian       ITTNOTIFY_NAME(thread_set_nameA) !=
925309b00a4SShilei Tian           ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA), _init))) {
92652b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(thread_set_nameA)(name);
92752b87ac3SJonas Hahnfeld   }
92852b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
929309b00a4SShilei Tian   if (ITTNOTIFY_NAME(thread_set_name) &&
930309b00a4SShilei Tian       ITTNOTIFY_NAME(thread_set_name) !=
931309b00a4SShilei Tian           ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name), _init))) {
93252b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(thread_set_name)(name);
93352b87ac3SJonas Hahnfeld   }
93452b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
93552b87ac3SJonas Hahnfeld }
93652b87ac3SJonas Hahnfeld 
93752b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_setA),_init))938309b00a4SShilei Tian static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setA),
939309b00a4SShilei Tian                                           _init))(const char *name,
940309b00a4SShilei Tian                                                   int namelen) {
94152b87ac3SJonas Hahnfeld   (void)namelen;
94252b87ac3SJonas Hahnfeld   ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA), _init))(name);
94352b87ac3SJonas Hahnfeld   return 0;
94452b87ac3SJonas Hahnfeld }
94552b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_name_set),_init))946309b00a4SShilei Tian static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_set),
947309b00a4SShilei Tian                                           _init))(const char *name,
948309b00a4SShilei Tian                                                   int namelen) {
94952b87ac3SJonas Hahnfeld   (void)namelen;
95052b87ac3SJonas Hahnfeld   ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name), _init))(name);
95152b87ac3SJonas Hahnfeld   return 0;
95252b87ac3SJonas Hahnfeld }
95352b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
95452b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thread_ignore),_init))955309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore), _init))(void) {
956309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized &&
957309b00a4SShilei Tian       _N_(_ittapi_global).thread_list == NULL) {
95852b87ac3SJonas Hahnfeld     __itt_init_ittlib_name(NULL, __itt_group_all);
95952b87ac3SJonas Hahnfeld   }
960309b00a4SShilei Tian   if (ITTNOTIFY_NAME(thread_ignore) &&
961309b00a4SShilei Tian       ITTNOTIFY_NAME(thread_ignore) !=
962309b00a4SShilei Tian           ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore), _init))) {
96352b87ac3SJonas Hahnfeld     ITTNOTIFY_NAME(thread_ignore)();
96452b87ac3SJonas Hahnfeld   }
96552b87ac3SJonas Hahnfeld }
96652b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (thr_ignore),_init))967309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore), _init))(void) {
96852b87ac3SJonas Hahnfeld   ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore), _init))();
96952b87ac3SJonas Hahnfeld }
97052b87ac3SJonas Hahnfeld 
ITT_VERSIONIZE(ITT_JOIN (_N_ (enable_attach),_init))971309b00a4SShilei Tian static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach), _init))(void) {
97252b87ac3SJonas Hahnfeld #ifdef __ANDROID__
97352b87ac3SJonas Hahnfeld   /*
97452b87ac3SJonas Hahnfeld    * if LIB_VAR_NAME env variable were set before then stay previous value
97552b87ac3SJonas Hahnfeld    * else set default path
97652b87ac3SJonas Hahnfeld    */
97752b87ac3SJonas Hahnfeld   setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0);
97852b87ac3SJonas Hahnfeld #endif
97952b87ac3SJonas Hahnfeld }
98052b87ac3SJonas Hahnfeld 
98152b87ac3SJonas Hahnfeld /* -------------------------------------------------------------------------- */
98252b87ac3SJonas Hahnfeld 
__itt_fsplit(const char * s,const char * sep,const char ** out,int * len)983309b00a4SShilei Tian static const char *__itt_fsplit(const char *s, const char *sep,
984309b00a4SShilei Tian                                 const char **out, int *len) {
98552b87ac3SJonas Hahnfeld   int i;
98652b87ac3SJonas Hahnfeld   int j;
98752b87ac3SJonas Hahnfeld 
98852b87ac3SJonas Hahnfeld   if (!s || !sep || !out || !len)
98952b87ac3SJonas Hahnfeld     return NULL;
99052b87ac3SJonas Hahnfeld 
991309b00a4SShilei Tian   for (i = 0; s[i]; i++) {
99252b87ac3SJonas Hahnfeld     int b = 0;
99352b87ac3SJonas Hahnfeld     for (j = 0; sep[j]; j++)
994309b00a4SShilei Tian       if (s[i] == sep[j]) {
99552b87ac3SJonas Hahnfeld         b = 1;
99652b87ac3SJonas Hahnfeld         break;
99752b87ac3SJonas Hahnfeld       }
99852b87ac3SJonas Hahnfeld     if (!b)
99952b87ac3SJonas Hahnfeld       break;
100052b87ac3SJonas Hahnfeld   }
100152b87ac3SJonas Hahnfeld 
100252b87ac3SJonas Hahnfeld   if (!s[i])
100352b87ac3SJonas Hahnfeld     return NULL;
100452b87ac3SJonas Hahnfeld 
100552b87ac3SJonas Hahnfeld   *len = 0;
100652b87ac3SJonas Hahnfeld   *out = &s[i];
100752b87ac3SJonas Hahnfeld 
1008309b00a4SShilei Tian   for (; s[i]; i++, (*len)++) {
100952b87ac3SJonas Hahnfeld     int b = 0;
101052b87ac3SJonas Hahnfeld     for (j = 0; sep[j]; j++)
1011309b00a4SShilei Tian       if (s[i] == sep[j]) {
101252b87ac3SJonas Hahnfeld         b = 1;
101352b87ac3SJonas Hahnfeld         break;
101452b87ac3SJonas Hahnfeld       }
101552b87ac3SJonas Hahnfeld     if (b)
101652b87ac3SJonas Hahnfeld       break;
101752b87ac3SJonas Hahnfeld   }
101852b87ac3SJonas Hahnfeld 
1019309b00a4SShilei Tian   for (; s[i]; i++) {
102052b87ac3SJonas Hahnfeld     int b = 0;
102152b87ac3SJonas Hahnfeld     for (j = 0; sep[j]; j++)
1022309b00a4SShilei Tian       if (s[i] == sep[j]) {
102352b87ac3SJonas Hahnfeld         b = 1;
102452b87ac3SJonas Hahnfeld         break;
102552b87ac3SJonas Hahnfeld       }
102652b87ac3SJonas Hahnfeld     if (!b)
102752b87ac3SJonas Hahnfeld       break;
102852b87ac3SJonas Hahnfeld   }
102952b87ac3SJonas Hahnfeld 
103052b87ac3SJonas Hahnfeld   return &s[i];
103152b87ac3SJonas Hahnfeld }
103252b87ac3SJonas Hahnfeld 
103352b87ac3SJonas Hahnfeld /* This function return value of env variable that placed into static buffer.
103452b87ac3SJonas Hahnfeld  * !!! The same static buffer is used for subsequent calls. !!!
103542016791SKazuaki Ishizaki  * This was done to avoid dynamic allocation for few calls.
103652b87ac3SJonas Hahnfeld  * Actually we need this function only four times.
103752b87ac3SJonas Hahnfeld  */
__itt_get_env_var(const char * name)1038309b00a4SShilei Tian static const char *__itt_get_env_var(const char *name) {
103952b87ac3SJonas Hahnfeld #define MAX_ENV_VALUE_SIZE 4086
104052b87ac3SJonas Hahnfeld   static char env_buff[MAX_ENV_VALUE_SIZE];
104152b87ac3SJonas Hahnfeld   static char *env_value = (char *)env_buff;
104252b87ac3SJonas Hahnfeld 
1043309b00a4SShilei Tian   if (name != NULL) {
104452b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
104552b87ac3SJonas Hahnfeld     size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
104652b87ac3SJonas Hahnfeld     DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len);
104752b87ac3SJonas Hahnfeld     if (rc >= max_len)
1048309b00a4SShilei Tian       __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1,
1049309b00a4SShilei Tian                          (size_t)(max_len - 1));
1050309b00a4SShilei Tian     else if (rc > 0) {
105152b87ac3SJonas Hahnfeld       const char *ret = (const char *)env_value;
105252b87ac3SJonas Hahnfeld       env_value += rc + 1;
105352b87ac3SJonas Hahnfeld       return ret;
1054309b00a4SShilei Tian     } else {
10554c6a098aSKazuaki Ishizaki       /* If environment variable is empty, GetEnvironmentVariables()
105652b87ac3SJonas Hahnfeld        * returns zero (number of characters (not including terminating null),
105752b87ac3SJonas Hahnfeld        * and GetLastError() returns ERROR_SUCCESS. */
105852b87ac3SJonas Hahnfeld       DWORD err = GetLastError();
105952b87ac3SJonas Hahnfeld       if (err == ERROR_SUCCESS)
106052b87ac3SJonas Hahnfeld         return env_value;
106152b87ac3SJonas Hahnfeld 
106252b87ac3SJonas Hahnfeld       if (err != ERROR_ENVVAR_NOT_FOUND)
106352b87ac3SJonas Hahnfeld         __itt_report_error(__itt_error_cant_read_env, name, (int)err);
106452b87ac3SJonas Hahnfeld     }
106552b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
106652b87ac3SJonas Hahnfeld     char *env = getenv(name);
1067309b00a4SShilei Tian     if (env != NULL) {
106852b87ac3SJonas Hahnfeld       size_t len = __itt_fstrnlen(env, MAX_ENV_VALUE_SIZE);
106952b87ac3SJonas Hahnfeld       size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);
1070309b00a4SShilei Tian       if (len < max_len) {
107152b87ac3SJonas Hahnfeld         const char *ret = (const char *)env_value;
107252b87ac3SJonas Hahnfeld         __itt_fstrcpyn(env_value, max_len, env, len + 1);
107352b87ac3SJonas Hahnfeld         env_value += len + 1;
107452b87ac3SJonas Hahnfeld         return ret;
107552b87ac3SJonas Hahnfeld       } else
1076309b00a4SShilei Tian         __itt_report_error(__itt_error_env_too_long, name, (size_t)len,
1077309b00a4SShilei Tian                            (size_t)(max_len - 1));
107852b87ac3SJonas Hahnfeld     }
107952b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
108052b87ac3SJonas Hahnfeld   }
108152b87ac3SJonas Hahnfeld   return NULL;
108252b87ac3SJonas Hahnfeld }
108352b87ac3SJonas Hahnfeld 
__itt_get_lib_name(void)1084309b00a4SShilei Tian static const char *__itt_get_lib_name(void) {
108552b87ac3SJonas Hahnfeld   const char *lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
108652b87ac3SJonas Hahnfeld 
108752b87ac3SJonas Hahnfeld #ifdef __ANDROID__
1088309b00a4SShilei Tian   if (lib_name == NULL) {
108952b87ac3SJonas Hahnfeld 
109052b87ac3SJonas Hahnfeld #if ITT_ARCH == ITT_ARCH_IA32 || ITT_ARCH == ITT_ARCH_ARM
109152b87ac3SJonas Hahnfeld     const char *const marker_filename = "com.intel.itt.collector_lib_32";
109252b87ac3SJonas Hahnfeld #else
109352b87ac3SJonas Hahnfeld     const char *const marker_filename = "com.intel.itt.collector_lib_64";
109452b87ac3SJonas Hahnfeld #endif
109552b87ac3SJonas Hahnfeld 
109652b87ac3SJonas Hahnfeld     char system_wide_marker_filename[PATH_MAX] = {0};
109752b87ac3SJonas Hahnfeld     int itt_marker_file_fd = -1;
109852b87ac3SJonas Hahnfeld     ssize_t res = 0;
109952b87ac3SJonas Hahnfeld 
1100309b00a4SShilei Tian     res = snprintf(system_wide_marker_filename, PATH_MAX - 1, "%s%s",
1101309b00a4SShilei Tian                    "/data/local/tmp/", marker_filename);
1102309b00a4SShilei Tian     if (res < 0) {
110352b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
110452b87ac3SJonas Hahnfeld       return lib_name;
110552b87ac3SJonas Hahnfeld     }
110652b87ac3SJonas Hahnfeld     itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);
110752b87ac3SJonas Hahnfeld 
1108309b00a4SShilei Tian     if (itt_marker_file_fd == -1) {
110952b87ac3SJonas Hahnfeld       const pid_t my_pid = getpid();
111052b87ac3SJonas Hahnfeld       char cmdline_path[PATH_MAX] = {0};
111152b87ac3SJonas Hahnfeld       char package_name[PATH_MAX] = {0};
111252b87ac3SJonas Hahnfeld       char app_sandbox_file[PATH_MAX] = {0};
111352b87ac3SJonas Hahnfeld       int cmdline_fd = 0;
111452b87ac3SJonas Hahnfeld 
111552b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("Unable to open system-wide marker file.");
111652b87ac3SJonas Hahnfeld       res = snprintf(cmdline_path, PATH_MAX - 1, "/proc/%d/cmdline", my_pid);
1117309b00a4SShilei Tian       if (res < 0) {
111852b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to get cmdline path string.");
111952b87ac3SJonas Hahnfeld         return lib_name;
112052b87ac3SJonas Hahnfeld       }
112152b87ac3SJonas Hahnfeld 
112252b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("CMD file: %s\n", cmdline_path);
112352b87ac3SJonas Hahnfeld       cmdline_fd = open(cmdline_path, O_RDONLY);
1124309b00a4SShilei Tian       if (cmdline_fd == -1) {
112552b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to open %s file!", cmdline_path);
112652b87ac3SJonas Hahnfeld         return lib_name;
112752b87ac3SJonas Hahnfeld       }
112852b87ac3SJonas Hahnfeld       res = read(cmdline_fd, package_name, PATH_MAX - 1);
1129309b00a4SShilei Tian       if (res == -1) {
113052b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to read %s file!", cmdline_path);
113152b87ac3SJonas Hahnfeld         res = close(cmdline_fd);
1132309b00a4SShilei Tian         if (res == -1) {
113352b87ac3SJonas Hahnfeld           ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
113452b87ac3SJonas Hahnfeld         }
113552b87ac3SJonas Hahnfeld         return lib_name;
113652b87ac3SJonas Hahnfeld       }
113752b87ac3SJonas Hahnfeld       res = close(cmdline_fd);
1138309b00a4SShilei Tian       if (res == -1) {
113952b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
114052b87ac3SJonas Hahnfeld         return lib_name;
114152b87ac3SJonas Hahnfeld       }
114252b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("Package name: %s\n", package_name);
1143309b00a4SShilei Tian       res = snprintf(app_sandbox_file, PATH_MAX - 1, "/data/data/%s/%s",
1144309b00a4SShilei Tian                      package_name, marker_filename);
1145309b00a4SShilei Tian       if (res < 0) {
114652b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to concatenate marker file string.");
114752b87ac3SJonas Hahnfeld         return lib_name;
114852b87ac3SJonas Hahnfeld       }
114952b87ac3SJonas Hahnfeld 
115052b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("Lib marker file name: %s\n", app_sandbox_file);
115152b87ac3SJonas Hahnfeld       itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);
1152309b00a4SShilei Tian       if (itt_marker_file_fd == -1) {
115352b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to open app marker file!");
115452b87ac3SJonas Hahnfeld         return lib_name;
115552b87ac3SJonas Hahnfeld       }
115652b87ac3SJonas Hahnfeld     }
115752b87ac3SJonas Hahnfeld 
115852b87ac3SJonas Hahnfeld     {
115952b87ac3SJonas Hahnfeld       char itt_lib_name[PATH_MAX] = {0};
116052b87ac3SJonas Hahnfeld 
116152b87ac3SJonas Hahnfeld       res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1);
1162309b00a4SShilei Tian       if (res == -1) {
116352b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to read %s file!", itt_marker_file_fd);
116452b87ac3SJonas Hahnfeld         res = close(itt_marker_file_fd);
1165309b00a4SShilei Tian         if (res == -1) {
116652b87ac3SJonas Hahnfeld           ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
116752b87ac3SJonas Hahnfeld         }
116852b87ac3SJonas Hahnfeld         return lib_name;
116952b87ac3SJonas Hahnfeld       }
117052b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("ITT Lib path: %s", itt_lib_name);
117152b87ac3SJonas Hahnfeld       res = close(itt_marker_file_fd);
1172309b00a4SShilei Tian       if (res == -1) {
117352b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
117452b87ac3SJonas Hahnfeld         return lib_name;
117552b87ac3SJonas Hahnfeld       }
1176309b00a4SShilei Tian       ITT_ANDROID_LOGI("Set env %s to %s", ITT_TO_STR(LIB_VAR_NAME),
1177309b00a4SShilei Tian                        itt_lib_name);
117852b87ac3SJonas Hahnfeld       res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0);
1179309b00a4SShilei Tian       if (res == -1) {
118052b87ac3SJonas Hahnfeld         ITT_ANDROID_LOGE("Unable to set env var!");
118152b87ac3SJonas Hahnfeld         return lib_name;
118252b87ac3SJonas Hahnfeld       }
118352b87ac3SJonas Hahnfeld       lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
118452b87ac3SJonas Hahnfeld       ITT_ANDROID_LOGI("ITT Lib path from env: %s", lib_name);
118552b87ac3SJonas Hahnfeld     }
118652b87ac3SJonas Hahnfeld   }
118752b87ac3SJonas Hahnfeld #endif
118852b87ac3SJonas Hahnfeld 
118952b87ac3SJonas Hahnfeld   return lib_name;
119052b87ac3SJonas Hahnfeld }
119152b87ac3SJonas Hahnfeld 
1192*7f1a6d89SAndreyChurbanov /* Avoid clashes with std::min */
1193*7f1a6d89SAndreyChurbanov #define __itt_min(a, b) ((a) < (b) ? (a) : (b))
119452b87ac3SJonas Hahnfeld 
__itt_get_groups(void)1195309b00a4SShilei Tian static __itt_group_id __itt_get_groups(void) {
119652b87ac3SJonas Hahnfeld   int i;
119752b87ac3SJonas Hahnfeld   __itt_group_id res = __itt_group_none;
119852b87ac3SJonas Hahnfeld   const char *var_name = "INTEL_ITTNOTIFY_GROUPS";
119952b87ac3SJonas Hahnfeld   const char *group_str = __itt_get_env_var(var_name);
120052b87ac3SJonas Hahnfeld 
1201309b00a4SShilei Tian   if (group_str != NULL) {
120252b87ac3SJonas Hahnfeld     int len;
120352b87ac3SJonas Hahnfeld     char gr[255];
120452b87ac3SJonas Hahnfeld     const char *chunk;
1205309b00a4SShilei Tian     while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL) {
120652b87ac3SJonas Hahnfeld       int min_len = __itt_min(len, (int)(sizeof(gr) - 1));
120752b87ac3SJonas Hahnfeld       __itt_fstrcpyn(gr, sizeof(gr) - 1, chunk, min_len);
120852b87ac3SJonas Hahnfeld       gr[min_len] = 0;
120952b87ac3SJonas Hahnfeld 
1210309b00a4SShilei Tian       for (i = 0; group_list[i].name != NULL; i++) {
1211309b00a4SShilei Tian         if (!__itt_fstrcmp(gr, group_list[i].name)) {
121252b87ac3SJonas Hahnfeld           res = (__itt_group_id)(res | group_list[i].id);
121352b87ac3SJonas Hahnfeld           break;
121452b87ac3SJonas Hahnfeld         }
121552b87ac3SJonas Hahnfeld       }
121652b87ac3SJonas Hahnfeld     }
121752b87ac3SJonas Hahnfeld     /* TODO: !!! Workaround for bug with warning for unknown group !!!
121852b87ac3SJonas Hahnfeld      * Should be fixed in new initialization scheme.
121952b87ac3SJonas Hahnfeld      * Now the following groups should be set always. */
122052b87ac3SJonas Hahnfeld     for (i = 0; group_list[i].id != __itt_group_none; i++)
122152b87ac3SJonas Hahnfeld       if (group_list[i].id != __itt_group_all &&
122252b87ac3SJonas Hahnfeld           group_list[i].id > __itt_group_splitter_min &&
122352b87ac3SJonas Hahnfeld           group_list[i].id < __itt_group_splitter_max)
122452b87ac3SJonas Hahnfeld         res = (__itt_group_id)(res | group_list[i].id);
122552b87ac3SJonas Hahnfeld     return res;
1226309b00a4SShilei Tian   } else {
122752b87ac3SJonas Hahnfeld     for (i = 0; group_alias[i].env_var != NULL; i++)
122852b87ac3SJonas Hahnfeld       if (__itt_get_env_var(group_alias[i].env_var) != NULL)
122952b87ac3SJonas Hahnfeld         return group_alias[i].groups;
123052b87ac3SJonas Hahnfeld   }
123152b87ac3SJonas Hahnfeld 
123252b87ac3SJonas Hahnfeld   return res;
123352b87ac3SJonas Hahnfeld }
123452b87ac3SJonas Hahnfeld 
123552b87ac3SJonas Hahnfeld #undef __itt_min
123652b87ac3SJonas Hahnfeld 
__itt_lib_version(lib_t lib)1237309b00a4SShilei Tian static int __itt_lib_version(lib_t lib) {
123852b87ac3SJonas Hahnfeld   if (lib == NULL)
123952b87ac3SJonas Hahnfeld     return 0;
124052b87ac3SJonas Hahnfeld   if (__itt_get_proc(lib, "__itt_api_init"))
124152b87ac3SJonas Hahnfeld     return 2;
124252b87ac3SJonas Hahnfeld   if (__itt_get_proc(lib, "__itt_api_version"))
124352b87ac3SJonas Hahnfeld     return 1;
124452b87ac3SJonas Hahnfeld   return 0;
124552b87ac3SJonas Hahnfeld }
124652b87ac3SJonas Hahnfeld 
124752b87ac3SJonas Hahnfeld /* It's not used right now! Comment it out to avoid warnings.
124852b87ac3SJonas Hahnfeld static void __itt_reinit_all_pointers(void)
124952b87ac3SJonas Hahnfeld {
1250*7f1a6d89SAndreyChurbanov     register int i;
125152b87ac3SJonas Hahnfeld     // Fill all pointers with initial stubs
125252b87ac3SJonas Hahnfeld     for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
1253309b00a4SShilei Tian         *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1254309b00a4SShilei Tian _N_(_ittapi_global).api_list_ptr[i].init_func;
125552b87ac3SJonas Hahnfeld }
125652b87ac3SJonas Hahnfeld */
125752b87ac3SJonas Hahnfeld 
__itt_nullify_all_pointers(void)1258309b00a4SShilei Tian static void __itt_nullify_all_pointers(void) {
125952b87ac3SJonas Hahnfeld   int i;
1260*7f1a6d89SAndreyChurbanov   /* Nulify all pointers except domain_create, string_handle_create  and
1261309b00a4SShilei Tian    * counter_create */
126252b87ac3SJonas Hahnfeld   for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
1263309b00a4SShilei Tian     *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1264309b00a4SShilei Tian         _N_(_ittapi_global).api_list_ptr[i].null_func;
126552b87ac3SJonas Hahnfeld }
126652b87ac3SJonas Hahnfeld 
1267*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1268*7f1a6d89SAndreyChurbanov #if _MSC_VER
126952b87ac3SJonas Hahnfeld #pragma warning(push)
1270*7f1a6d89SAndreyChurbanov #pragma warning(disable : 4054) /* warning C4054: 'type cast' : from function  \
1271309b00a4SShilei Tian                                    pointer 'XXX' to data pointer 'void *' */
1272*7f1a6d89SAndreyChurbanov #pragma warning(                                                               \
1273*7f1a6d89SAndreyChurbanov     disable : 4055) /* warning C4055: 'type cast' : from data pointer 'void *' \
1274*7f1a6d89SAndreyChurbanov                        to function pointer 'XXX' */
1275*7f1a6d89SAndreyChurbanov #endif
127652b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
127752b87ac3SJonas Hahnfeld 
_N_(fini_ittlib)1278309b00a4SShilei Tian ITT_EXTERN_C void _N_(fini_ittlib)(void) {
127952b87ac3SJonas Hahnfeld   __itt_api_fini_t *__itt_api_fini_ptr = NULL;
128052b87ac3SJonas Hahnfeld   static volatile TIDT current_thread = 0;
128152b87ac3SJonas Hahnfeld 
1282309b00a4SShilei Tian   if (_N_(_ittapi_global).api_initialized) {
128352b87ac3SJonas Hahnfeld     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
1284309b00a4SShilei Tian     if (_N_(_ittapi_global).api_initialized) {
1285309b00a4SShilei Tian       if (current_thread == 0) {
1286309b00a4SShilei Tian         if (PTHREAD_SYMBOLS)
1287309b00a4SShilei Tian           current_thread = __itt_thread_id();
1288309b00a4SShilei Tian         if (_N_(_ittapi_global).lib != NULL) {
1289309b00a4SShilei Tian           __itt_api_fini_ptr = (__itt_api_fini_t *)(size_t)__itt_get_proc(
1290309b00a4SShilei Tian               _N_(_ittapi_global).lib, "__itt_api_fini");
129152b87ac3SJonas Hahnfeld         }
1292309b00a4SShilei Tian         if (__itt_api_fini_ptr) {
129352b87ac3SJonas Hahnfeld           __itt_api_fini_ptr(&_N_(_ittapi_global));
129452b87ac3SJonas Hahnfeld         }
129552b87ac3SJonas Hahnfeld 
129652b87ac3SJonas Hahnfeld         __itt_nullify_all_pointers();
129752b87ac3SJonas Hahnfeld 
129852b87ac3SJonas Hahnfeld         /* TODO: !!! not safe !!! don't support unload so far.
129952b87ac3SJonas Hahnfeld          *             if (_N_(_ittapi_global).lib != NULL)
130052b87ac3SJonas Hahnfeld          *                 __itt_unload_lib(_N_(_ittapi_global).lib);
130152b87ac3SJonas Hahnfeld          *             _N_(_ittapi_global).lib = NULL;
130252b87ac3SJonas Hahnfeld          */
130352b87ac3SJonas Hahnfeld         _N_(_ittapi_global).api_initialized = 0;
130452b87ac3SJonas Hahnfeld         current_thread = 0;
130552b87ac3SJonas Hahnfeld       }
130652b87ac3SJonas Hahnfeld     }
1307309b00a4SShilei Tian     if (PTHREAD_SYMBOLS)
1308309b00a4SShilei Tian       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
130952b87ac3SJonas Hahnfeld   }
131052b87ac3SJonas Hahnfeld }
131152b87ac3SJonas Hahnfeld 
1312*7f1a6d89SAndreyChurbanov /* !!! this function should be called under mutex lock !!! */
__itt_free_allocated_resources(void)1313*7f1a6d89SAndreyChurbanov static void __itt_free_allocated_resources(void) {
1314*7f1a6d89SAndreyChurbanov   __itt_string_handle *current_string = _N_(_ittapi_global).string_list;
1315*7f1a6d89SAndreyChurbanov   while (current_string != NULL) {
1316*7f1a6d89SAndreyChurbanov     __itt_string_handle *tmp = current_string->next;
1317*7f1a6d89SAndreyChurbanov     free((char *)current_string->strA);
1318*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1319*7f1a6d89SAndreyChurbanov     free((wchar_t *)current_string->strW);
1320*7f1a6d89SAndreyChurbanov #endif
1321*7f1a6d89SAndreyChurbanov     free(current_string);
1322*7f1a6d89SAndreyChurbanov     current_string = tmp;
1323*7f1a6d89SAndreyChurbanov   }
1324*7f1a6d89SAndreyChurbanov   _N_(_ittapi_global).string_list = NULL;
1325*7f1a6d89SAndreyChurbanov 
1326*7f1a6d89SAndreyChurbanov   __itt_domain *current_domain = _N_(_ittapi_global).domain_list;
1327*7f1a6d89SAndreyChurbanov   while (current_domain != NULL) {
1328*7f1a6d89SAndreyChurbanov     __itt_domain *tmp = current_domain->next;
1329*7f1a6d89SAndreyChurbanov     free((char *)current_domain->nameA);
1330*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1331*7f1a6d89SAndreyChurbanov     free((wchar_t *)current_domain->nameW);
1332*7f1a6d89SAndreyChurbanov #endif
1333*7f1a6d89SAndreyChurbanov     free(current_domain);
1334*7f1a6d89SAndreyChurbanov     current_domain = tmp;
1335*7f1a6d89SAndreyChurbanov   }
1336*7f1a6d89SAndreyChurbanov   _N_(_ittapi_global).domain_list = NULL;
1337*7f1a6d89SAndreyChurbanov 
1338*7f1a6d89SAndreyChurbanov   __itt_counter_info_t *current_couter = _N_(_ittapi_global).counter_list;
1339*7f1a6d89SAndreyChurbanov   while (current_couter != NULL) {
1340*7f1a6d89SAndreyChurbanov     __itt_counter_info_t *tmp = current_couter->next;
1341*7f1a6d89SAndreyChurbanov     free((char *)current_couter->nameA);
1342*7f1a6d89SAndreyChurbanov     free((char *)current_couter->domainA);
1343*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1344*7f1a6d89SAndreyChurbanov     free((wchar_t *)current_couter->nameW);
1345*7f1a6d89SAndreyChurbanov     free((wchar_t *)current_couter->domainW);
1346*7f1a6d89SAndreyChurbanov #endif
1347*7f1a6d89SAndreyChurbanov     free(current_couter);
1348*7f1a6d89SAndreyChurbanov     current_couter = tmp;
1349*7f1a6d89SAndreyChurbanov   }
1350*7f1a6d89SAndreyChurbanov   _N_(_ittapi_global).counter_list = NULL;
1351*7f1a6d89SAndreyChurbanov 
1352*7f1a6d89SAndreyChurbanov   __itt_histogram *current_histogram = _N_(_ittapi_global).histogram_list;
1353*7f1a6d89SAndreyChurbanov   while (current_histogram != NULL) {
1354*7f1a6d89SAndreyChurbanov     __itt_histogram *tmp = current_histogram->next;
1355*7f1a6d89SAndreyChurbanov     free((char *)current_histogram->nameA);
1356*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1357*7f1a6d89SAndreyChurbanov     free((wchar_t *)current_histogram->nameW);
1358*7f1a6d89SAndreyChurbanov #endif
1359*7f1a6d89SAndreyChurbanov     free(current_histogram);
1360*7f1a6d89SAndreyChurbanov     current_histogram = tmp;
1361*7f1a6d89SAndreyChurbanov   }
1362*7f1a6d89SAndreyChurbanov   _N_(_ittapi_global).histogram_list = NULL;
1363*7f1a6d89SAndreyChurbanov }
1364*7f1a6d89SAndreyChurbanov 
_N_(init_ittlib)1365309b00a4SShilei Tian ITT_EXTERN_C int _N_(init_ittlib)(const char *lib_name,
1366309b00a4SShilei Tian                                   __itt_group_id init_groups) {
136752b87ac3SJonas Hahnfeld   int i;
136852b87ac3SJonas Hahnfeld   __itt_group_id groups;
136952b87ac3SJonas Hahnfeld #ifdef ITT_COMPLETE_GROUP
137052b87ac3SJonas Hahnfeld   __itt_group_id zero_group = __itt_group_none;
137152b87ac3SJonas Hahnfeld #endif /* ITT_COMPLETE_GROUP */
137252b87ac3SJonas Hahnfeld   static volatile TIDT current_thread = 0;
137352b87ac3SJonas Hahnfeld 
1374309b00a4SShilei Tian   if (!_N_(_ittapi_global).api_initialized) {
137552b87ac3SJonas Hahnfeld #ifndef ITT_SIMPLE_INIT
137652b87ac3SJonas Hahnfeld     ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));
137752b87ac3SJonas Hahnfeld #endif /* ITT_SIMPLE_INIT */
137852b87ac3SJonas Hahnfeld 
1379309b00a4SShilei Tian     if (!_N_(_ittapi_global).api_initialized) {
1380309b00a4SShilei Tian       if (current_thread == 0) {
1381309b00a4SShilei Tian         if (PTHREAD_SYMBOLS)
1382309b00a4SShilei Tian           current_thread = __itt_thread_id();
1383309b00a4SShilei Tian         if (lib_name == NULL) {
138452b87ac3SJonas Hahnfeld           lib_name = __itt_get_lib_name();
138552b87ac3SJonas Hahnfeld         }
138652b87ac3SJonas Hahnfeld         groups = __itt_get_groups();
1387309b00a4SShilei Tian         if (DL_SYMBOLS && (groups != __itt_group_none || lib_name != NULL)) {
1388309b00a4SShilei Tian           _N_(_ittapi_global).lib = __itt_load_lib(
1389309b00a4SShilei Tian               (lib_name == NULL) ? ittnotify_lib_name : lib_name);
139052b87ac3SJonas Hahnfeld 
1391309b00a4SShilei Tian           if (_N_(_ittapi_global).lib != NULL) {
139252b87ac3SJonas Hahnfeld             __itt_api_init_t *__itt_api_init_ptr;
139352b87ac3SJonas Hahnfeld             int lib_version = __itt_lib_version(_N_(_ittapi_global).lib);
139452b87ac3SJonas Hahnfeld 
139552b87ac3SJonas Hahnfeld             switch (lib_version) {
139652b87ac3SJonas Hahnfeld             case 0:
139752b87ac3SJonas Hahnfeld               groups = __itt_group_legacy;
1398*7f1a6d89SAndreyChurbanov               ITT_ATTRIBUTE_FALLTHROUGH;
139952b87ac3SJonas Hahnfeld             case 1:
140052b87ac3SJonas Hahnfeld               /* Fill all pointers from dynamic library */
1401309b00a4SShilei Tian               for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL;
1402309b00a4SShilei Tian                    i++) {
1403309b00a4SShilei Tian                 if (_N_(_ittapi_global).api_list_ptr[i].group & groups &
1404309b00a4SShilei Tian                     init_groups) {
1405309b00a4SShilei Tian                   *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1406309b00a4SShilei Tian                       (void *)__itt_get_proc(
1407309b00a4SShilei Tian                           _N_(_ittapi_global).lib,
1408309b00a4SShilei Tian                           _N_(_ittapi_global).api_list_ptr[i].name);
1409309b00a4SShilei Tian                   if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL) {
1410309b00a4SShilei Tian                     /* Restore pointers for function with static implementation
1411309b00a4SShilei Tian                      */
1412309b00a4SShilei Tian                     *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1413309b00a4SShilei Tian                         _N_(_ittapi_global).api_list_ptr[i].null_func;
1414309b00a4SShilei Tian                     __itt_report_error(
1415309b00a4SShilei Tian                         __itt_error_no_symbol, lib_name,
1416309b00a4SShilei Tian                         _N_(_ittapi_global).api_list_ptr[i].name);
141752b87ac3SJonas Hahnfeld #ifdef ITT_COMPLETE_GROUP
1418*7f1a6d89SAndreyChurbanov                     zero_group =
1419*7f1a6d89SAndreyChurbanov                         (__itt_group_id)(zero_group | _N_(_ittapi_global)
1420*7f1a6d89SAndreyChurbanov                                                           .api_list_ptr[i]
1421*7f1a6d89SAndreyChurbanov                                                           .group);
142252b87ac3SJonas Hahnfeld #endif /* ITT_COMPLETE_GROUP */
142352b87ac3SJonas Hahnfeld                   }
1424309b00a4SShilei Tian                 } else
1425309b00a4SShilei Tian                   *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1426309b00a4SShilei Tian                       _N_(_ittapi_global).api_list_ptr[i].null_func;
142752b87ac3SJonas Hahnfeld               }
142852b87ac3SJonas Hahnfeld 
1429309b00a4SShilei Tian               if (groups == __itt_group_legacy) {
143052b87ac3SJonas Hahnfeld                 /* Compatibility with legacy tools */
143152b87ac3SJonas Hahnfeld                 ITTNOTIFY_NAME(thread_ignore) = ITTNOTIFY_NAME(thr_ignore);
143252b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
143352b87ac3SJonas Hahnfeld                 ITTNOTIFY_NAME(sync_createA) = ITTNOTIFY_NAME(sync_set_nameA);
143452b87ac3SJonas Hahnfeld                 ITTNOTIFY_NAME(sync_createW) = ITTNOTIFY_NAME(sync_set_nameW);
143552b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
143652b87ac3SJonas Hahnfeld                 ITTNOTIFY_NAME(sync_create) = ITTNOTIFY_NAME(sync_set_name);
143752b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1438309b00a4SShilei Tian                 ITTNOTIFY_NAME(sync_prepare) =
1439309b00a4SShilei Tian                     ITTNOTIFY_NAME(notify_sync_prepare);
1440309b00a4SShilei Tian                 ITTNOTIFY_NAME(sync_cancel) =
1441309b00a4SShilei Tian                     ITTNOTIFY_NAME(notify_sync_cancel);
1442309b00a4SShilei Tian                 ITTNOTIFY_NAME(sync_acquired) =
1443309b00a4SShilei Tian                     ITTNOTIFY_NAME(notify_sync_acquired);
1444309b00a4SShilei Tian                 ITTNOTIFY_NAME(sync_releasing) =
1445309b00a4SShilei Tian                     ITTNOTIFY_NAME(notify_sync_releasing);
144652b87ac3SJonas Hahnfeld               }
144752b87ac3SJonas Hahnfeld 
144852b87ac3SJonas Hahnfeld #ifdef ITT_COMPLETE_GROUP
144952b87ac3SJonas Hahnfeld               for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
145052b87ac3SJonas Hahnfeld                 if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group)
1451309b00a4SShilei Tian                   *_N_(_ittapi_global).api_list_ptr[i].func_ptr =
1452309b00a4SShilei Tian                       _N_(_ittapi_global).api_list_ptr[i].null_func;
145352b87ac3SJonas Hahnfeld #endif /* ITT_COMPLETE_GROUP */
145452b87ac3SJonas Hahnfeld               break;
145552b87ac3SJonas Hahnfeld             case 2:
1456309b00a4SShilei Tian               __itt_api_init_ptr = (__itt_api_init_t *)(size_t)__itt_get_proc(
1457309b00a4SShilei Tian                   _N_(_ittapi_global).lib, "__itt_api_init");
145852b87ac3SJonas Hahnfeld               if (__itt_api_init_ptr)
145952b87ac3SJonas Hahnfeld                 __itt_api_init_ptr(&_N_(_ittapi_global), init_groups);
146052b87ac3SJonas Hahnfeld               break;
146152b87ac3SJonas Hahnfeld             }
1462309b00a4SShilei Tian           } else {
1463*7f1a6d89SAndreyChurbanov             __itt_free_allocated_resources();
146452b87ac3SJonas Hahnfeld             __itt_nullify_all_pointers();
146552b87ac3SJonas Hahnfeld 
146652b87ac3SJonas Hahnfeld             __itt_report_error(__itt_error_no_module, lib_name,
146752b87ac3SJonas Hahnfeld #if ITT_PLATFORM == ITT_PLATFORM_WIN
146852b87ac3SJonas Hahnfeld                                __itt_system_error()
146952b87ac3SJonas Hahnfeld #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
147052b87ac3SJonas Hahnfeld                                dlerror()
147152b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
147252b87ac3SJonas Hahnfeld             );
147352b87ac3SJonas Hahnfeld           }
1474309b00a4SShilei Tian         } else {
1475*7f1a6d89SAndreyChurbanov           __itt_free_allocated_resources();
147652b87ac3SJonas Hahnfeld           __itt_nullify_all_pointers();
147752b87ac3SJonas Hahnfeld         }
147852b87ac3SJonas Hahnfeld         _N_(_ittapi_global).api_initialized = 1;
147952b87ac3SJonas Hahnfeld         current_thread = 0;
148052b87ac3SJonas Hahnfeld         /* !!! Just to avoid unused code elimination !!! */
1481309b00a4SShilei Tian         if (__itt_fini_ittlib_ptr == _N_(fini_ittlib))
1482309b00a4SShilei Tian           current_thread = 0;
148352b87ac3SJonas Hahnfeld       }
148452b87ac3SJonas Hahnfeld     }
148552b87ac3SJonas Hahnfeld 
148652b87ac3SJonas Hahnfeld #ifndef ITT_SIMPLE_INIT
1487309b00a4SShilei Tian     if (PTHREAD_SYMBOLS)
1488309b00a4SShilei Tian       __itt_mutex_unlock(&_N_(_ittapi_global).mutex);
148952b87ac3SJonas Hahnfeld #endif /* ITT_SIMPLE_INIT */
149052b87ac3SJonas Hahnfeld   }
149152b87ac3SJonas Hahnfeld 
149252b87ac3SJonas Hahnfeld   /* Evaluating if any function ptr is non empty and it's in init_groups */
1493309b00a4SShilei Tian   for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) {
1494309b00a4SShilei Tian     if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr !=
1495309b00a4SShilei Tian             _N_(_ittapi_global).api_list_ptr[i].null_func &&
1496309b00a4SShilei Tian         _N_(_ittapi_global).api_list_ptr[i].group & init_groups) {
149752b87ac3SJonas Hahnfeld       return 1;
149852b87ac3SJonas Hahnfeld     }
149952b87ac3SJonas Hahnfeld   }
150052b87ac3SJonas Hahnfeld   return 0;
150152b87ac3SJonas Hahnfeld }
150252b87ac3SJonas Hahnfeld 
1503309b00a4SShilei Tian ITT_EXTERN_C __itt_error_handler_t *
_N_(set_error_handler)1504309b00a4SShilei Tian _N_(set_error_handler)(__itt_error_handler_t *handler) {
1505309b00a4SShilei Tian   __itt_error_handler_t *prev =
1506309b00a4SShilei Tian       (__itt_error_handler_t *)(size_t)_N_(_ittapi_global).error_handler;
150752b87ac3SJonas Hahnfeld   _N_(_ittapi_global).error_handler = (void *)(size_t)handler;
150852b87ac3SJonas Hahnfeld   return prev;
150952b87ac3SJonas Hahnfeld }
151052b87ac3SJonas Hahnfeld 
1511*7f1a6d89SAndreyChurbanov #if ITT_PLATFORM == ITT_PLATFORM_WIN
1512*7f1a6d89SAndreyChurbanov #if _MSC_VER
151352b87ac3SJonas Hahnfeld #pragma warning(pop)
1514*7f1a6d89SAndreyChurbanov #endif
151552b87ac3SJonas Hahnfeld #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
1516*7f1a6d89SAndreyChurbanov 
1517*7f1a6d89SAndreyChurbanov /** __itt_mark_pt_region functions marks region of interest
1518*7f1a6d89SAndreyChurbanov  * region parameter defines different regions.
1519*7f1a6d89SAndreyChurbanov  * 0 <= region < 8 */
1520*7f1a6d89SAndreyChurbanov 
1521*7f1a6d89SAndreyChurbanov #if defined(ITT_API_IPT_SUPPORT) &&                                            \
1522*7f1a6d89SAndreyChurbanov     (ITT_PLATFORM == ITT_PLATFORM_WIN ||                                       \
1523*7f1a6d89SAndreyChurbanov      ITT_PLATFORM == ITT_PLATFORM_POSIX) &&                                    \
1524*7f1a6d89SAndreyChurbanov     !defined(__ANDROID__)
1525*7f1a6d89SAndreyChurbanov void __itt_pt_mark(__itt_pt_region region);
1526*7f1a6d89SAndreyChurbanov void __itt_pt_mark_event(__itt_pt_region region);
1527*7f1a6d89SAndreyChurbanov #endif
1528*7f1a6d89SAndreyChurbanov 
_N_(mark_pt_region_begin)1529*7f1a6d89SAndreyChurbanov ITT_EXTERN_C void _N_(mark_pt_region_begin)(__itt_pt_region region) {
1530*7f1a6d89SAndreyChurbanov #if defined(ITT_API_IPT_SUPPORT) &&                                            \
1531*7f1a6d89SAndreyChurbanov     (ITT_PLATFORM == ITT_PLATFORM_WIN ||                                       \
1532*7f1a6d89SAndreyChurbanov      ITT_PLATFORM == ITT_PLATFORM_POSIX) &&                                    \
1533*7f1a6d89SAndreyChurbanov     !defined(__ANDROID__)
1534*7f1a6d89SAndreyChurbanov   if (_N_(_ittapi_global).ipt_collect_events == 1) {
1535*7f1a6d89SAndreyChurbanov     __itt_pt_mark_event(2 * region);
1536*7f1a6d89SAndreyChurbanov   } else {
1537*7f1a6d89SAndreyChurbanov     __itt_pt_mark(2 * region);
1538*7f1a6d89SAndreyChurbanov   }
1539*7f1a6d89SAndreyChurbanov #else
1540*7f1a6d89SAndreyChurbanov   (void)region;
1541*7f1a6d89SAndreyChurbanov #endif
1542*7f1a6d89SAndreyChurbanov }
1543*7f1a6d89SAndreyChurbanov 
_N_(mark_pt_region_end)1544*7f1a6d89SAndreyChurbanov ITT_EXTERN_C void _N_(mark_pt_region_end)(__itt_pt_region region) {
1545*7f1a6d89SAndreyChurbanov #if defined(ITT_API_IPT_SUPPORT) &&                                            \
1546*7f1a6d89SAndreyChurbanov     (ITT_PLATFORM == ITT_PLATFORM_WIN ||                                       \
1547*7f1a6d89SAndreyChurbanov      ITT_PLATFORM == ITT_PLATFORM_POSIX) &&                                    \
1548*7f1a6d89SAndreyChurbanov     !defined(__ANDROID__)
1549*7f1a6d89SAndreyChurbanov   if (_N_(_ittapi_global).ipt_collect_events == 1) {
1550*7f1a6d89SAndreyChurbanov     __itt_pt_mark_event(2 * region + 1);
1551*7f1a6d89SAndreyChurbanov   } else {
1552*7f1a6d89SAndreyChurbanov     __itt_pt_mark(2 * region + 1);
1553*7f1a6d89SAndreyChurbanov   }
1554*7f1a6d89SAndreyChurbanov #else
1555*7f1a6d89SAndreyChurbanov   (void)region;
1556*7f1a6d89SAndreyChurbanov #endif
1557*7f1a6d89SAndreyChurbanov }
1558