19 #if ITT_PLATFORM==ITT_PLATFORM_WIN
31 #define INTEL_NO_MACRO_BODY
32 #define INTEL_ITTNOTIFY_API_PRIVATE
40 #define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
42 #if ITT_OS==ITT_OS_WIN
44 #elif ITT_OS==ITT_OS_LINUX || ITT_OS==ITT_OS_FREEBSD
46 #elif ITT_OS==ITT_OS_MAC
49 #error Unsupported or unknown OS.
53 #include <android/log.h>
56 #include <sys/types.h>
59 #include <linux/limits.h>
61 #ifdef ITT_ANDROID_LOG
62 #define ITT_ANDROID_LOG_TAG "INTEL_VTUNE_USERAPI"
63 #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
64 #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
65 #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
66 #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
68 #define ITT_ANDROID_LOGI(...)
69 #define ITT_ANDROID_LOGW(...)
70 #define ITT_ANDROID_LOGE(...)
71 #define ITT_ANDROID_LOGD(...)
75 #define ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(x) "/data/data/com.intel.vtune/perfrun/lib" \
76 #x "/runtime/libittnotify.so"
78 #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
79 #define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(32)
81 #define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(64)
88 #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
89 #define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
91 #define LIB_VAR_NAME INTEL_LIBITTNOTIFY64
95 #define ITT_MUTEX_INIT_AND_LOCK(p) { \
96 if (!p.mutex_initialized) \
98 if (__itt_interlocked_increment(&p.atomic_counter) == 1) \
100 __itt_mutex_init(&p.mutex); \
101 p.mutex_initialized = 1; \
104 while (!p.mutex_initialized) \
105 __itt_thread_yield(); \
107 __itt_mutex_lock(&p.mutex); \
110 const int _N_(err) = 0;
115 #ifndef __itt_init_ittlib_name
118 #define __itt_init_ittlib_name __itt_init_ittlib_ptr
124 #ifndef __itt_fini_ittlib_name
127 #define __itt_fini_ittlib_name __itt_fini_ittlib_ptr
133 #define ITT_STUB(api,type,name,args,params,ptr,group,format) \
134 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
135 typedef type api ITT_JOIN(_N_(name),_t) args; \
136 ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
137 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
139 __itt_init_ittlib_name(NULL, __itt_group_all); \
140 if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
141 return ITTNOTIFY_NAME(name) params; \
146 #define ITT_STUBV(api,type,name,args,params,ptr,group,format) \
147 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
148 typedef type api ITT_JOIN(_N_(name),_t) args; \
149 ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \
150 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \
152 __itt_init_ittlib_name(NULL, __itt_group_all); \
153 if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \
154 ITTNOTIFY_NAME(name) params; \
159 #undef __ITT_INTERNAL_INIT
164 #define ITT_STUB(api,type,name,args,params,ptr,group,format) \
165 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
166 typedef type api ITT_JOIN(_N_(name),_t) args; \
167 ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
169 #define ITT_STUBV(api,type,name,args,params,ptr,group,format) \
170 static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\
171 typedef type api ITT_JOIN(_N_(name),_t) args; \
172 ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END
174 #define __ITT_INTERNAL_INIT
176 #undef __ITT_INTERNAL_INIT
180 #pragma pack(push, 8)
197 #if ITT_PLATFORM==ITT_PLATFORM_WIN
198 #pragma warning(push)
199 #pragma warning(disable: 4054)
206 #define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},
207 #define ITT_STUBV ITT_STUB
208 #define __ITT_INTERNAL_INIT
210 #undef __ITT_INTERNAL_INIT
214 #define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},
215 #define ITT_STUBV ITT_STUB
220 #if ITT_PLATFORM==ITT_PLATFORM_WIN
250 #ifdef ITT_NOTIFY_EXT_REPORT
254 #if ITT_PLATFORM==ITT_PLATFORM_WIN
255 #pragma warning(push)
256 #pragma warning(disable: 4055)
261 va_start(args, code);
262 if (
_N_(_ittapi_global).error_handler != NULL)
264 __itt_error_handler_t* handler = (__itt_error_handler_t*)(
size_t)
_N_(_ittapi_global).error_handler;
265 handler((__itt_error_code)code, args);
267 #ifdef ITT_NOTIFY_EXT_REPORT
268 _N_(error_handler)(code, args);
274 #define __itt_report_error(code, ...) \
275 __itt_report_error_impl((int)code,__VA_ARGS__)
278 #if ITT_PLATFORM==ITT_PLATFORM_WIN
282 #if ITT_PLATFORM==ITT_PLATFORM_WIN
285 __itt_domain *h_tail = NULL, *
h = NULL;
293 if (
_N_(_ittapi_global).api_initialized)
295 if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(domain_createW),_init)))
298 return ITTNOTIFY_NAME(domain_createW)(
name);
301 for (h_tail = NULL,
h =
_N_(_ittapi_global).domain_list;
h != NULL; h_tail =
h,
h =
h->next)
303 if (
h->nameW != NULL && !wcscmp(
h->nameW,
name))
break;
318 __itt_domain *h_tail = NULL, *
h = NULL;
326 if (
_N_(_ittapi_global).api_initialized)
328 #if ITT_PLATFORM==ITT_PLATFORM_WIN
329 if (ITTNOTIFY_NAME(domain_createA) && ITTNOTIFY_NAME(domain_createA) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(domain_createA),_init)))
332 return ITTNOTIFY_NAME(domain_createA)(
name);
335 if (ITTNOTIFY_NAME(domain_create) && ITTNOTIFY_NAME(domain_create) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(domain_create),_init)))
338 return ITTNOTIFY_NAME(domain_create)(
name);
342 for (h_tail = NULL,
h =
_N_(_ittapi_global).domain_list;
h != NULL; h_tail =
h,
h =
h->next)
354 #if ITT_PLATFORM==ITT_PLATFORM_WIN
357 __itt_string_handle *h_tail = NULL, *
h = NULL;
365 if (
_N_(_ittapi_global).api_initialized)
367 if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(string_handle_createW),_init)))
370 return ITTNOTIFY_NAME(string_handle_createW)(
name);
373 for (h_tail = NULL,
h =
_N_(_ittapi_global).string_list;
h != NULL; h_tail =
h,
h =
h->next)
375 if (
h->strW != NULL && !wcscmp(
h->strW,
name))
break;
387 static __itt_string_handle* ITTAPI
ITT_VERSIONIZE(ITT_JOIN(
_N_(string_handle_create),_init))(
const char*
name)
390 __itt_string_handle *h_tail = NULL, *
h = NULL;
398 if (
_N_(_ittapi_global).api_initialized)
400 #if ITT_PLATFORM==ITT_PLATFORM_WIN
401 if (ITTNOTIFY_NAME(string_handle_createA) && ITTNOTIFY_NAME(string_handle_createA) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(string_handle_createA),_init)))
404 return ITTNOTIFY_NAME(string_handle_createA)(
name);
407 if (ITTNOTIFY_NAME(string_handle_create) && ITTNOTIFY_NAME(string_handle_create) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(string_handle_create),_init)))
410 return ITTNOTIFY_NAME(string_handle_create)(
name);
414 for (h_tail = NULL,
h =
_N_(_ittapi_global).string_list;
h != NULL; h_tail =
h,
h =
h->next)
430 if (!
_N_(_ittapi_global).api_initialized &&
_N_(_ittapi_global).thread_list == NULL)
436 ITTNOTIFY_NAME(
pause)();
446 if (!
_N_(_ittapi_global).api_initialized &&
_N_(_ittapi_global).thread_list == NULL)
450 if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(resume),_init)))
452 ITTNOTIFY_NAME(resume)();
460 #if ITT_PLATFORM==ITT_PLATFORM_WIN
463 if (!
_N_(_ittapi_global).api_initialized &&
_N_(_ittapi_global).thread_list == NULL)
467 if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(thread_set_nameW),_init)))
469 ITTNOTIFY_NAME(thread_set_nameW)(
name);
485 if (!
_N_(_ittapi_global).api_initialized &&
_N_(_ittapi_global).thread_list == NULL)
489 #if ITT_PLATFORM==ITT_PLATFORM_WIN
490 if (ITTNOTIFY_NAME(thread_set_nameA) && ITTNOTIFY_NAME(thread_set_nameA) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(thread_set_nameA),_init)))
492 ITTNOTIFY_NAME(thread_set_nameA)(
name);
495 if (ITTNOTIFY_NAME(thread_set_name) && ITTNOTIFY_NAME(thread_set_name) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(thread_set_name),_init)))
497 ITTNOTIFY_NAME(thread_set_name)(
name);
502 #if ITT_PLATFORM==ITT_PLATFORM_WIN
520 if (!
_N_(_ittapi_global).api_initialized &&
_N_(_ittapi_global).thread_list == NULL)
524 if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) !=
ITT_VERSIONIZE(ITT_JOIN(
_N_(thread_ignore),_init)))
526 ITTNOTIFY_NAME(thread_ignore)();
548 static const char*
__itt_fsplit(
const char*
s,
const char* sep,
const char** out,
int* len)
553 if (!
s || !sep || !out || !len)
556 for (i = 0;
s[i]; i++)
559 for (j = 0; sep[j]; j++)
575 for (;
s[i]; i++, (*len)++)
578 for (j = 0; sep[j]; j++)
591 for (j = 0; sep[j]; j++)
611 #define MAX_ENV_VALUE_SIZE 4086
613 static char* env_value = (
char*)env_buff;
617 #if ITT_PLATFORM==ITT_PLATFORM_WIN
619 DWORD rc = GetEnvironmentVariableA(
name, env_value, (DWORD)max_len);
624 const char* ret = (
const char*)env_value;
633 DWORD err = GetLastError();
634 if (err == ERROR_SUCCESS)
637 if (err != ERROR_ENVVAR_NOT_FOUND)
641 char* env = getenv(
name);
648 const char* ret = (
const char*)env_value;
650 env_value += len + 1;
665 if (lib_name == NULL)
668 #if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
669 const char*
const marker_filename =
"com.intel.itt.collector_lib_32";
671 const char*
const marker_filename =
"com.intel.itt.collector_lib_64";
674 char system_wide_marker_filename[
PATH_MAX] = {0};
675 int itt_marker_file_fd = -1;
678 res = snprintf(system_wide_marker_filename,
PATH_MAX - 1,
"%s%s",
"/data/local/tmp/", marker_filename);
681 ITT_ANDROID_LOGE(
"Unable to concatenate marker file string.");
684 itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);
686 if (itt_marker_file_fd == -1)
688 const pid_t my_pid = getpid();
691 char app_sandbox_file[
PATH_MAX] = {0};
694 ITT_ANDROID_LOGI(
"Unable to open system-wide marker file.");
695 res = snprintf(cmdline_path,
PATH_MAX - 1,
"/proc/%d/cmdline", my_pid);
698 ITT_ANDROID_LOGE(
"Unable to get cmdline path string.");
702 ITT_ANDROID_LOGI(
"CMD file: %s\n", cmdline_path);
703 cmdline_fd = open(cmdline_path, O_RDONLY);
704 if (cmdline_fd == -1)
706 ITT_ANDROID_LOGE(
"Unable to open %s file!", cmdline_path);
709 res = read(cmdline_fd, package_name,
PATH_MAX - 1);
712 ITT_ANDROID_LOGE(
"Unable to read %s file!", cmdline_path);
713 res = close(cmdline_fd);
716 ITT_ANDROID_LOGE(
"Unable to close %s file!", cmdline_path);
720 res = close(cmdline_fd);
723 ITT_ANDROID_LOGE(
"Unable to close %s file!", cmdline_path);
726 ITT_ANDROID_LOGI(
"Package name: %s\n", package_name);
727 res = snprintf(app_sandbox_file,
PATH_MAX - 1,
"/data/data/%s/%s", package_name, marker_filename);
730 ITT_ANDROID_LOGE(
"Unable to concatenate marker file string.");
734 ITT_ANDROID_LOGI(
"Lib marker file name: %s\n", app_sandbox_file);
735 itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);
736 if (itt_marker_file_fd == -1)
738 ITT_ANDROID_LOGE(
"Unable to open app marker file!");
746 res = read(itt_marker_file_fd, itt_lib_name,
PATH_MAX - 1);
749 ITT_ANDROID_LOGE(
"Unable to read %s file!", itt_marker_file_fd);
750 res = close(itt_marker_file_fd);
753 ITT_ANDROID_LOGE(
"Unable to close %s file!", itt_marker_file_fd);
757 ITT_ANDROID_LOGI(
"ITT Lib path: %s", itt_lib_name);
758 res = close(itt_marker_file_fd);
761 ITT_ANDROID_LOGE(
"Unable to close %s file!", itt_marker_file_fd);
768 ITT_ANDROID_LOGE(
"Unable to set env var!");
772 ITT_ANDROID_LOGI(
"ITT Lib path from env: %s", lib_name);
781 #define __itt_min(a,b) ((a) < (b) ? (a) : (b))
787 const char* var_name =
"INTEL_ITTNOTIFY_GROUPS";
790 if (group_str != NULL)
795 while ((group_str =
__itt_fsplit(group_str,
",; ", &chunk, &len)) != NULL)
798 gr[
__itt_min(len, (
int)(
sizeof(gr) - 1))] = 0;
800 for (i = 0; group_list[i].name != NULL; i++)
855 for (i = 0;
_N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
856 *
_N_(_ittapi_global).api_list_ptr[i].func_ptr =
_N_(_ittapi_global).api_list_ptr[i].null_func;
859 #if ITT_PLATFORM==ITT_PLATFORM_WIN
860 #pragma warning(push)
861 #pragma warning(disable: 4054)
862 #pragma warning(disable: 4055)
868 static volatile TIDT current_thread = 0;
870 if (
_N_(_ittapi_global).api_initialized)
873 if (
_N_(_ittapi_global).api_initialized)
875 if (current_thread == 0)
878 if (
_N_(_ittapi_global).lib != NULL)
882 if (__itt_api_fini_ptr)
884 __itt_api_fini_ptr(&
_N_(_ittapi_global));
894 _N_(_ittapi_global).api_initialized = 0;
906 #ifdef ITT_COMPLETE_GROUP
909 static volatile TIDT current_thread = 0;
911 if (!
_N_(_ittapi_global).api_initialized)
913 #ifndef ITT_SIMPLE_INIT
917 if (!
_N_(_ittapi_global).api_initialized)
919 if (current_thread == 0)
922 if (lib_name == NULL)
931 if (
_N_(_ittapi_global).lib != NULL)
936 switch (lib_version) {
942 for (i = 0;
_N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
944 if (
_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups)
946 *
_N_(_ittapi_global).api_list_ptr[i].func_ptr = (
void*)
__itt_get_proc(
_N_(_ittapi_global).lib,
_N_(_ittapi_global).api_list_ptr[i].name);
947 if (*
_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL)
950 *
_N_(_ittapi_global).api_list_ptr[i].func_ptr =
_N_(_ittapi_global).api_list_ptr[i].null_func;
952 #ifdef ITT_COMPLETE_GROUP
953 zero_group = (
__itt_group_id)(zero_group |
_N_(_ittapi_global).api_list_ptr[i].group);
958 *
_N_(_ittapi_global).api_list_ptr[i].func_ptr =
_N_(_ittapi_global).api_list_ptr[i].null_func;
964 ITTNOTIFY_NAME(thread_ignore) = ITTNOTIFY_NAME(thr_ignore);
965 #if ITT_PLATFORM==ITT_PLATFORM_WIN
966 ITTNOTIFY_NAME(
sync_createA) = ITTNOTIFY_NAME(sync_set_nameA);
969 ITTNOTIFY_NAME(sync_create) = ITTNOTIFY_NAME(sync_set_name);
971 ITTNOTIFY_NAME(sync_prepare) = ITTNOTIFY_NAME(notify_sync_prepare);
973 ITTNOTIFY_NAME(sync_acquired) = ITTNOTIFY_NAME(notify_sync_acquired);
977 #ifdef ITT_COMPLETE_GROUP
978 for (i = 0;
_N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
979 if (
_N_(_ittapi_global).api_list_ptr[i].group & zero_group)
980 *
_N_(_ittapi_global).api_list_ptr[i].func_ptr =
_N_(_ittapi_global).api_list_ptr[i].null_func;
985 if (__itt_api_init_ptr)
986 __itt_api_init_ptr(&
_N_(_ittapi_global), init_groups);
993 #if ITT_PLATFORM==ITT_PLATFORM_WIN
996 const char* error = dlerror();
1005 _N_(_ittapi_global).api_initialized = 1;
1012 #ifndef ITT_SIMPLE_INIT
1018 for (i = 0;
_N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)
1020 if (*
_N_(_ittapi_global).api_list_ptr[i].func_ptr !=
_N_(_ittapi_global).api_list_ptr[i].null_func &&
1021 _N_(_ittapi_global).api_list_ptr[i].group & init_groups)
1031 __itt_error_handler_t* prev = (__itt_error_handler_t*)(
size_t)
_N_(_ittapi_global).error_handler;
1032 _N_(_ittapi_global).error_handler = (
void*)(
size_t)handler;
1036 #if ITT_PLATFORM==ITT_PLATFORM_WIN
1037 #pragma warning(pop)