From 908ee7e19c34b57670054c8da1c02ff52761db83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= Date: Tue, 23 Jul 2024 11:38:25 +0200 Subject: [PATCH] ittnotify: use untouched library --- CMakeLists.txt | 1 + src/ittapi/CMakeLists.txt | 21 + src/ittapi/ittapi-3.25.1.tar.gz | Bin 0 -> 195868 bytes src/tbb/CMakeLists.txt | 1 + src/tbb/itt_notify.cpp | 7 +- src/tbb/itt_notify.h | 4 +- src/tbb/tools_api/disable_warnings.h | 39 - src/tbb/tools_api/ittnotify.h | 4677 -------------------------- src/tbb/tools_api/ittnotify_config.h | 775 ----- src/tbb/tools_api/ittnotify_static.c | 1807 ---------- src/tbb/tools_api/ittnotify_static.h | 378 --- src/tbb/tools_api/ittnotify_types.h | 75 - src/tbb/tools_api/legacy/ittnotify.h | 1015 ------ src/tbbmalloc/CMakeLists.txt | 7 +- 14 files changed, 34 insertions(+), 8773 deletions(-) create mode 100644 src/ittapi/CMakeLists.txt create mode 100644 src/ittapi/ittapi-3.25.1.tar.gz delete mode 100644 src/tbb/tools_api/disable_warnings.h delete mode 100644 src/tbb/tools_api/ittnotify.h delete mode 100644 src/tbb/tools_api/ittnotify_config.h delete mode 100644 src/tbb/tools_api/ittnotify_static.c delete mode 100644 src/tbb/tools_api/ittnotify_static.h delete mode 100644 src/tbb/tools_api/ittnotify_types.h delete mode 100644 src/tbb/tools_api/legacy/ittnotify.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 19232a9920..ca02a993bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,6 +240,7 @@ if (TBB_FIND_PACKAGE AND TBB_DIR) find_package(TBB REQUIRED) else() if (TBB_BUILD) + add_subdirectory(src/ittapi) add_subdirectory(src/tbb) endif() if (TBBMALLOC_BUILD) diff --git a/src/ittapi/CMakeLists.txt b/src/ittapi/CMakeLists.txt new file mode 100644 index 0000000000..b59e952927 --- /dev/null +++ b/src/ittapi/CMakeLists.txt @@ -0,0 +1,21 @@ +include(FetchContent) + +# Fetch the ittapi library if it doesn't exist +if(NOT TARGET ittapi::ittnotify) + FetchContent_Declare( + ittapi + # https://github.com/intel/ittapi/archive/refs/tags/v3.25.1.tar.gz + URL ${CMAKE_CURRENT_SOURCE_DIR}/ittapi-3.25.1.tar.gz + URL_HASH + SHA256=866a5a75a287a7440760146f99bd1093750c3fb5bf572c3bff2d4795628ebc7c + ) + FetchContent_MakeAvailable(ittapi) + add_library(ittapi::ittnotify ALIAS ittnotify) +endif() + +if(NOT TARGET ittapi::ittnotify) + message( + ERROR + "Failed to add IntelĀ® Instrumentation and Tracing Technology (ITT) library" + ) +endif() \ No newline at end of file diff --git a/src/ittapi/ittapi-3.25.1.tar.gz b/src/ittapi/ittapi-3.25.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bcce629d876f4201cc94dd8c0ce633bbf2f3efcb GIT binary patch literal 195868 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 literal 0 HcmV?d00001 diff --git a/src/tbb/CMakeLists.txt b/src/tbb/CMakeLists.txt index b996c736a7..9464312d17 100644 --- a/src/tbb/CMakeLists.txt +++ b/src/tbb/CMakeLists.txt @@ -121,6 +121,7 @@ endif() target_link_libraries(tbb PRIVATE + ittapi::ittnotify Threads::Threads ${TBB_LIB_LINK_LIBS} ${TBB_COMMON_LINK_LIBS} diff --git a/src/tbb/itt_notify.cpp b/src/tbb/itt_notify.cpp index eda5e6ad5e..3c6200b759 100644 --- a/src/tbb/itt_notify.cpp +++ b/src/tbb/itt_notify.cpp @@ -24,8 +24,13 @@ #pragma weak dlopen #pragma weak dlsym #pragma weak dlerror + #include + #include + #include #endif /* WIN */ +#include "itt_notify.h" + #if __TBB_BUILD extern "C" void ITT_DoOneTimeInitialization(); @@ -40,8 +45,6 @@ extern "C" void MallocInitializeITT(); #error This file is expected to be used for either TBB or TBB allocator build. #endif // __TBB_BUILD -#include "tools_api/ittnotify_static.c" - namespace tbb { namespace detail { namespace r1 { diff --git a/src/tbb/itt_notify.h b/src/tbb/itt_notify.h index 48ddc5caec..6ca26b6e22 100644 --- a/src/tbb/itt_notify.h +++ b/src/tbb/itt_notify.h @@ -31,8 +31,8 @@ #define INTEL_ITTNOTIFY_API_PRIVATE #endif -#include "tools_api/ittnotify.h" -#include "tools_api/legacy/ittnotify.h" +#include "ittnotify.h" +#include "legacy/ittnotify.h" extern "C" void __itt_fini_ittlib(void); extern "C" void __itt_release_resources(void); diff --git a/src/tbb/tools_api/disable_warnings.h b/src/tbb/tools_api/disable_warnings.h deleted file mode 100644 index 977569d087..0000000000 --- a/src/tbb/tools_api/disable_warnings.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - Copyright (c) 2005-2022 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ittnotify_config.h" - -#if ITT_PLATFORM==ITT_PLATFORM_WIN - -#if defined _MSC_VER - -#pragma warning (disable: 593) /* parameter "XXXX" was set but never used */ -#pragma warning (disable: 344) /* typedef name has already been declared (with same type) */ -#pragma warning (disable: 174) /* expression has no effect */ -#pragma warning (disable: 4127) /* conditional expression is constant */ -#pragma warning (disable: 4306) /* conversion from '?' to '?' of greater size */ - -#endif - -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if defined __INTEL_COMPILER - -#pragma warning (disable: 869) /* parameter "XXXXX" was never referenced */ -#pragma warning (disable: 1418) /* external function definition with no prior declaration */ -#pragma warning (disable: 1419) /* external declaration in primary source file */ - -#endif /* __INTEL_COMPILER */ diff --git a/src/tbb/tools_api/ittnotify.h b/src/tbb/tools_api/ittnotify.h deleted file mode 100644 index eb1571dc8b..0000000000 --- a/src/tbb/tools_api/ittnotify.h +++ /dev/null @@ -1,4677 +0,0 @@ -/* - Copyright (c) 2005-2024 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _ITTNOTIFY_H_ -#define _ITTNOTIFY_H_ - -/** -@file -@brief Public User API functions and types -@mainpage - -The Instrumentation and Tracing Technology API (ITT API) is used to -annotate a user's program with additional information -that can be used by correctness and performance tools. The user inserts -calls in their program. Those calls generate information that is collected -at runtime, and used by Intel(R) Threading Tools. - -@section API Concepts -The following general concepts are used throughout the API. - -@subsection Unicode Support -Many API functions take character string arguments. On Windows, there -are two versions of each such function. The function name is suffixed -by W if Unicode support is enabled, and by A otherwise. Any API function -that takes a character string argument adheres to this convention. - -@subsection Conditional Compilation -Many users prefer having an option to modify ITT API code when linking it -inside their runtimes. ITT API header file provides a mechanism to replace -ITT API function names inside your code with empty strings. To do this, -define the macros INTEL_NO_ITTNOTIFY_API during compilation and remove the -static library from the linker script. - -@subsection Domains -[see domains] -Domains provide a way to separate notification for different modules or -libraries in a program. Domains are specified by dotted character strings, -e.g. TBB.Internal.Control. - -A mechanism (to be specified) is provided to enable and disable -domains. By default, all domains are enabled. -@subsection Named Entities and Instances -Named entities (frames, regions, tasks, and markers) communicate -information about the program to the analysis tools. A named entity often -refers to a section of program code, or to some set of logical concepts -that the programmer wants to group together. - -Named entities relate to the programmer's static view of the program. When -the program actually executes, many instances of a given named entity -may be created. - -The API annotations denote instances of named entities. The actual -named entities are displayed using the analysis tools. In other words, -the named entities come into existence when instances are created. - -Instances of named entities may have instance identifiers (IDs). Some -API calls use instance identifiers to create relationships between -different instances of named entities. Other API calls associate data -with instances of named entities. - -Some named entities must always have instance IDs. In particular, regions -and frames always have IDs. Task and markers need IDs only if the ID is -needed in another API call (such as adding a relation or metadata). - -The lifetime of instance IDs is distinct from the lifetime of -instances. This allows various relationships to be specified separate -from the actual execution of instances. This flexibility comes at the -expense of extra API calls. - -The same ID may not be reused for different instances, unless a previous -[ref] __itt_id_destroy call for that ID has been issued. -*/ - -/** @cond exclude_from_documentation */ -#ifndef ITT_OS_WIN -# define ITT_OS_WIN 1 -#endif /* ITT_OS_WIN */ - -#ifndef ITT_OS_LINUX -# define ITT_OS_LINUX 2 -#endif /* ITT_OS_LINUX */ - -#ifndef ITT_OS_MAC -# define ITT_OS_MAC 3 -#endif /* ITT_OS_MAC */ - -#ifndef ITT_OS_FREEBSD -# define ITT_OS_FREEBSD 4 -#endif /* ITT_OS_FREEBSD */ - -#ifndef ITT_OS_OPENBSD -# define ITT_OS_OPENBSD 5 -#endif /* ITT_OS_OPENBSD */ - - -#ifndef ITT_OS -# if defined WIN32 || defined _WIN32 -# define ITT_OS ITT_OS_WIN -# elif defined( __APPLE__ ) && defined( __MACH__ ) -# define ITT_OS ITT_OS_MAC -# elif defined( __FreeBSD__ ) -# define ITT_OS ITT_OS_FREEBSD -# elif defined( __OpenBSD__ ) -# define ITT_OS ITT_OS_OPENBSD -# else -# define ITT_OS ITT_OS_LINUX -# endif -#endif /* ITT_OS */ - -#ifndef ITT_PLATFORM_WIN -# define ITT_PLATFORM_WIN 1 -#endif /* ITT_PLATFORM_WIN */ - -#ifndef ITT_PLATFORM_POSIX -# define ITT_PLATFORM_POSIX 2 -#endif /* ITT_PLATFORM_POSIX */ - -#ifndef ITT_PLATFORM_MAC -# define ITT_PLATFORM_MAC 3 -#endif /* ITT_PLATFORM_MAC */ - -#ifndef ITT_PLATFORM_FREEBSD -# define ITT_PLATFORM_FREEBSD 4 -#endif /* ITT_PLATFORM_FREEBSD */ - -#ifndef ITT_PLATFORM_OPENBSD -# define ITT_PLATFORM_OPENBSD 5 -#endif /* ITT_PLATFORM_OPENBSD */ - -#ifndef ITT_PLATFORM -# if ITT_OS==ITT_OS_WIN -# define ITT_PLATFORM ITT_PLATFORM_WIN -# elif ITT_OS==ITT_OS_MAC -# define ITT_PLATFORM ITT_PLATFORM_MAC -# elif ITT_OS==ITT_OS_FREEBSD -# define ITT_PLATFORM ITT_PLATFORM_FREEBSD -# elif ITT_OS==ITT_OS_OPENBSD -# define ITT_PLATFORM ITT_PLATFORM_OPENBSD -# else -# define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif -#endif /* ITT_PLATFORM */ - -#if defined(_UNICODE) && !defined(UNICODE) -#define UNICODE -#endif - -#include -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#include -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#include -#if defined(UNICODE) || defined(_UNICODE) -#include -#endif /* UNICODE || _UNICODE */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef ITTAPI_CDECL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define ITTAPI_CDECL __cdecl -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define ITTAPI_CDECL __attribute__ ((cdecl)) -# else /* _M_IX86 || __i386__ */ -# define ITTAPI_CDECL /* actual only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* ITTAPI_CDECL */ - -#ifndef STDCALL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define STDCALL __stdcall -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define STDCALL __attribute__ ((stdcall)) -# else /* _M_IX86 || __i386__ */ -# define STDCALL /* supported only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* STDCALL */ - -#define ITTAPI ITTAPI_CDECL -#define LIBITTAPI ITTAPI_CDECL - -/* TODO: Temporary for compatibility! */ -#define ITTAPI_CALL ITTAPI_CDECL -#define LIBITTAPI_CALL ITTAPI_CDECL - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -/* use __forceinline (VC++ specific) */ -#if defined(__MINGW32__) && !defined(__cplusplus) -#define ITT_INLINE static __inline__ __attribute__((__always_inline__,__gnu_inline__)) -#else -#define ITT_INLINE static __forceinline -#endif /* __MINGW32__ */ - -#define ITT_INLINE_ATTRIBUTE /* nothing */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/* - * Generally, functions are not inlined unless optimization is specified. - * For functions declared inline, this attribute inlines the function even - * if no optimization level was specified. - */ -#ifdef __STRICT_ANSI__ -#define ITT_INLINE static -#define ITT_INLINE_ATTRIBUTE __attribute__((unused)) -#else /* __STRICT_ANSI__ */ -#define ITT_INLINE static inline -#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused)) -#endif /* __STRICT_ANSI__ */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/** @endcond */ - -#ifdef INTEL_ITTNOTIFY_ENABLE_LEGACY -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# pragma message("WARNING!!! Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro") -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# warning "Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro" -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# include "legacy/ittnotify.h" -#endif /* INTEL_ITTNOTIFY_ENABLE_LEGACY */ - -/** @cond exclude_from_documentation */ -/* Helper macro for joining tokens */ -#define ITT_JOIN_AUX(p,n) p##n -#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n) - -#ifdef ITT_MAJOR -#undef ITT_MAJOR -#endif -#ifdef ITT_MINOR -#undef ITT_MINOR -#endif -#define ITT_MAJOR 3 -#define ITT_MINOR 0 - -/* Standard versioning of a token with major and minor version numbers */ -#define ITT_VERSIONIZE(x) \ - ITT_JOIN(x, \ - ITT_JOIN(_, \ - ITT_JOIN(ITT_MAJOR, \ - ITT_JOIN(_, ITT_MINOR)))) - -#ifndef INTEL_ITTNOTIFY_PREFIX -# define INTEL_ITTNOTIFY_PREFIX __itt_ -#endif /* INTEL_ITTNOTIFY_PREFIX */ -#ifndef INTEL_ITTNOTIFY_POSTFIX -# define INTEL_ITTNOTIFY_POSTFIX _ptr_ -#endif /* INTEL_ITTNOTIFY_POSTFIX */ - -#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n) -#define ITTNOTIFY_NAME(n) ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))) - -#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n) -#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n) - -#define ITTNOTIFY_VOID_D0(n,d) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d) -#define ITTNOTIFY_VOID_D1(n,d,x) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x) -#define ITTNOTIFY_VOID_D2(n,d,x,y) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y) -#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z) -#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a) -#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b) -#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c) -#define ITTNOTIFY_DATA_D0(n,d) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d) -#define ITTNOTIFY_DATA_D1(n,d,x) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x) -#define ITTNOTIFY_DATA_D2(n,d,x,y) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y) -#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z) -#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a) -#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b) -#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c) - -#ifdef ITT_STUB -#undef ITT_STUB -#endif -#ifdef ITT_STUBV -#undef ITT_STUBV -#endif -#define ITT_STUBV(api,type,name,args) \ - typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \ - extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name); -#define ITT_STUB ITT_STUBV -/** @endcond */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** @cond exclude_from_gpa_documentation */ -/** - * @defgroup public Public API - * @{ - * @} - */ - -/** - * @defgroup control Collection Control - * @ingroup public - * General behavior: application continues to run, but no profiling information is being collected - * - * Pausing occurs not only for the current thread but for all process as well as spawned processes - * - Intel(R) Parallel Inspector and Intel(R) Inspector XE: - * - Does not analyze or report errors that involve memory access. - * - Other errors are reported as usual. Pausing data collection in - * Intel(R) Parallel Inspector and Intel(R) Inspector XE - * only pauses tracing and analyzing memory access. - * It does not pause tracing or analyzing threading APIs. - * . - * Intel(R) VTune(TM) Profiler: - * - Does continue to record when new threads are started. - * . - * - Other effects: - * - Possible reduction of runtime overhead. - * . - * @{ - */ -/** @brief Pause collection */ -void ITTAPI __itt_pause(void); -/** @brief Resume collection */ -void ITTAPI __itt_resume(void); -/** @brief Detach collection */ -void ITTAPI __itt_detach(void); - -/** - * @enum __itt_collection_scope - * @brief Enumerator for collection scopes - */ -typedef enum { - __itt_collection_scope_host = 1 << 0, - __itt_collection_scope_offload = 1 << 1, - __itt_collection_scope_all = 0x7FFFFFFF -} __itt_collection_scope; - -/** @brief Pause scoped collection */ -void ITTAPI __itt_pause_scoped(__itt_collection_scope); -/** @brief Resume scoped collection */ -void ITTAPI __itt_resume_scoped(__itt_collection_scope); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, pause, (void)) -ITT_STUBV(ITTAPI, void, pause_scoped, (__itt_collection_scope)) -ITT_STUBV(ITTAPI, void, resume, (void)) -ITT_STUBV(ITTAPI, void, resume_scoped, (__itt_collection_scope)) -ITT_STUBV(ITTAPI, void, detach, (void)) -#define __itt_pause ITTNOTIFY_VOID(pause) -#define __itt_pause_ptr ITTNOTIFY_NAME(pause) -#define __itt_pause_scoped ITTNOTIFY_VOID(pause_scoped) -#define __itt_pause_scoped_ptr ITTNOTIFY_NAME(pause_scoped) -#define __itt_resume ITTNOTIFY_VOID(resume) -#define __itt_resume_ptr ITTNOTIFY_NAME(resume) -#define __itt_resume_scoped ITTNOTIFY_VOID(resume_scoped) -#define __itt_resume_scoped_ptr ITTNOTIFY_NAME(resume_scoped) -#define __itt_detach ITTNOTIFY_VOID(detach) -#define __itt_detach_ptr ITTNOTIFY_NAME(detach) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_pause() -#define __itt_pause_ptr 0 -#define __itt_pause_scoped(scope) -#define __itt_pause_scoped_ptr 0 -#define __itt_resume() -#define __itt_resume_ptr 0 -#define __itt_resume_scoped(scope) -#define __itt_resume_scoped_ptr 0 -#define __itt_detach() -#define __itt_detach_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_pause_ptr 0 -#define __itt_pause_scoped_ptr 0 -#define __itt_resume_ptr 0 -#define __itt_resume_scoped_ptr 0 -#define __itt_detach_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} control group */ -/** @endcond */ - -/** - * @defgroup Intel Processor Trace control - * API from this group provides control over collection and analysis of Intel Processor Trace (Intel PT) data - * Information about Intel Processor Trace technology can be found here (Volume 3 chapter 35): - * https://github.com/tpn/pdfs/blob/master/Intel%2064%20and%20IA-32%20Architectures%20Software%20Developer's%20Manual%20-%20Combined%20Volumes%201-4%20-%20May%202018%20(325462-sdm-vol-1-2abcd-3abcd).pdf - * Use this API to mark particular code regions for loading detailed performance statistics. - * This mode makes your analysis faster and more accurate. - * @{ -*/ -typedef unsigned char __itt_pt_region; - -/** - * @brief function saves a region name marked with Intel PT API and returns a region id. - * Only 7 names can be registered. Attempts to register more names will be ignored and a region id with auto names will be returned. - * For automatic naming of regions pass NULL as function parameter -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_pt_region ITTAPI __itt_pt_region_createA(const char *name); -__itt_pt_region ITTAPI __itt_pt_region_createW(const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_pt_region_create __itt_pt_region_createW -#else /* UNICODE */ -# define __itt_pt_region_create __itt_pt_region_createA -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_pt_region ITTAPI __itt_pt_region_create(const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createA, (const char *name)) -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createW, (const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_create, (const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_pt_region_createA ITTNOTIFY_DATA(pt_region_createA) -#define __itt_pt_region_createA_ptr ITTNOTIFY_NAME(pt_region_createA) -#define __itt_pt_region_createW ITTNOTIFY_DATA(pt_region_createW) -#define __itt_pt_region_createW_ptr ITTNOTIFY_NAME(pt_region_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_pt_region_create ITTNOTIFY_DATA(pt_region_create) -#define __itt_pt_region_create_ptr ITTNOTIFY_NAME(pt_region_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_pt_region_createA(name) (__itt_pt_region)0 -#define __itt_pt_region_createA_ptr 0 -#define __itt_pt_region_createW(name) (__itt_pt_region)0 -#define __itt_pt_region_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_pt_region_create(name) (__itt_pt_region)0 -#define __itt_pt_region_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_pt_region_createA_ptr 0 -#define __itt_pt_region_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_pt_region_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief function contains a special code pattern identified on the post-processing stage and - * marks the beginning of a code region targeted for Intel PT analysis - * @param[in] region - region id, 0 <= region < 8 -*/ -void __itt_mark_pt_region_begin(__itt_pt_region region); -/** - * @brief function contains a special code pattern identified on the post-processing stage and - * marks the end of a code region targeted for Intel PT analysis - * @param[in] region - region id, 0 <= region < 8 -*/ -void __itt_mark_pt_region_end(__itt_pt_region region); -/** @} Intel PT control group*/ - -/** - * @defgroup threads Threads - * @ingroup public - * Give names to threads - * @{ - */ -/** - * @brief Sets thread name of calling thread - * @param[in] name - name of thread - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_thread_set_nameA(const char *name); -void ITTAPI __itt_thread_set_nameW(const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_thread_set_name __itt_thread_set_nameW -# define __itt_thread_set_name_ptr __itt_thread_set_nameW_ptr -#else /* UNICODE */ -# define __itt_thread_set_name __itt_thread_set_nameA -# define __itt_thread_set_name_ptr __itt_thread_set_nameA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_thread_set_name(const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char *name)) -ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, thread_set_name, (const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thread_set_nameA ITTNOTIFY_VOID(thread_set_nameA) -#define __itt_thread_set_nameA_ptr ITTNOTIFY_NAME(thread_set_nameA) -#define __itt_thread_set_nameW ITTNOTIFY_VOID(thread_set_nameW) -#define __itt_thread_set_nameW_ptr ITTNOTIFY_NAME(thread_set_nameW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thread_set_name ITTNOTIFY_VOID(thread_set_name) -#define __itt_thread_set_name_ptr ITTNOTIFY_NAME(thread_set_name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thread_set_nameA(name) -#define __itt_thread_set_nameA_ptr 0 -#define __itt_thread_set_nameW(name) -#define __itt_thread_set_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thread_set_name(name) -#define __itt_thread_set_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thread_set_nameA_ptr 0 -#define __itt_thread_set_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thread_set_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @cond exclude_from_gpa_documentation */ - -/** - * @brief Mark current thread as ignored from this point on, for the duration of its existence. - */ -void ITTAPI __itt_thread_ignore(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, thread_ignore, (void)) -#define __itt_thread_ignore ITTNOTIFY_VOID(thread_ignore) -#define __itt_thread_ignore_ptr ITTNOTIFY_NAME(thread_ignore) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_thread_ignore() -#define __itt_thread_ignore_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_thread_ignore_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} threads group */ - -/** - * @defgroup suppress Error suppression - * @ingroup public - * General behavior: application continues to run, but errors are suppressed - * - * @{ - */ - -/*****************************************************************//** - * @name group of functions used for error suppression in correctness tools - *********************************************************************/ -/** @{ */ -/** - * @hideinitializer - * @brief possible value for suppression mask - */ -#define __itt_suppress_all_errors 0x7fffffff - -/** - * @hideinitializer - * @brief possible value for suppression mask (suppresses errors from threading analysis) - */ -#define __itt_suppress_threading_errors 0x000000ff - -/** - * @hideinitializer - * @brief possible value for suppression mask (suppresses errors from memory analysis) - */ -#define __itt_suppress_memory_errors 0x0000ff00 - -/** - * @brief Start suppressing errors identified in mask on this thread - */ -void ITTAPI __itt_suppress_push(unsigned int mask); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask)) -#define __itt_suppress_push ITTNOTIFY_VOID(suppress_push) -#define __itt_suppress_push_ptr ITTNOTIFY_NAME(suppress_push) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_suppress_push(mask) -#define __itt_suppress_push_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_suppress_push_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Undo the effects of the matching call to __itt_suppress_push - */ -void ITTAPI __itt_suppress_pop(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, suppress_pop, (void)) -#define __itt_suppress_pop ITTNOTIFY_VOID(suppress_pop) -#define __itt_suppress_pop_ptr ITTNOTIFY_NAME(suppress_pop) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_suppress_pop() -#define __itt_suppress_pop_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_suppress_pop_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @enum __itt_suppress_mode - * @brief Enumerator for the suppressing modes - */ -typedef enum __itt_suppress_mode { - __itt_unsuppress_range, - __itt_suppress_range -} __itt_suppress_mode_t; - -/** - * @enum __itt_collection_state - * @brief Enumerator for collection state. - */ -typedef enum { - __itt_collection_uninitialized = 0, /* uninitialized */ - __itt_collection_init_fail = 1, /* failed to init */ - __itt_collection_collector_absent = 2, /* non work state collector is absent */ - __itt_collection_collector_exists = 3, /* work state collector exists */ - __itt_collection_init_successful = 4 /* success to init */ -} __itt_collection_state; - -/** - * @brief Mark a range of memory for error suppression or unsuppression for error types included in mask - */ -void ITTAPI __itt_suppress_mark_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size)) -#define __itt_suppress_mark_range ITTNOTIFY_VOID(suppress_mark_range) -#define __itt_suppress_mark_range_ptr ITTNOTIFY_NAME(suppress_mark_range) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_suppress_mark_range(mask) -#define __itt_suppress_mark_range_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_suppress_mark_range_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Undo the effect of a matching call to __itt_suppress_mark_range. If not matching - * call is found, nothing is changed. - */ -void ITTAPI __itt_suppress_clear_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, suppress_clear_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size)) -#define __itt_suppress_clear_range ITTNOTIFY_VOID(suppress_clear_range) -#define __itt_suppress_clear_range_ptr ITTNOTIFY_NAME(suppress_clear_range) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_suppress_clear_range(mask) -#define __itt_suppress_clear_range_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_suppress_clear_range_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} */ -/** @} suppress group */ - -/** - * @defgroup sync Synchronization - * @ingroup public - * Indicate user-written synchronization code - * @{ - */ -/** - * @hideinitializer - * @brief possible value of attribute argument for sync object type - */ -#define __itt_attr_barrier 1 - -/** - * @hideinitializer - * @brief possible value of attribute argument for sync object type - */ -#define __itt_attr_mutex 2 - -/** -@brief Name a synchronization object -@param[in] addr Handle for the synchronization object. You should -use a real address to uniquely identify the synchronization object. -@param[in] objtype null-terminated object type string. If NULL is -passed, the name will be "User Synchronization". -@param[in] objname null-terminated object name string. If NULL, -no name will be assigned to the object. -@param[in] attribute one of [#__itt_attr_barrier, #__itt_attr_mutex] - */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_sync_createA(void *addr, const char *objtype, const char *objname, int attribute); -void ITTAPI __itt_sync_createW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_sync_create __itt_sync_createW -# define __itt_sync_create_ptr __itt_sync_createW_ptr -#else /* UNICODE */ -# define __itt_sync_create __itt_sync_createA -# define __itt_sync_create_ptr __itt_sync_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_sync_create (void *addr, const char *objtype, const char *objname, int attribute); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char *objtype, const char *objname, int attribute)) -ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_create, (void *addr, const char* objtype, const char* objname, int attribute)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_createA ITTNOTIFY_VOID(sync_createA) -#define __itt_sync_createA_ptr ITTNOTIFY_NAME(sync_createA) -#define __itt_sync_createW ITTNOTIFY_VOID(sync_createW) -#define __itt_sync_createW_ptr ITTNOTIFY_NAME(sync_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_create ITTNOTIFY_VOID(sync_create) -#define __itt_sync_create_ptr ITTNOTIFY_NAME(sync_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_createA(addr, objtype, objname, attribute) -#define __itt_sync_createA_ptr 0 -#define __itt_sync_createW(addr, objtype, objname, attribute) -#define __itt_sync_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_create(addr, objtype, objname, attribute) -#define __itt_sync_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_createA_ptr 0 -#define __itt_sync_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** -@brief Rename a synchronization object - -You can use the rename call to assign or reassign a name to a given -synchronization object. -@param[in] addr handle for the synchronization object. -@param[in] name null-terminated object name string. -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_sync_renameA(void *addr, const char *name); -void ITTAPI __itt_sync_renameW(void *addr, const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_sync_rename __itt_sync_renameW -# define __itt_sync_rename_ptr __itt_sync_renameW_ptr -#else /* UNICODE */ -# define __itt_sync_rename __itt_sync_renameA -# define __itt_sync_rename_ptr __itt_sync_renameA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_sync_rename(void *addr, const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char *name)) -ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_rename, (void *addr, const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_renameA ITTNOTIFY_VOID(sync_renameA) -#define __itt_sync_renameA_ptr ITTNOTIFY_NAME(sync_renameA) -#define __itt_sync_renameW ITTNOTIFY_VOID(sync_renameW) -#define __itt_sync_renameW_ptr ITTNOTIFY_NAME(sync_renameW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_rename ITTNOTIFY_VOID(sync_rename) -#define __itt_sync_rename_ptr ITTNOTIFY_NAME(sync_rename) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_renameA(addr, name) -#define __itt_sync_renameA_ptr 0 -#define __itt_sync_renameW(addr, name) -#define __itt_sync_renameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_rename(addr, name) -#define __itt_sync_rename_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_renameA_ptr 0 -#define __itt_sync_renameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_rename_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - @brief Destroy a synchronization object. - @param addr Handle for the synchronization object. - */ -void ITTAPI __itt_sync_destroy(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, sync_destroy, (void *addr)) -#define __itt_sync_destroy ITTNOTIFY_VOID(sync_destroy) -#define __itt_sync_destroy_ptr ITTNOTIFY_NAME(sync_destroy) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_sync_destroy(addr) -#define __itt_sync_destroy_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_sync_destroy_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/*****************************************************************//** - * @name group of functions is used for performance measurement tools - *********************************************************************/ -/** @{ */ -/** - * @brief Enter spin loop on user-defined sync object - */ -void ITTAPI __itt_sync_prepare(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, sync_prepare, (void *addr)) -#define __itt_sync_prepare ITTNOTIFY_VOID(sync_prepare) -#define __itt_sync_prepare_ptr ITTNOTIFY_NAME(sync_prepare) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_sync_prepare(addr) -#define __itt_sync_prepare_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_sync_prepare_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Quit spin loop without acquiring spin object - */ -void ITTAPI __itt_sync_cancel(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr)) -#define __itt_sync_cancel ITTNOTIFY_VOID(sync_cancel) -#define __itt_sync_cancel_ptr ITTNOTIFY_NAME(sync_cancel) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_sync_cancel(addr) -#define __itt_sync_cancel_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_sync_cancel_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Successful spin loop completion (sync object acquired) - */ -void ITTAPI __itt_sync_acquired(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr)) -#define __itt_sync_acquired ITTNOTIFY_VOID(sync_acquired) -#define __itt_sync_acquired_ptr ITTNOTIFY_NAME(sync_acquired) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_sync_acquired(addr) -#define __itt_sync_acquired_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_sync_acquired_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Start sync object releasing code. Is called before the lock release call. - */ -void ITTAPI __itt_sync_releasing(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, sync_releasing, (void *addr)) -#define __itt_sync_releasing ITTNOTIFY_VOID(sync_releasing) -#define __itt_sync_releasing_ptr ITTNOTIFY_NAME(sync_releasing) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_sync_releasing(addr) -#define __itt_sync_releasing_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_sync_releasing_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} */ - -/** @} sync group */ - -/**************************************************************//** - * @name group of functions is used for correctness checking tools - ******************************************************************/ -/** @{ */ -/** - * @ingroup legacy - * @deprecated Legacy API - * @brief Fast synchronization which does no require spinning. - * - This special function is to be used by TBB and OpenMP libraries only when they know - * there is no spin but they need to suppress TC warnings about shared variable modifications. - * - It only has corresponding pointers in static library and does not have corresponding function - * in dynamic library. - * @see void __itt_sync_prepare(void* addr); - */ -void ITTAPI __itt_fsync_prepare(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, fsync_prepare, (void *addr)) -#define __itt_fsync_prepare ITTNOTIFY_VOID(fsync_prepare) -#define __itt_fsync_prepare_ptr ITTNOTIFY_NAME(fsync_prepare) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_fsync_prepare(addr) -#define __itt_fsync_prepare_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_fsync_prepare_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup legacy - * @deprecated Legacy API - * @brief Fast synchronization which does no require spinning. - * - This special function is to be used by TBB and OpenMP libraries only when they know - * there is no spin but they need to suppress TC warnings about shared variable modifications. - * - It only has corresponding pointers in static library and does not have corresponding function - * in dynamic library. - * @see void __itt_sync_cancel(void *addr); - */ -void ITTAPI __itt_fsync_cancel(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr)) -#define __itt_fsync_cancel ITTNOTIFY_VOID(fsync_cancel) -#define __itt_fsync_cancel_ptr ITTNOTIFY_NAME(fsync_cancel) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_fsync_cancel(addr) -#define __itt_fsync_cancel_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_fsync_cancel_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup legacy - * @deprecated Legacy API - * @brief Fast synchronization which does no require spinning. - * - This special function is to be used by TBB and OpenMP libraries only when they know - * there is no spin but they need to suppress TC warnings about shared variable modifications. - * - It only has corresponding pointers in static library and does not have corresponding function - * in dynamic library. - * @see void __itt_sync_acquired(void *addr); - */ -void ITTAPI __itt_fsync_acquired(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr)) -#define __itt_fsync_acquired ITTNOTIFY_VOID(fsync_acquired) -#define __itt_fsync_acquired_ptr ITTNOTIFY_NAME(fsync_acquired) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_fsync_acquired(addr) -#define __itt_fsync_acquired_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_fsync_acquired_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup legacy - * @deprecated Legacy API - * @brief Fast synchronization which does no require spinning. - * - This special function is to be used by TBB and OpenMP libraries only when they know - * there is no spin but they need to suppress TC warnings about shared variable modifications. - * - It only has corresponding pointers in static library and does not have corresponding function - * in dynamic library. - * @see void __itt_sync_releasing(void* addr); - */ -void ITTAPI __itt_fsync_releasing(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, fsync_releasing, (void *addr)) -#define __itt_fsync_releasing ITTNOTIFY_VOID(fsync_releasing) -#define __itt_fsync_releasing_ptr ITTNOTIFY_NAME(fsync_releasing) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_fsync_releasing(addr) -#define __itt_fsync_releasing_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_fsync_releasing_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} */ - -/** - * @defgroup model Modeling by Intel(R) Parallel Advisor - * @ingroup public - * This is the subset of itt used for modeling by Intel(R) Parallel Advisor. - * This API is called ONLY using annotate.h, by "Annotation" macros - * the user places in their sources during the parallelism modeling steps. - * - * site_begin/end and task_begin/end take the address of handle variables, - * which are writeable by the API. Handles must be 0 initialized prior - * to the first call to begin, or may cause a run-time failure. - * The handles are initialized in a multi-thread safe way by the API if - * the handle is 0. The commonly expected idiom is one static handle to - * identify a site or task. If a site or task of the same name has already - * been started during this collection, the same handle MAY be returned, - * but is not required to be - it is unspecified if data merging is done - * based on name. These routines also take an instance variable. Like - * the lexical instance, these must be 0 initialized. Unlike the lexical - * instance, this is used to track a single dynamic instance. - * - * API used by the Intel(R) Parallel Advisor to describe potential concurrency - * and related activities. User-added source annotations expand to calls - * to these procedures to enable modeling of a hypothetical concurrent - * execution serially. - * @{ - */ -#if !defined(_ADVISOR_ANNOTATE_H_) || defined(ANNOTATE_EXPAND_NULL) - -typedef void* __itt_model_site; /*!< @brief handle for lexical site */ -typedef void* __itt_model_site_instance; /*!< @brief handle for dynamic instance */ -typedef void* __itt_model_task; /*!< @brief handle for lexical site */ -typedef void* __itt_model_task_instance; /*!< @brief handle for dynamic instance */ - -/** - * @enum __itt_model_disable - * @brief Enumerator for the disable methods - */ -typedef enum { - __itt_model_disable_observation, - __itt_model_disable_collection -} __itt_model_disable; - -#endif /* !_ADVISOR_ANNOTATE_H_ || ANNOTATE_EXPAND_NULL */ - -/** - * @brief ANNOTATE_SITE_BEGIN/ANNOTATE_SITE_END support. - * - * site_begin/end model a potential concurrency site. - * site instances may be recursively nested with themselves. - * site_end exits the most recently started but unended site for the current - * thread. The handle passed to end may be used to validate structure. - * Instances of a site encountered on different threads concurrently - * are considered completely distinct. If the site name for two different - * lexical sites match, it is unspecified whether they are treated as the - * same or different for data presentation. - */ -void ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_instance *instance, const char *name); -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_model_site_beginW(const wchar_t *name); -#endif -void ITTAPI __itt_model_site_beginA(const char *name); -void ITTAPI __itt_model_site_beginAL(const char *name, size_t siteNameLen); -void ITTAPI __itt_model_site_end (__itt_model_site *site, __itt_model_site_instance *instance); -void ITTAPI __itt_model_site_end_2(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_site_instance *instance, const char *name)) -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name)) -#endif -ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name)) -ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t siteNameLen)) -ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance)) -ITT_STUBV(ITTAPI, void, model_site_end_2, (void)) -#define __itt_model_site_begin ITTNOTIFY_VOID(model_site_begin) -#define __itt_model_site_begin_ptr ITTNOTIFY_NAME(model_site_begin) -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_site_beginW ITTNOTIFY_VOID(model_site_beginW) -#define __itt_model_site_beginW_ptr ITTNOTIFY_NAME(model_site_beginW) -#endif -#define __itt_model_site_beginA ITTNOTIFY_VOID(model_site_beginA) -#define __itt_model_site_beginA_ptr ITTNOTIFY_NAME(model_site_beginA) -#define __itt_model_site_beginAL ITTNOTIFY_VOID(model_site_beginAL) -#define __itt_model_site_beginAL_ptr ITTNOTIFY_NAME(model_site_beginAL) -#define __itt_model_site_end ITTNOTIFY_VOID(model_site_end) -#define __itt_model_site_end_ptr ITTNOTIFY_NAME(model_site_end) -#define __itt_model_site_end_2 ITTNOTIFY_VOID(model_site_end_2) -#define __itt_model_site_end_2_ptr ITTNOTIFY_NAME(model_site_end_2) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_site_begin(site, instance, name) -#define __itt_model_site_begin_ptr 0 -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_site_beginW(name) -#define __itt_model_site_beginW_ptr 0 -#endif -#define __itt_model_site_beginA(name) -#define __itt_model_site_beginA_ptr 0 -#define __itt_model_site_beginAL(name, siteNameLen) -#define __itt_model_site_beginAL_ptr 0 -#define __itt_model_site_end(site, instance) -#define __itt_model_site_end_ptr 0 -#define __itt_model_site_end_2() -#define __itt_model_site_end_2_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_site_begin_ptr 0 -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_site_beginW_ptr 0 -#endif -#define __itt_model_site_beginA_ptr 0 -#define __itt_model_site_beginAL_ptr 0 -#define __itt_model_site_end_ptr 0 -#define __itt_model_site_end_2_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_TASK_BEGIN/ANNOTATE_TASK_END support - * - * task_begin/end model a potential task, which is contained within the most - * closely enclosing dynamic site. task_end exits the most recently started - * but unended task. The handle passed to end may be used to validate - * structure. It is unspecified if bad dynamic nesting is detected. If it - * is, it should be encoded in the resulting data collection. The collector - * should not fail due to construct nesting issues, nor attempt to directly - * indicate the problem. - */ -void ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name); -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_model_task_beginW(const wchar_t *name); -void ITTAPI __itt_model_iteration_taskW(const wchar_t *name); -#endif -void ITTAPI __itt_model_task_beginA(const char *name); -void ITTAPI __itt_model_task_beginAL(const char *name, size_t taskNameLen); -void ITTAPI __itt_model_iteration_taskA(const char *name); -void ITTAPI __itt_model_iteration_taskAL(const char *name, size_t taskNameLen); -void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_instance *instance); -void ITTAPI __itt_model_task_end_2(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name)) -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name)) -ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name)) -#endif -ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name)) -ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t taskNameLen)) -ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name)) -ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t taskNameLen)) -ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance)) -ITT_STUBV(ITTAPI, void, model_task_end_2, (void)) -#define __itt_model_task_begin ITTNOTIFY_VOID(model_task_begin) -#define __itt_model_task_begin_ptr ITTNOTIFY_NAME(model_task_begin) -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_task_beginW ITTNOTIFY_VOID(model_task_beginW) -#define __itt_model_task_beginW_ptr ITTNOTIFY_NAME(model_task_beginW) -#define __itt_model_iteration_taskW ITTNOTIFY_VOID(model_iteration_taskW) -#define __itt_model_iteration_taskW_ptr ITTNOTIFY_NAME(model_iteration_taskW) -#endif -#define __itt_model_task_beginA ITTNOTIFY_VOID(model_task_beginA) -#define __itt_model_task_beginA_ptr ITTNOTIFY_NAME(model_task_beginA) -#define __itt_model_task_beginAL ITTNOTIFY_VOID(model_task_beginAL) -#define __itt_model_task_beginAL_ptr ITTNOTIFY_NAME(model_task_beginAL) -#define __itt_model_iteration_taskA ITTNOTIFY_VOID(model_iteration_taskA) -#define __itt_model_iteration_taskA_ptr ITTNOTIFY_NAME(model_iteration_taskA) -#define __itt_model_iteration_taskAL ITTNOTIFY_VOID(model_iteration_taskAL) -#define __itt_model_iteration_taskAL_ptr ITTNOTIFY_NAME(model_iteration_taskAL) -#define __itt_model_task_end ITTNOTIFY_VOID(model_task_end) -#define __itt_model_task_end_ptr ITTNOTIFY_NAME(model_task_end) -#define __itt_model_task_end_2 ITTNOTIFY_VOID(model_task_end_2) -#define __itt_model_task_end_2_ptr ITTNOTIFY_NAME(model_task_end_2) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_task_begin(task, instance, name) -#define __itt_model_task_begin_ptr 0 -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_task_beginW(name) -#define __itt_model_task_beginW_ptr 0 -#endif -#define __itt_model_task_beginA(name) -#define __itt_model_task_beginA_ptr 0 -#define __itt_model_task_beginAL(name, siteNameLen) -#define __itt_model_task_beginAL_ptr 0 -#define __itt_model_iteration_taskA(name) -#define __itt_model_iteration_taskA_ptr 0 -#define __itt_model_iteration_taskAL(name, siteNameLen) -#define __itt_model_iteration_taskAL_ptr 0 -#define __itt_model_task_end(task, instance) -#define __itt_model_task_end_ptr 0 -#define __itt_model_task_end_2() -#define __itt_model_task_end_2_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_task_begin_ptr 0 -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_model_task_beginW_ptr 0 -#endif -#define __itt_model_task_beginA_ptr 0 -#define __itt_model_task_beginAL_ptr 0 -#define __itt_model_iteration_taskA_ptr 0 -#define __itt_model_iteration_taskAL_ptr 0 -#define __itt_model_task_end_ptr 0 -#define __itt_model_task_end_2_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_LOCK_ACQUIRE/ANNOTATE_LOCK_RELEASE support - * - * lock_acquire/release model a potential lock for both lockset and - * performance modeling. Each unique address is modeled as a separate - * lock, with invalid addresses being valid lock IDs. Specifically: - * no storage is accessed by the API at the specified address - it is only - * used for lock identification. Lock acquires may be self-nested and are - * unlocked by a corresponding number of releases. - * (These closely correspond to __itt_sync_acquired/__itt_sync_releasing, - * but may not have identical semantics.) - */ -void ITTAPI __itt_model_lock_acquire(void *lock); -void ITTAPI __itt_model_lock_acquire_2(void *lock); -void ITTAPI __itt_model_lock_release(void *lock); -void ITTAPI __itt_model_lock_release_2(void *lock); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock)) -ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock)) -ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock)) -ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock)) -#define __itt_model_lock_acquire ITTNOTIFY_VOID(model_lock_acquire) -#define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire) -#define __itt_model_lock_acquire_2 ITTNOTIFY_VOID(model_lock_acquire_2) -#define __itt_model_lock_acquire_2_ptr ITTNOTIFY_NAME(model_lock_acquire_2) -#define __itt_model_lock_release ITTNOTIFY_VOID(model_lock_release) -#define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release) -#define __itt_model_lock_release_2 ITTNOTIFY_VOID(model_lock_release_2) -#define __itt_model_lock_release_2_ptr ITTNOTIFY_NAME(model_lock_release_2) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_lock_acquire(lock) -#define __itt_model_lock_acquire_ptr 0 -#define __itt_model_lock_acquire_2(lock) -#define __itt_model_lock_acquire_2_ptr 0 -#define __itt_model_lock_release(lock) -#define __itt_model_lock_release_ptr 0 -#define __itt_model_lock_release_2(lock) -#define __itt_model_lock_release_2_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_lock_acquire_ptr 0 -#define __itt_model_lock_acquire_2_ptr 0 -#define __itt_model_lock_release_ptr 0 -#define __itt_model_lock_release_2_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_RECORD_ALLOCATION/ANNOTATE_RECORD_DEALLOCATION support - * - * record_allocation/deallocation describe user-defined memory allocator - * behavior, which may be required for correctness modeling to understand - * when storage is not expected to be actually reused across threads. - */ -void ITTAPI __itt_model_record_allocation (void *addr, size_t size); -void ITTAPI __itt_model_record_deallocation(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_record_allocation, (void *addr, size_t size)) -ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr)) -#define __itt_model_record_allocation ITTNOTIFY_VOID(model_record_allocation) -#define __itt_model_record_allocation_ptr ITTNOTIFY_NAME(model_record_allocation) -#define __itt_model_record_deallocation ITTNOTIFY_VOID(model_record_deallocation) -#define __itt_model_record_deallocation_ptr ITTNOTIFY_NAME(model_record_deallocation) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_record_allocation(addr, size) -#define __itt_model_record_allocation_ptr 0 -#define __itt_model_record_deallocation(addr) -#define __itt_model_record_deallocation_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_record_allocation_ptr 0 -#define __itt_model_record_deallocation_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_INDUCTION_USES support - * - * Note particular storage is inductive through the end of the current site - */ -void ITTAPI __itt_model_induction_uses(void* addr, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_induction_uses, (void *addr, size_t size)) -#define __itt_model_induction_uses ITTNOTIFY_VOID(model_induction_uses) -#define __itt_model_induction_uses_ptr ITTNOTIFY_NAME(model_induction_uses) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_induction_uses(addr, size) -#define __itt_model_induction_uses_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_induction_uses_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_REDUCTION_USES support - * - * Note particular storage is used for reduction through the end - * of the current site - */ -void ITTAPI __itt_model_reduction_uses(void* addr, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_reduction_uses, (void *addr, size_t size)) -#define __itt_model_reduction_uses ITTNOTIFY_VOID(model_reduction_uses) -#define __itt_model_reduction_uses_ptr ITTNOTIFY_NAME(model_reduction_uses) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_reduction_uses(addr, size) -#define __itt_model_reduction_uses_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_reduction_uses_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_OBSERVE_USES support - * - * Have correctness modeling record observations about uses of storage - * through the end of the current site - */ -void ITTAPI __itt_model_observe_uses(void* addr, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_observe_uses, (void *addr, size_t size)) -#define __itt_model_observe_uses ITTNOTIFY_VOID(model_observe_uses) -#define __itt_model_observe_uses_ptr ITTNOTIFY_NAME(model_observe_uses) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_observe_uses(addr, size) -#define __itt_model_observe_uses_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_observe_uses_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_CLEAR_USES support - * - * Clear the special handling of a piece of storage related to induction, - * reduction or observe_uses - */ -void ITTAPI __itt_model_clear_uses(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr)) -#define __itt_model_clear_uses ITTNOTIFY_VOID(model_clear_uses) -#define __itt_model_clear_uses_ptr ITTNOTIFY_NAME(model_clear_uses) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_clear_uses(addr) -#define __itt_model_clear_uses_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_clear_uses_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief ANNOTATE_DISABLE_*_PUSH/ANNOTATE_DISABLE_*_POP support - * - * disable_push/disable_pop push and pop disabling based on a parameter. - * Disabling observations stops processing of memory references during - * correctness modeling, and all annotations that occur in the disabled - * region. This allows description of code that is expected to be handled - * specially during conversion to parallelism or that is not recognized - * by tools (e.g. some kinds of synchronization operations.) - * This mechanism causes all annotations in the disabled region, other - * than disable_push and disable_pop, to be ignored. (For example, this - * might validly be used to disable an entire parallel site and the contained - * tasks and locking in it for data collection purposes.) - * The disable for collection is a more expensive operation, but reduces - * collector overhead significantly. This applies to BOTH correctness data - * collection and performance data collection. For example, a site - * containing a task might only enable data collection for the first 10 - * iterations. Both performance and correctness data should reflect this, - * and the program should run as close to full speed as possible when - * collection is disabled. - */ -void ITTAPI __itt_model_disable_push(__itt_model_disable x); -void ITTAPI __itt_model_disable_pop(void); -void ITTAPI __itt_model_aggregate_task(size_t x); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x)) -ITT_STUBV(ITTAPI, void, model_disable_pop, (void)) -ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t x)) -#define __itt_model_disable_push ITTNOTIFY_VOID(model_disable_push) -#define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push) -#define __itt_model_disable_pop ITTNOTIFY_VOID(model_disable_pop) -#define __itt_model_disable_pop_ptr ITTNOTIFY_NAME(model_disable_pop) -#define __itt_model_aggregate_task ITTNOTIFY_VOID(model_aggregate_task) -#define __itt_model_aggregate_task_ptr ITTNOTIFY_NAME(model_aggregate_task) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_model_disable_push(x) -#define __itt_model_disable_push_ptr 0 -#define __itt_model_disable_pop() -#define __itt_model_disable_pop_ptr 0 -#define __itt_model_aggregate_task(x) -#define __itt_model_aggregate_task_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_model_disable_push_ptr 0 -#define __itt_model_disable_pop_ptr 0 -#define __itt_model_aggregate_task_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} model group */ - -/** - * @defgroup heap Heap - * @ingroup public - * Heap group - * @{ - */ - -typedef void* __itt_heap_function; - -/** - * @brief Create an identification for heap function - * @return non-zero identifier or NULL - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_heap_function ITTAPI __itt_heap_function_createA(const char* name, const char* domain); -__itt_heap_function ITTAPI __itt_heap_function_createW(const wchar_t* name, const wchar_t* domain); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_heap_function_create __itt_heap_function_createW -# define __itt_heap_function_create_ptr __itt_heap_function_createW_ptr -#else -# define __itt_heap_function_create __itt_heap_function_createA -# define __itt_heap_function_create_ptr __itt_heap_function_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_heap_function ITTAPI __itt_heap_function_create(const char* name, const char* domain); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char* name, const char* domain)) -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t* name, const wchar_t* domain)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create, (const char* name, const char* domain)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_heap_function_createA ITTNOTIFY_DATA(heap_function_createA) -#define __itt_heap_function_createA_ptr ITTNOTIFY_NAME(heap_function_createA) -#define __itt_heap_function_createW ITTNOTIFY_DATA(heap_function_createW) -#define __itt_heap_function_createW_ptr ITTNOTIFY_NAME(heap_function_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_heap_function_create ITTNOTIFY_DATA(heap_function_create) -#define __itt_heap_function_create_ptr ITTNOTIFY_NAME(heap_function_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_heap_function_createA(name, domain) (__itt_heap_function)0 -#define __itt_heap_function_createA_ptr 0 -#define __itt_heap_function_createW(name, domain) (__itt_heap_function)0 -#define __itt_heap_function_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_heap_function_create(name, domain) (__itt_heap_function)0 -#define __itt_heap_function_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_heap_function_createA_ptr 0 -#define __itt_heap_function_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_heap_function_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an allocation begin occurrence. - */ -void ITTAPI __itt_heap_allocate_begin(__itt_heap_function h, size_t size, int initialized); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized)) -#define __itt_heap_allocate_begin ITTNOTIFY_VOID(heap_allocate_begin) -#define __itt_heap_allocate_begin_ptr ITTNOTIFY_NAME(heap_allocate_begin) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_allocate_begin(h, size, initialized) -#define __itt_heap_allocate_begin_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_allocate_begin_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an allocation end occurrence. - */ -void ITTAPI __itt_heap_allocate_end(__itt_heap_function h, void** addr, size_t size, int initialized); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void** addr, size_t size, int initialized)) -#define __itt_heap_allocate_end ITTNOTIFY_VOID(heap_allocate_end) -#define __itt_heap_allocate_end_ptr ITTNOTIFY_NAME(heap_allocate_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_allocate_end(h, addr, size, initialized) -#define __itt_heap_allocate_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_allocate_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record a free begin occurrence. - */ -void ITTAPI __itt_heap_free_begin(__itt_heap_function h, void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr)) -#define __itt_heap_free_begin ITTNOTIFY_VOID(heap_free_begin) -#define __itt_heap_free_begin_ptr ITTNOTIFY_NAME(heap_free_begin) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_free_begin(h, addr) -#define __itt_heap_free_begin_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_free_begin_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record a free end occurrence. - */ -void ITTAPI __itt_heap_free_end(__itt_heap_function h, void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr)) -#define __itt_heap_free_end ITTNOTIFY_VOID(heap_free_end) -#define __itt_heap_free_end_ptr ITTNOTIFY_NAME(heap_free_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_free_end(h, addr) -#define __itt_heap_free_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_free_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record a reallocation begin occurrence. - */ -void ITTAPI __itt_heap_reallocate_begin(__itt_heap_function h, void* addr, size_t new_size, int initialized); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized)) -#define __itt_heap_reallocate_begin ITTNOTIFY_VOID(heap_reallocate_begin) -#define __itt_heap_reallocate_begin_ptr ITTNOTIFY_NAME(heap_reallocate_begin) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_reallocate_begin(h, addr, new_size, initialized) -#define __itt_heap_reallocate_begin_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_reallocate_begin_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record a reallocation end occurrence. - */ -void ITTAPI __itt_heap_reallocate_end(__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized)) -#define __itt_heap_reallocate_end ITTNOTIFY_VOID(heap_reallocate_end) -#define __itt_heap_reallocate_end_ptr ITTNOTIFY_NAME(heap_reallocate_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_reallocate_end(h, addr, new_addr, new_size, initialized) -#define __itt_heap_reallocate_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_reallocate_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief internal access begin */ -void ITTAPI __itt_heap_internal_access_begin(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void)) -#define __itt_heap_internal_access_begin ITTNOTIFY_VOID(heap_internal_access_begin) -#define __itt_heap_internal_access_begin_ptr ITTNOTIFY_NAME(heap_internal_access_begin) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_internal_access_begin() -#define __itt_heap_internal_access_begin_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_internal_access_begin_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief internal access end */ -void ITTAPI __itt_heap_internal_access_end(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void)) -#define __itt_heap_internal_access_end ITTNOTIFY_VOID(heap_internal_access_end) -#define __itt_heap_internal_access_end_ptr ITTNOTIFY_NAME(heap_internal_access_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_internal_access_end() -#define __itt_heap_internal_access_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_internal_access_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief record memory growth begin */ -void ITTAPI __itt_heap_record_memory_growth_begin(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void)) -#define __itt_heap_record_memory_growth_begin ITTNOTIFY_VOID(heap_record_memory_growth_begin) -#define __itt_heap_record_memory_growth_begin_ptr ITTNOTIFY_NAME(heap_record_memory_growth_begin) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_record_memory_growth_begin() -#define __itt_heap_record_memory_growth_begin_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_record_memory_growth_begin_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief record memory growth end */ -void ITTAPI __itt_heap_record_memory_growth_end(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void)) -#define __itt_heap_record_memory_growth_end ITTNOTIFY_VOID(heap_record_memory_growth_end) -#define __itt_heap_record_memory_growth_end_ptr ITTNOTIFY_NAME(heap_record_memory_growth_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_record_memory_growth_end() -#define __itt_heap_record_memory_growth_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_record_memory_growth_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Specify the type of heap detection/reporting to modify. - */ -/** - * @hideinitializer - * @brief Report on memory leaks. - */ -#define __itt_heap_leaks 0x00000001 - -/** - * @hideinitializer - * @brief Report on memory growth. - */ -#define __itt_heap_growth 0x00000002 - - -/** @brief heap reset detection */ -void ITTAPI __itt_heap_reset_detection(unsigned int reset_mask); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask)) -#define __itt_heap_reset_detection ITTNOTIFY_VOID(heap_reset_detection) -#define __itt_heap_reset_detection_ptr ITTNOTIFY_NAME(heap_reset_detection) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_reset_detection() -#define __itt_heap_reset_detection_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_reset_detection_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief report */ -void ITTAPI __itt_heap_record(unsigned int record_mask); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask)) -#define __itt_heap_record ITTNOTIFY_VOID(heap_record) -#define __itt_heap_record_ptr ITTNOTIFY_NAME(heap_record) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_heap_record() -#define __itt_heap_record_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_heap_record_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @} heap group */ -/** @endcond */ -/* ========================================================================== */ - -/** - * @defgroup domains Domains - * @ingroup public - * Domains group - * @{ - */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_domain -{ - volatile int flags; /*!< Zero if disabled, non-zero if enabled. The meaning of different non-zero values is reserved to the runtime */ - const char* nameA; /*!< Copy of original name in ASCII. */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* nameW; /*!< Copy of original name in UNICODE. */ -#else /* UNICODE || _UNICODE */ - void* nameW; -#endif /* UNICODE || _UNICODE */ - int extra1; /*!< Reserved to the runtime */ - void* extra2; /*!< Reserved to the runtime */ - struct ___itt_domain* next; -} __itt_domain; - -#pragma pack(pop) -/** @endcond */ - -/** - * @ingroup domains - * @brief Create a domain. - * Create domain using some domain name: the URI naming style is recommended. - * Because the set of domains is expected to be static over the application's - * execution time, there is no mechanism to destroy a domain. - * Any domain can be accessed by any thread in the process, regardless of - * which thread created the domain. This call is thread-safe. - * @param[in] name name of domain - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_domain* ITTAPI __itt_domain_createA(const char *name); -__itt_domain* ITTAPI __itt_domain_createW(const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_domain_create __itt_domain_createW -# define __itt_domain_create_ptr __itt_domain_createW_ptr -#else /* UNICODE */ -# define __itt_domain_create __itt_domain_createA -# define __itt_domain_create_ptr __itt_domain_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_domain* ITTAPI __itt_domain_create(const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char *name)) -ITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_domain*, domain_create, (const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_domain_createA ITTNOTIFY_DATA(domain_createA) -#define __itt_domain_createA_ptr ITTNOTIFY_NAME(domain_createA) -#define __itt_domain_createW ITTNOTIFY_DATA(domain_createW) -#define __itt_domain_createW_ptr ITTNOTIFY_NAME(domain_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_domain_create ITTNOTIFY_DATA(domain_create) -#define __itt_domain_create_ptr ITTNOTIFY_NAME(domain_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_domain_createA(name) (__itt_domain*)0 -#define __itt_domain_createA_ptr 0 -#define __itt_domain_createW(name) (__itt_domain*)0 -#define __itt_domain_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_domain_create(name) (__itt_domain*)0 -#define __itt_domain_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_domain_createA_ptr 0 -#define __itt_domain_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_domain_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} domains group */ - -/** - * @defgroup ids IDs - * @ingroup public - * IDs group - * @{ - */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_id -{ - unsigned long long d1, d2, d3; -} __itt_id; - -#pragma pack(pop) -/** @endcond */ - -static const __itt_id __itt_null = { 0, 0, 0 }; - -/** - * @ingroup ids - * @brief A convenience function is provided to create an ID without domain control. - * @brief This is a convenience function to initialize an __itt_id structure. This function - * does not affect the collector runtime in any way. After you make the ID with this - * function, you still must create it with the __itt_id_create function before using the ID - * to identify a named entity. - * @param[in] addr The address of object; high QWORD of the ID value. - * @param[in] extra The extra data to unique identify object; low QWORD of the ID value. - */ - -ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE; -ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) -{ - __itt_id id = __itt_null; - id.d1 = (unsigned long long)((uintptr_t)addr); - id.d2 = (unsigned long long)extra; - id.d3 = (unsigned long long)0; /* Reserved. Must be zero */ - return id; -} - -/** - * @ingroup ids - * @brief Create an instance of identifier. - * This establishes the beginning of the lifetime of an instance of - * the given ID in the trace. Once this lifetime starts, the ID - * can be used to tag named entity instances in calls such as - * __itt_task_begin, and to specify relationships among - * identified named entity instances, using the \ref relations APIs. - * Instance IDs are not domain specific! - * @param[in] domain The domain controlling the execution of this call. - * @param[in] id The ID to create. - */ -void ITTAPI __itt_id_create(const __itt_domain *domain, __itt_id id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id)) -#define __itt_id_create(d,x) ITTNOTIFY_VOID_D1(id_create,d,x) -#define __itt_id_create_ptr ITTNOTIFY_NAME(id_create) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_id_create(domain,id) -#define __itt_id_create_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_id_create_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup ids - * @brief Destroy an instance of identifier. - * This ends the lifetime of the current instance of the given ID value in the trace. - * Any relationships that are established after this lifetime ends are invalid. - * This call must be performed before the given ID value can be reused for a different - * named entity instance. - * @param[in] domain The domain controlling the execution of this call. - * @param[in] id The ID to destroy. - */ -void ITTAPI __itt_id_destroy(const __itt_domain *domain, __itt_id id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id)) -#define __itt_id_destroy(d,x) ITTNOTIFY_VOID_D1(id_destroy,d,x) -#define __itt_id_destroy_ptr ITTNOTIFY_NAME(id_destroy) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_id_destroy(domain,id) -#define __itt_id_destroy_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_id_destroy_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} ids group */ - -/** - * @defgroup handless String Handles - * @ingroup public - * String Handles group - * @{ - */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_string_handle -{ - const char* strA; /*!< Copy of original string in ASCII. */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* strW; /*!< Copy of original string in UNICODE. */ -#else /* UNICODE || _UNICODE */ - void* strW; -#endif /* UNICODE || _UNICODE */ - int extra1; /*!< Reserved. Must be zero */ - void* extra2; /*!< Reserved. Must be zero */ - struct ___itt_string_handle* next; -} __itt_string_handle; - -#pragma pack(pop) -/** @endcond */ - -/** - * @ingroup handles - * @brief Create a string handle. - * Create and return handle value that can be associated with a string. - * Consecutive calls to __itt_string_handle_create with the same name - * return the same value. Because the set of string handles is expected to remain - * static during the application's execution time, there is no mechanism to destroy a string handle. - * Any string handle can be accessed by any thread in the process, regardless of which thread created - * the string handle. This call is thread-safe. - * @param[in] name The input string - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_string_handle* ITTAPI __itt_string_handle_createA(const char *name); -__itt_string_handle* ITTAPI __itt_string_handle_createW(const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_string_handle_create __itt_string_handle_createW -# define __itt_string_handle_create_ptr __itt_string_handle_createW_ptr -#else /* UNICODE */ -# define __itt_string_handle_create __itt_string_handle_createA -# define __itt_string_handle_create_ptr __itt_string_handle_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_string_handle* ITTAPI __itt_string_handle_create(const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char *name)) -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create, (const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_string_handle_createA ITTNOTIFY_DATA(string_handle_createA) -#define __itt_string_handle_createA_ptr ITTNOTIFY_NAME(string_handle_createA) -#define __itt_string_handle_createW ITTNOTIFY_DATA(string_handle_createW) -#define __itt_string_handle_createW_ptr ITTNOTIFY_NAME(string_handle_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_string_handle_create ITTNOTIFY_DATA(string_handle_create) -#define __itt_string_handle_create_ptr ITTNOTIFY_NAME(string_handle_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_string_handle_createA(name) (__itt_string_handle*)0 -#define __itt_string_handle_createA_ptr 0 -#define __itt_string_handle_createW(name) (__itt_string_handle*)0 -#define __itt_string_handle_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_string_handle_create(name) (__itt_string_handle*)0 -#define __itt_string_handle_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_string_handle_createA_ptr 0 -#define __itt_string_handle_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_string_handle_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} handles group */ - -/** @cond exclude_from_documentation */ -typedef unsigned long long __itt_timestamp; -/** @endcond */ - -#define __itt_timestamp_none ((__itt_timestamp)-1LL) - -/** @cond exclude_from_gpa_documentation */ - -/** - * @ingroup timestamps - * @brief Return timestamp corresponding to the current moment. - * This returns the timestamp in the format that is the most relevant for the current - * host or platform (RDTSC, QPC, and others). You can use the "<" operator to - * compare __itt_timestamp values. - */ -__itt_timestamp ITTAPI __itt_get_timestamp(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void)) -#define __itt_get_timestamp ITTNOTIFY_DATA(get_timestamp) -#define __itt_get_timestamp_ptr ITTNOTIFY_NAME(get_timestamp) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_get_timestamp() -#define __itt_get_timestamp_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_get_timestamp_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} timestamps */ -/** @endcond */ - -/** @cond exclude_from_gpa_documentation */ - -/** - * @defgroup regions Regions - * @ingroup public - * Regions group - * @{ - */ -/** - * @ingroup regions - * @brief Begin of region instance. - * Successive calls to __itt_region_begin with the same ID are ignored - * until a call to __itt_region_end with the same ID - * @param[in] domain The domain for this region instance - * @param[in] id The instance ID for this region instance. Must not be __itt_null - * @param[in] parentid The instance ID for the parent of this region instance, or __itt_null - * @param[in] name The name of this region - */ -void ITTAPI __itt_region_begin(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name); - -/** - * @ingroup regions - * @brief End of region instance. - * The first call to __itt_region_end with a given ID ends the - * region. Successive calls with the same ID are ignored, as are - * calls that do not have a matching __itt_region_begin call. - * @param[in] domain The domain for this region instance - * @param[in] id The instance ID for this region instance - */ -void ITTAPI __itt_region_end(const __itt_domain *domain, __itt_id id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, region_end, (const __itt_domain *domain, __itt_id id)) -#define __itt_region_begin(d,x,y,z) ITTNOTIFY_VOID_D3(region_begin,d,x,y,z) -#define __itt_region_begin_ptr ITTNOTIFY_NAME(region_begin) -#define __itt_region_end(d,x) ITTNOTIFY_VOID_D1(region_end,d,x) -#define __itt_region_end_ptr ITTNOTIFY_NAME(region_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_region_begin(d,x,y,z) -#define __itt_region_begin_ptr 0 -#define __itt_region_end(d,x) -#define __itt_region_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_region_begin_ptr 0 -#define __itt_region_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} regions group */ - -/** - * @defgroup frames Frames - * @ingroup public - * Frames are similar to regions, but are intended to be easier to use and to implement. - * In particular: - * - Frames always represent periods of elapsed time - * - By default, frames have no nesting relationships - * @{ - */ - -/** - * @ingroup frames - * @brief Begin a frame instance. - * Successive calls to __itt_frame_begin with the - * same ID are ignored until a call to __itt_frame_end with the same ID. - * @param[in] domain The domain for this frame instance - * @param[in] id The instance ID for this frame instance or NULL - */ -void ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id); - -/** - * @ingroup frames - * @brief End a frame instance. - * The first call to __itt_frame_end with a given ID - * ends the frame. Successive calls with the same ID are ignored, as are - * calls that do not have a matching __itt_frame_begin call. - * @param[in] domain The domain for this frame instance - * @param[in] id The instance ID for this frame instance or NULL for current - */ -void ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id); - -/** - * @ingroup frames - * @brief Submits a frame instance. - * Successive calls to __itt_frame_begin or __itt_frame_submit with the - * same ID are ignored until a call to __itt_frame_end or __itt_frame_submit - * with the same ID. - * Passing special __itt_timestamp_none value as "end" argument means - * take the current timestamp as the end timestamp. - * @param[in] domain The domain for this frame instance - * @param[in] id The instance ID for this frame instance or NULL - * @param[in] begin Timestamp of the beginning of the frame - * @param[in] end Timestamp of the end of the frame - */ -void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id, - __itt_timestamp begin, __itt_timestamp end); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id)) -ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id)) -ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end)) -#define __itt_frame_begin_v3(d,x) ITTNOTIFY_VOID_D1(frame_begin_v3,d,x) -#define __itt_frame_begin_v3_ptr ITTNOTIFY_NAME(frame_begin_v3) -#define __itt_frame_end_v3(d,x) ITTNOTIFY_VOID_D1(frame_end_v3,d,x) -#define __itt_frame_end_v3_ptr ITTNOTIFY_NAME(frame_end_v3) -#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e) -#define __itt_frame_submit_v3_ptr ITTNOTIFY_NAME(frame_submit_v3) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_frame_begin_v3(domain,id) -#define __itt_frame_begin_v3_ptr 0 -#define __itt_frame_end_v3(domain,id) -#define __itt_frame_end_v3_ptr 0 -#define __itt_frame_submit_v3(domain,id,begin,end) -#define __itt_frame_submit_v3_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_frame_begin_v3_ptr 0 -#define __itt_frame_end_v3_ptr 0 -#define __itt_frame_submit_v3_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} frames group */ -/** @endcond */ - -/** - * @defgroup taskgroup Task Group - * @ingroup public - * Task Group - * @{ - */ -/** - * @ingroup task_groups - * @brief Denotes a task_group instance. - * Successive calls to __itt_task_group with the same ID are ignored. - * @param[in] domain The domain for this task_group instance - * @param[in] id The instance ID for this task_group instance. Must not be __itt_null. - * @param[in] parentid The instance ID for the parent of this task_group instance, or __itt_null. - * @param[in] name The name of this task_group - */ -void ITTAPI __itt_task_group(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name)) -#define __itt_task_group(d,x,y,z) ITTNOTIFY_VOID_D3(task_group,d,x,y,z) -#define __itt_task_group_ptr ITTNOTIFY_NAME(task_group) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_task_group(d,x,y,z) -#define __itt_task_group_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_task_group_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} taskgroup group */ - -/** - * @defgroup tasks Tasks - * @ingroup public - * A task instance represents a piece of work performed by a particular - * thread for a period of time. A call to __itt_task_begin creates a - * task instance. This becomes the current instance for that task on that - * thread. A following call to __itt_task_end on the same thread ends the - * instance. There may be multiple simultaneous instances of tasks with the - * same name on different threads. If an ID is specified, the task instance - * receives that ID. Nested tasks are allowed. - * - * Note: The task is defined by the bracketing of __itt_task_begin and - * __itt_task_end on the same thread. If some scheduling mechanism causes - * task switching (the thread executes a different user task) or task - * switching (the user task switches to a different thread) then this breaks - * the notion of current instance. Additional API calls are required to - * deal with that possibility. - * @{ - */ - -/** - * @ingroup tasks - * @brief Begin a task instance. - * @param[in] domain The domain for this task - * @param[in] taskid The instance ID for this task instance, or __itt_null - * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null - * @param[in] name The name of this task - */ -void ITTAPI __itt_task_begin(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name); - -/** - * @ingroup tasks - * @brief Begin a task instance. - * @param[in] domain The domain for this task - * @param[in] taskid The identifier for this task instance (may be 0) - * @param[in] parentid The parent of this task (may be 0) - * @param[in] fn The pointer to the function you are tracing - */ -void ITTAPI __itt_task_begin_fn(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, void* fn); - -/** - * @ingroup tasks - * @brief End the current task instance. - * @param[in] domain The domain for this task - */ -void ITTAPI __itt_task_end(const __itt_domain *domain); - -/** - * @ingroup tasks - * @brief Begin an overlapped task instance. - * @param[in] domain The domain for this task. - * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null. - * @param[in] parentid The parent of this task, or __itt_null. - * @param[in] name The name of this task. - */ -void ITTAPI __itt_task_begin_overlapped(const __itt_domain* domain, __itt_id taskid, __itt_id parentid, __itt_string_handle* name); - -/** - * @ingroup tasks - * @brief End an overlapped task instance. - * @param[in] domain The domain for this task - * @param[in] taskid Explicit ID of finished task - */ -void ITTAPI __itt_task_end_overlapped(const __itt_domain *domain, __itt_id taskid); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, task_begin, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parentid, void* fn)) -ITT_STUBV(ITTAPI, void, task_end, (const __itt_domain *domain)) -ITT_STUBV(ITTAPI, void, task_begin_overlapped, (const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, task_end_overlapped, (const __itt_domain *domain, __itt_id taskid)) -#define __itt_task_begin(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin,d,x,y,z) -#define __itt_task_begin_ptr ITTNOTIFY_NAME(task_begin) -#define __itt_task_begin_fn(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin_fn,d,x,y,z) -#define __itt_task_begin_fn_ptr ITTNOTIFY_NAME(task_begin_fn) -#define __itt_task_end(d) ITTNOTIFY_VOID_D0(task_end,d) -#define __itt_task_end_ptr ITTNOTIFY_NAME(task_end) -#define __itt_task_begin_overlapped(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin_overlapped,d,x,y,z) -#define __itt_task_begin_overlapped_ptr ITTNOTIFY_NAME(task_begin_overlapped) -#define __itt_task_end_overlapped(d,x) ITTNOTIFY_VOID_D1(task_end_overlapped,d,x) -#define __itt_task_end_overlapped_ptr ITTNOTIFY_NAME(task_end_overlapped) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_task_begin(domain,id,parentid,name) -#define __itt_task_begin_ptr 0 -#define __itt_task_begin_fn(domain,id,parentid,fn) -#define __itt_task_begin_fn_ptr 0 -#define __itt_task_end(domain) -#define __itt_task_end_ptr 0 -#define __itt_task_begin_overlapped(domain,taskid,parentid,name) -#define __itt_task_begin_overlapped_ptr 0 -#define __itt_task_end_overlapped(domain,taskid) -#define __itt_task_end_overlapped_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_task_begin_ptr 0 -#define __itt_task_begin_fn_ptr 0 -#define __itt_task_end_ptr 0 -#define __itt_task_begin_overlapped_ptr 0 -#define __itt_task_end_overlapped_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} tasks group */ - - -/** - * @defgroup markers Markers - * Markers represent a single discrete event in time. Markers have a scope, - * described by an enumerated type __itt_scope. Markers are created by - * the API call __itt_marker. A marker instance can be given an ID for use in - * adding metadata. - * @{ - */ - -/** - * @brief Describes the scope of an event object in the trace. - */ -typedef enum -{ - __itt_scope_unknown = 0, - __itt_scope_global, - __itt_scope_track_group, - __itt_scope_track, - __itt_scope_task, - __itt_scope_marker -} __itt_scope; - -/** @cond exclude_from_documentation */ -#define __itt_marker_scope_unknown __itt_scope_unknown -#define __itt_marker_scope_global __itt_scope_global -#define __itt_marker_scope_process __itt_scope_track_group -#define __itt_marker_scope_thread __itt_scope_track -#define __itt_marker_scope_task __itt_scope_task -/** @endcond */ - -/** - * @ingroup markers - * @brief Create a marker instance - * @param[in] domain The domain for this marker - * @param[in] id The instance ID for this marker or __itt_null - * @param[in] name The name for this marker - * @param[in] scope The scope for this marker - */ -void ITTAPI __itt_marker(const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope)) -#define __itt_marker(d,x,y,z) ITTNOTIFY_VOID_D3(marker,d,x,y,z) -#define __itt_marker_ptr ITTNOTIFY_NAME(marker) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_marker(domain,id,name,scope) -#define __itt_marker_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_marker_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} markers group */ - -/** - * @defgroup metadata Metadata - * The metadata API is used to attach extra information to named - * entities. Metadata can be attached to an identified named entity by ID, - * or to the current entity (which is always a task). - * - * Conceptually metadata has a type (what kind of metadata), a key (the - * name of the metadata), and a value (the actual data). The encoding of - * the value depends on the type of the metadata. - * - * The type of metadata is specified by an enumerated type __itt_metdata_type. - * @{ - */ - -/** - * @ingroup parameters - * @brief describes the type of metadata - */ -typedef enum { - __itt_metadata_unknown = 0, - __itt_metadata_u64, /**< Unsigned 64-bit integer */ - __itt_metadata_s64, /**< Signed 64-bit integer */ - __itt_metadata_u32, /**< Unsigned 32-bit integer */ - __itt_metadata_s32, /**< Signed 32-bit integer */ - __itt_metadata_u16, /**< Unsigned 16-bit integer */ - __itt_metadata_s16, /**< Signed 16-bit integer */ - __itt_metadata_float, /**< Signed 32-bit floating-point */ - __itt_metadata_double /**< SIgned 64-bit floating-point */ -} __itt_metadata_type; - -/** - * @ingroup parameters - * @brief Add metadata to an instance of a named entity. - * @param[in] domain The domain controlling the call - * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task - * @param[in] key The name of the metadata - * @param[in] type The type of the metadata - * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added. - * @param[in] data The metadata itself -*/ -void ITTAPI __itt_metadata_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, metadata_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data)) -#define __itt_metadata_add(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add,d,x,y,z,a,b) -#define __itt_metadata_add_ptr ITTNOTIFY_NAME(metadata_add) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_metadata_add(d,x,y,z,a,b) -#define __itt_metadata_add_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_metadata_add_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup parameters - * @brief Add string metadata to an instance of a named entity. - * @param[in] domain The domain controlling the call - * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task - * @param[in] key The name of the metadata - * @param[in] data The metadata itself - * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_metadata_str_addA(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length); -void ITTAPI __itt_metadata_str_addW(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_metadata_str_add __itt_metadata_str_addW -# define __itt_metadata_str_add_ptr __itt_metadata_str_addW_ptr -#else /* UNICODE */ -# define __itt_metadata_str_add __itt_metadata_str_addA -# define __itt_metadata_str_add_ptr __itt_metadata_str_addA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_metadata_str_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length); -#endif - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length)) -ITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_addA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addA,d,x,y,z,a) -#define __itt_metadata_str_addA_ptr ITTNOTIFY_NAME(metadata_str_addA) -#define __itt_metadata_str_addW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addW,d,x,y,z,a) -#define __itt_metadata_str_addW_ptr ITTNOTIFY_NAME(metadata_str_addW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add,d,x,y,z,a) -#define __itt_metadata_str_add_ptr ITTNOTIFY_NAME(metadata_str_add) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_addA(d,x,y,z,a) -#define __itt_metadata_str_addA_ptr 0 -#define __itt_metadata_str_addW(d,x,y,z,a) -#define __itt_metadata_str_addW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add(d,x,y,z,a) -#define __itt_metadata_str_add_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_addA_ptr 0 -#define __itt_metadata_str_addW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup parameters - * @brief Add metadata to an instance of a named entity. - * @param[in] domain The domain controlling the call - * @param[in] scope The scope of the instance to which the metadata is to be added - - * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task - - * @param[in] key The name of the metadata - * @param[in] type The type of the metadata - * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added. - * @param[in] data The metadata itself -*/ -void ITTAPI __itt_metadata_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data)) -#define __itt_metadata_add_with_scope(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add_with_scope,d,x,y,z,a,b) -#define __itt_metadata_add_with_scope_ptr ITTNOTIFY_NAME(metadata_add_with_scope) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_metadata_add_with_scope(d,x,y,z,a,b) -#define __itt_metadata_add_with_scope_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_metadata_add_with_scope_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup parameters - * @brief Add string metadata to an instance of a named entity. - * @param[in] domain The domain controlling the call - * @param[in] scope The scope of the instance to which the metadata is to be added - - * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task - - * @param[in] key The name of the metadata - * @param[in] data The metadata itself - * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_metadata_str_add_with_scopeA(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length); -void ITTAPI __itt_metadata_str_add_with_scopeW(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_metadata_str_add_with_scope __itt_metadata_str_add_with_scopeW -# define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeW_ptr -#else /* UNICODE */ -# define __itt_metadata_str_add_with_scope __itt_metadata_str_add_with_scopeA -# define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_metadata_str_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length); -#endif - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length)) -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeA,d,x,y,z,a) -#define __itt_metadata_str_add_with_scopeA_ptr ITTNOTIFY_NAME(metadata_str_add_with_scopeA) -#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeW,d,x,y,z,a) -#define __itt_metadata_str_add_with_scopeW_ptr ITTNOTIFY_NAME(metadata_str_add_with_scopeW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add_with_scope(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scope,d,x,y,z,a) -#define __itt_metadata_str_add_with_scope_ptr ITTNOTIFY_NAME(metadata_str_add_with_scope) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a) -#define __itt_metadata_str_add_with_scopeA_ptr 0 -#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a) -#define __itt_metadata_str_add_with_scopeW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add_with_scope(d,x,y,z,a) -#define __itt_metadata_str_add_with_scope_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_metadata_str_add_with_scopeA_ptr 0 -#define __itt_metadata_str_add_with_scopeW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_metadata_str_add_with_scope_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @} metadata group */ - -/** - * @defgroup relations Relations - * Instances of named entities can be explicitly associated with other - * instances using instance IDs and the relationship API calls. - * - * @{ - */ - -/** - * @ingroup relations - * @brief The kind of relation between two instances is specified by the enumerated type __itt_relation. - * Relations between instances can be added with an API call. The relation - * API uses instance IDs. Relations can be added before or after the actual - * instances are created and persist independently of the instances. This - * is the motivation for having different lifetimes for instance IDs and - * the actual instances. - */ -typedef enum -{ - __itt_relation_is_unknown = 0, - __itt_relation_is_dependent_on, /**< "A is dependent on B" means that A cannot start until B completes */ - __itt_relation_is_sibling_of, /**< "A is sibling of B" means that A and B were created as a group */ - __itt_relation_is_parent_of, /**< "A is parent of B" means that A created B */ - __itt_relation_is_continuation_of, /**< "A is continuation of B" means that A assumes the dependencies of B */ - __itt_relation_is_child_of, /**< "A is child of B" means that A was created by B (inverse of is_parent_of) */ - __itt_relation_is_continued_by, /**< "A is continued by B" means that B assumes the dependencies of A (inverse of is_continuation_of) */ - __itt_relation_is_predecessor_to /**< "A is predecessor to B" means that B cannot start until A completes (inverse of is_dependent_on) */ -} __itt_relation; - -/** - * @ingroup relations - * @brief Add a relation to the current task instance. - * The current task instance is the head of the relation. - * @param[in] domain The domain controlling this call - * @param[in] relation The kind of relation - * @param[in] tail The ID for the tail of the relation - */ -void ITTAPI __itt_relation_add_to_current(const __itt_domain *domain, __itt_relation relation, __itt_id tail); - -/** - * @ingroup relations - * @brief Add a relation between two instance identifiers. - * @param[in] domain The domain controlling this call - * @param[in] head The ID for the head of the relation - * @param[in] relation The kind of relation - * @param[in] tail The ID for the tail of the relation - */ -void ITTAPI __itt_relation_add(const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail)) -ITT_STUBV(ITTAPI, void, relation_add, (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail)) -#define __itt_relation_add_to_current(d,x,y) ITTNOTIFY_VOID_D2(relation_add_to_current,d,x,y) -#define __itt_relation_add_to_current_ptr ITTNOTIFY_NAME(relation_add_to_current) -#define __itt_relation_add(d,x,y,z) ITTNOTIFY_VOID_D3(relation_add,d,x,y,z) -#define __itt_relation_add_ptr ITTNOTIFY_NAME(relation_add) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_relation_add_to_current(d,x,y) -#define __itt_relation_add_to_current_ptr 0 -#define __itt_relation_add(d,x,y,z) -#define __itt_relation_add_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_relation_add_to_current_ptr 0 -#define __itt_relation_add_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} relations group */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_clock_info -{ - unsigned long long clock_freq; /*!< Clock domain frequency */ - unsigned long long clock_base; /*!< Clock domain base timestamp */ -} __itt_clock_info; - -#pragma pack(pop) -/** @endcond */ - -/** @cond exclude_from_documentation */ -typedef void (ITTAPI *__itt_get_clock_info_fn)(__itt_clock_info* clock_info, void* data); -/** @endcond */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_clock_domain -{ - __itt_clock_info info; /*!< Most recent clock domain info */ - __itt_get_clock_info_fn fn; /*!< Callback function pointer */ - void* fn_data; /*!< Input argument for the callback function */ - int extra1; /*!< Reserved. Must be zero */ - void* extra2; /*!< Reserved. Must be zero */ - struct ___itt_clock_domain* next; -} __itt_clock_domain; - -#pragma pack(pop) -/** @endcond */ - -/** - * @ingroup clockdomains - * @brief Create a clock domain. - * Certain applications require the capability to trace their application using - * a clock domain different than the CPU, for instance the instrumentation of events - * that occur on a GPU. - * Because the set of domains is expected to be static over the application's execution time, - * there is no mechanism to destroy a domain. - * Any domain can be accessed by any thread in the process, regardless of which thread created - * the domain. This call is thread-safe. - * @param[in] fn A pointer to a callback function which retrieves alternative CPU timestamps - * @param[in] fn_data Argument for a callback function; may be NULL - */ -__itt_clock_domain* ITTAPI __itt_clock_domain_create(__itt_get_clock_info_fn fn, void* fn_data); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data)) -#define __itt_clock_domain_create ITTNOTIFY_DATA(clock_domain_create) -#define __itt_clock_domain_create_ptr ITTNOTIFY_NAME(clock_domain_create) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_clock_domain_create(fn,fn_data) (__itt_clock_domain*)0 -#define __itt_clock_domain_create_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_clock_domain_create_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup clockdomains - * @brief Recalculate clock domains frequencies and clock base timestamps. - */ -void ITTAPI __itt_clock_domain_reset(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, clock_domain_reset, (void)) -#define __itt_clock_domain_reset ITTNOTIFY_VOID(clock_domain_reset) -#define __itt_clock_domain_reset_ptr ITTNOTIFY_NAME(clock_domain_reset) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_clock_domain_reset() -#define __itt_clock_domain_reset_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_clock_domain_reset_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup clockdomain - * @brief Create an instance of identifier. This establishes the beginning of the lifetime of - * an instance of the given ID in the trace. Once this lifetime starts, the ID can be used to - * tag named entity instances in calls such as __itt_task_begin, and to specify relationships among - * identified named entity instances, using the \ref relations APIs. - * @param[in] domain The domain controlling the execution of this call. - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] id The ID to create. - */ -void ITTAPI __itt_id_create_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id); - -/** - * @ingroup clockdomain - * @brief Destroy an instance of identifier. This ends the lifetime of the current instance of the - * given ID value in the trace. Any relationships that are established after this lifetime ends are - * invalid. This call must be performed before the given ID value can be reused for a different - * named entity instance. - * @param[in] domain The domain controlling the execution of this call. - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] id The ID to destroy. - */ -void ITTAPI __itt_id_destroy_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, id_create_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id)) -ITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id)) -#define __itt_id_create_ex(d,x,y,z) ITTNOTIFY_VOID_D3(id_create_ex,d,x,y,z) -#define __itt_id_create_ex_ptr ITTNOTIFY_NAME(id_create_ex) -#define __itt_id_destroy_ex(d,x,y,z) ITTNOTIFY_VOID_D3(id_destroy_ex,d,x,y,z) -#define __itt_id_destroy_ex_ptr ITTNOTIFY_NAME(id_destroy_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_id_create_ex(domain,clock_domain,timestamp,id) -#define __itt_id_create_ex_ptr 0 -#define __itt_id_destroy_ex(domain,clock_domain,timestamp,id) -#define __itt_id_destroy_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_id_create_ex_ptr 0 -#define __itt_id_destroy_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup clockdomain - * @brief Begin a task instance. - * @param[in] domain The domain for this task - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] taskid The instance ID for this task instance, or __itt_null - * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null - * @param[in] name The name of this task - */ -void ITTAPI __itt_task_begin_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name); - -/** - * @ingroup clockdomain - * @brief Begin a task instance. - * @param[in] domain The domain for this task - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] taskid The identifier for this task instance, or __itt_null - * @param[in] parentid The parent of this task, or __itt_null - * @param[in] fn The pointer to the function you are tracing - */ -void ITTAPI __itt_task_begin_fn_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, void* fn); - -/** - * @ingroup clockdomain - * @brief End the current task instance. - * @param[in] domain The domain for this task - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - */ -void ITTAPI __itt_task_end_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, task_begin_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, task_begin_fn_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn)) -ITT_STUBV(ITTAPI, void, task_end_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp)) -#define __itt_task_begin_ex(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(task_begin_ex,d,x,y,z,a,b) -#define __itt_task_begin_ex_ptr ITTNOTIFY_NAME(task_begin_ex) -#define __itt_task_begin_fn_ex(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(task_begin_fn_ex,d,x,y,z,a,b) -#define __itt_task_begin_fn_ex_ptr ITTNOTIFY_NAME(task_begin_fn_ex) -#define __itt_task_end_ex(d,x,y) ITTNOTIFY_VOID_D2(task_end_ex,d,x,y) -#define __itt_task_end_ex_ptr ITTNOTIFY_NAME(task_end_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_task_begin_ex(domain,clock_domain,timestamp,id,parentid,name) -#define __itt_task_begin_ex_ptr 0 -#define __itt_task_begin_fn_ex(domain,clock_domain,timestamp,id,parentid,fn) -#define __itt_task_begin_fn_ex_ptr 0 -#define __itt_task_end_ex(domain,clock_domain,timestamp) -#define __itt_task_end_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_task_begin_ex_ptr 0 -#define __itt_task_begin_fn_ex_ptr 0 -#define __itt_task_end_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @defgroup counters Counters - * @ingroup public - * Counters are user-defined objects with a monotonically increasing - * value. Counter values are 64-bit unsigned integers. - * Counters have names that can be displayed in - * the tools. - * @{ - */ - -/** - * @brief opaque structure for counter identification - */ -/** @cond exclude_from_documentation */ - -typedef struct ___itt_counter* __itt_counter; - -/** - * @brief Create an unsigned 64 bits integer counter with given name/domain - * - * After __itt_counter_create() is called, __itt_counter_inc(id), __itt_counter_inc_delta(id, delta), - * __itt_counter_set_value(id, value_ptr) or __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr) - * can be used to change the value of the counter, where value_ptr is a pointer to an unsigned 64 bits integer - * - * The call is equal to __itt_counter_create_typed(name, domain, __itt_metadata_u64) - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_counter ITTAPI __itt_counter_createA(const char *name, const char *domain); -__itt_counter ITTAPI __itt_counter_createW(const wchar_t *name, const wchar_t *domain); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_counter_create __itt_counter_createW -# define __itt_counter_create_ptr __itt_counter_createW_ptr -#else /* UNICODE */ -# define __itt_counter_create __itt_counter_createA -# define __itt_counter_create_ptr __itt_counter_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_counter ITTAPI __itt_counter_create(const char *name, const char *domain); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char *name, const char *domain)) -ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create, (const char *name, const char *domain)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA ITTNOTIFY_DATA(counter_createA) -#define __itt_counter_createA_ptr ITTNOTIFY_NAME(counter_createA) -#define __itt_counter_createW ITTNOTIFY_DATA(counter_createW) -#define __itt_counter_createW_ptr ITTNOTIFY_NAME(counter_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create ITTNOTIFY_DATA(counter_create) -#define __itt_counter_create_ptr ITTNOTIFY_NAME(counter_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA(name, domain) -#define __itt_counter_createA_ptr 0 -#define __itt_counter_createW(name, domain) -#define __itt_counter_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create(name, domain) -#define __itt_counter_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA_ptr 0 -#define __itt_counter_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Increment the unsigned 64 bits integer counter value - * - * Calling this function to non-unsigned 64 bits integer counters has no effect - */ -void ITTAPI __itt_counter_inc(__itt_counter id); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id)) -#define __itt_counter_inc ITTNOTIFY_VOID(counter_inc) -#define __itt_counter_inc_ptr ITTNOTIFY_NAME(counter_inc) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_inc(id) -#define __itt_counter_inc_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_inc_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** - * @brief Increment the unsigned 64 bits integer counter value with x - * - * Calling this function to non-unsigned 64 bits integer counters has no effect - */ -void ITTAPI __itt_counter_inc_delta(__itt_counter id, unsigned long long value); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value)) -#define __itt_counter_inc_delta ITTNOTIFY_VOID(counter_inc_delta) -#define __itt_counter_inc_delta_ptr ITTNOTIFY_NAME(counter_inc_delta) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_inc_delta(id, value) -#define __itt_counter_inc_delta_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_inc_delta_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Decrement the unsigned 64 bits integer counter value - * - * Calling this function to non-unsigned 64 bits integer counters has no effect - */ -void ITTAPI __itt_counter_dec(__itt_counter id); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_dec, (__itt_counter id)) -#define __itt_counter_dec ITTNOTIFY_VOID(counter_dec) -#define __itt_counter_dec_ptr ITTNOTIFY_NAME(counter_dec) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_dec(id) -#define __itt_counter_dec_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_dec_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** - * @brief Decrement the unsigned 64 bits integer counter value with x - * - * Calling this function to non-unsigned 64 bits integer counters has no effect - */ -void ITTAPI __itt_counter_dec_delta(__itt_counter id, unsigned long long value); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_dec_delta, (__itt_counter id, unsigned long long value)) -#define __itt_counter_dec_delta ITTNOTIFY_VOID(counter_dec_delta) -#define __itt_counter_dec_delta_ptr ITTNOTIFY_NAME(counter_dec_delta) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_dec_delta(id, value) -#define __itt_counter_dec_delta_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_dec_delta_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup counters - * @brief Increment a counter by one. - * The first call with a given name creates a counter by that name and sets its - * value to zero. Successive calls increment the counter value. - * @param[in] domain The domain controlling the call. Counter names are not domain specific. - * The domain argument is used only to enable or disable the API calls. - * @param[in] name The name of the counter - */ -void ITTAPI __itt_counter_inc_v3(const __itt_domain *domain, __itt_string_handle *name); - -/** - * @ingroup counters - * @brief Increment a counter by the value specified in delta. - * @param[in] domain The domain controlling the call. Counter names are not domain specific. - * The domain argument is used only to enable or disable the API calls. - * @param[in] name The name of the counter - * @param[in] delta The amount by which to increment the counter - */ -void ITTAPI __itt_counter_inc_delta_v3(const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_inc_v3, (const __itt_domain *domain, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta)) -#define __itt_counter_inc_v3(d,x) ITTNOTIFY_VOID_D1(counter_inc_v3,d,x) -#define __itt_counter_inc_v3_ptr ITTNOTIFY_NAME(counter_inc_v3) -#define __itt_counter_inc_delta_v3(d,x,y) ITTNOTIFY_VOID_D2(counter_inc_delta_v3,d,x,y) -#define __itt_counter_inc_delta_v3_ptr ITTNOTIFY_NAME(counter_inc_delta_v3) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_inc_v3(domain,name) -#define __itt_counter_inc_v3_ptr 0 -#define __itt_counter_inc_delta_v3(domain,name,delta) -#define __itt_counter_inc_delta_v3_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_inc_v3_ptr 0 -#define __itt_counter_inc_delta_v3_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - - -/** - * @ingroup counters - * @brief Decrement a counter by one. - * The first call with a given name creates a counter by that name and sets its - * value to zero. Successive calls decrement the counter value. - * @param[in] domain The domain controlling the call. Counter names are not domain specific. - * The domain argument is used only to enable or disable the API calls. - * @param[in] name The name of the counter - */ -void ITTAPI __itt_counter_dec_v3(const __itt_domain *domain, __itt_string_handle *name); - -/** - * @ingroup counters - * @brief Decrement a counter by the value specified in delta. - * @param[in] domain The domain controlling the call. Counter names are not domain specific. - * The domain argument is used only to enable or disable the API calls. - * @param[in] name The name of the counter - * @param[in] delta The amount by which to decrement the counter - */ -void ITTAPI __itt_counter_dec_delta_v3(const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_dec_v3, (const __itt_domain *domain, __itt_string_handle *name)) -ITT_STUBV(ITTAPI, void, counter_dec_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta)) -#define __itt_counter_dec_v3(d,x) ITTNOTIFY_VOID_D1(counter_dec_v3,d,x) -#define __itt_counter_dec_v3_ptr ITTNOTIFY_NAME(counter_dec_v3) -#define __itt_counter_dec_delta_v3(d,x,y) ITTNOTIFY_VOID_D2(counter_dec_delta_v3,d,x,y) -#define __itt_counter_dec_delta_v3_ptr ITTNOTIFY_NAME(counter_dec_delta_v3) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_dec_v3(domain,name) -#define __itt_counter_dec_v3_ptr 0 -#define __itt_counter_dec_delta_v3(domain,name,delta) -#define __itt_counter_dec_delta_v3_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_dec_v3_ptr 0 -#define __itt_counter_dec_delta_v3_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @} counters group */ - - -/** - * @brief Set the counter value - */ -void ITTAPI __itt_counter_set_value(__itt_counter id, void *value_ptr); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_set_value, (__itt_counter id, void *value_ptr)) -#define __itt_counter_set_value ITTNOTIFY_VOID(counter_set_value) -#define __itt_counter_set_value_ptr ITTNOTIFY_NAME(counter_set_value) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_set_value(id, value_ptr) -#define __itt_counter_set_value_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_set_value_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Set the counter value - */ -void ITTAPI __itt_counter_set_value_ex(__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_set_value_ex, (__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr)) -#define __itt_counter_set_value_ex ITTNOTIFY_VOID(counter_set_value_ex) -#define __itt_counter_set_value_ex_ptr ITTNOTIFY_NAME(counter_set_value_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr) -#define __itt_counter_set_value_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_set_value_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Create a typed counter with given name/domain - * - * After __itt_counter_create_typed() is called, __itt_counter_inc(id), __itt_counter_inc_delta(id, delta), - * __itt_counter_set_value(id, value_ptr) or __itt_counter_set_value_ex(id, clock_domain, timestamp, value_ptr) - * can be used to change the value of the counter - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_counter ITTAPI __itt_counter_create_typedA(const char *name, const char *domain, __itt_metadata_type type); -__itt_counter ITTAPI __itt_counter_create_typedW(const wchar_t *name, const wchar_t *domain, __itt_metadata_type type); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_counter_create_typed __itt_counter_create_typedW -# define __itt_counter_create_typed_ptr __itt_counter_create_typedW_ptr -#else /* UNICODE */ -# define __itt_counter_create_typed __itt_counter_create_typedA -# define __itt_counter_create_typed_ptr __itt_counter_create_typedA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_counter ITTAPI __itt_counter_create_typed(const char *name, const char *domain, __itt_metadata_type type); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_create_typedA, (const char *name, const char *domain, __itt_metadata_type type)) -ITT_STUB(ITTAPI, __itt_counter, counter_create_typedW, (const wchar_t *name, const wchar_t *domain, __itt_metadata_type type)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create_typed, (const char *name, const char *domain, __itt_metadata_type type)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_create_typedA ITTNOTIFY_DATA(counter_create_typedA) -#define __itt_counter_create_typedA_ptr ITTNOTIFY_NAME(counter_create_typedA) -#define __itt_counter_create_typedW ITTNOTIFY_DATA(counter_create_typedW) -#define __itt_counter_create_typedW_ptr ITTNOTIFY_NAME(counter_create_typedW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_typed ITTNOTIFY_DATA(counter_create_typed) -#define __itt_counter_create_typed_ptr ITTNOTIFY_NAME(counter_create_typed) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_create_typedA(name, domain, type) -#define __itt_counter_create_typedA_ptr 0 -#define __itt_counter_create_typedW(name, domain, type) -#define __itt_counter_create_typedW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_typed(name, domain, type) -#define __itt_counter_create_typed_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_create_typedA_ptr 0 -#define __itt_counter_create_typedW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_typed_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Destroy the counter identified by the pointer previously returned by __itt_counter_create() or - * __itt_counter_create_typed() - */ -void ITTAPI __itt_counter_destroy(__itt_counter id); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id)) -#define __itt_counter_destroy ITTNOTIFY_VOID(counter_destroy) -#define __itt_counter_destroy_ptr ITTNOTIFY_NAME(counter_destroy) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_destroy(id) -#define __itt_counter_destroy_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_destroy_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} counters group */ - -/** - * @ingroup markers - * @brief Create a marker instance. - * @param[in] domain The domain for this marker - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] id The instance ID for this marker, or __itt_null - * @param[in] name The name for this marker - * @param[in] scope The scope for this marker - */ -void ITTAPI __itt_marker_ex(const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, marker_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope)) -#define __itt_marker_ex(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(marker_ex,d,x,y,z,a,b) -#define __itt_marker_ex_ptr ITTNOTIFY_NAME(marker_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_marker_ex(domain,clock_domain,timestamp,id,name,scope) -#define __itt_marker_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_marker_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @ingroup clockdomain - * @brief Add a relation to the current task instance. - * The current task instance is the head of the relation. - * @param[in] domain The domain controlling this call - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] relation The kind of relation - * @param[in] tail The ID for the tail of the relation - */ -void ITTAPI __itt_relation_add_to_current_ex(const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail); - -/** - * @ingroup clockdomain - * @brief Add a relation between two instance identifiers. - * @param[in] domain The domain controlling this call - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] head The ID for the head of the relation - * @param[in] relation The kind of relation - * @param[in] tail The ID for the tail of the relation - */ -void ITTAPI __itt_relation_add_ex(const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail)) -ITT_STUBV(ITTAPI, void, relation_add_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail)) -#define __itt_relation_add_to_current_ex(d,x,y,z,a) ITTNOTIFY_VOID_D4(relation_add_to_current_ex,d,x,y,z,a) -#define __itt_relation_add_to_current_ex_ptr ITTNOTIFY_NAME(relation_add_to_current_ex) -#define __itt_relation_add_ex(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(relation_add_ex,d,x,y,z,a,b) -#define __itt_relation_add_ex_ptr ITTNOTIFY_NAME(relation_add_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_relation_add_to_current_ex(domain,clock_domain,timestame,relation,tail) -#define __itt_relation_add_to_current_ex_ptr 0 -#define __itt_relation_add_ex(domain,clock_domain,timestamp,head,relation,tail) -#define __itt_relation_add_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_relation_add_to_current_ex_ptr 0 -#define __itt_relation_add_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @cond exclude_from_documentation */ -typedef enum ___itt_track_group_type -{ - __itt_track_group_type_normal = 0 -} __itt_track_group_type; -/** @endcond */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_track_group -{ - __itt_string_handle* name; /*!< Name of the track group */ - struct ___itt_track* track; /*!< List of child tracks */ - __itt_track_group_type tgtype; /*!< Type of the track group */ - int extra1; /*!< Reserved. Must be zero */ - void* extra2; /*!< Reserved. Must be zero */ - struct ___itt_track_group* next; -} __itt_track_group; - -#pragma pack(pop) -/** @endcond */ - -/** - * @brief Placeholder for custom track types. Currently, "normal" custom track - * is the only available track type. - */ -typedef enum ___itt_track_type -{ - __itt_track_type_normal = 0 -#ifdef INTEL_ITTNOTIFY_API_PRIVATE - , __itt_track_type_queue -#endif /* INTEL_ITTNOTIFY_API_PRIVATE */ -} __itt_track_type; - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_track -{ - __itt_string_handle* name; /*!< Name of the track group */ - __itt_track_group* group; /*!< Parent group to a track */ - __itt_track_type ttype; /*!< Type of the track */ - int extra1; /*!< Reserved. Must be zero */ - void* extra2; /*!< Reserved. Must be zero */ - struct ___itt_track* next; -} __itt_track; - -#pragma pack(pop) -/** @endcond */ - -/** - * @brief Create logical track group. - */ -__itt_track_group* ITTAPI __itt_track_group_create(__itt_string_handle* name, __itt_track_group_type track_group_type); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type)) -#define __itt_track_group_create ITTNOTIFY_DATA(track_group_create) -#define __itt_track_group_create_ptr ITTNOTIFY_NAME(track_group_create) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_track_group_create(name) (__itt_track_group*)0 -#define __itt_track_group_create_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_track_group_create_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Create logical track. - */ -__itt_track* ITTAPI __itt_track_create(__itt_track_group* track_group, __itt_string_handle* name, __itt_track_type track_type); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_track*, track_create, (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type)) -#define __itt_track_create ITTNOTIFY_DATA(track_create) -#define __itt_track_create_ptr ITTNOTIFY_NAME(track_create) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_track_create(track_group,name,track_type) (__itt_track*)0 -#define __itt_track_create_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_track_create_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Set the logical track. - */ -void ITTAPI __itt_set_track(__itt_track* track); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, set_track, (__itt_track *track)) -#define __itt_set_track ITTNOTIFY_VOID(set_track) -#define __itt_set_track_ptr ITTNOTIFY_NAME(set_track) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_set_track(track) -#define __itt_set_track_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_set_track_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/* ========================================================================== */ -/** @cond exclude_from_gpa_documentation */ -/** - * @defgroup events Events - * @ingroup public - * Events group - * @{ - */ -/** @brief user event type */ -typedef int __itt_event; - -/** - * @brief Create an event notification - * @note name or namelen being null/name and namelen not matching, user event feature not enabled - * @return non-zero event identifier upon success and __itt_err otherwise - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_event LIBITTAPI __itt_event_createA(const char *name, int namelen); -__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_event_create __itt_event_createW -# define __itt_event_create_ptr __itt_event_createW_ptr -#else -# define __itt_event_create __itt_event_createA -# define __itt_event_create_ptr __itt_event_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen)) -ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA ITTNOTIFY_DATA(event_createA) -#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA) -#define __itt_event_createW ITTNOTIFY_DATA(event_createW) -#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create ITTNOTIFY_DATA(event_create) -#define __itt_event_create_ptr ITTNOTIFY_NAME(event_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA(name, namelen) (__itt_event)0 -#define __itt_event_createA_ptr 0 -#define __itt_event_createW(name, namelen) (__itt_event)0 -#define __itt_event_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create(name, namelen) (__itt_event)0 -#define __itt_event_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA_ptr 0 -#define __itt_event_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an event occurrence. - * @return __itt_err upon failure (invalid event id/user event feature not enabled) - */ -int LIBITTAPI __itt_event_start(__itt_event event); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event)) -#define __itt_event_start ITTNOTIFY_DATA(event_start) -#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_event_start(event) (int)0 -#define __itt_event_start_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_event_start_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an event end occurrence. - * @note It is optional if events do not have durations. - * @return __itt_err upon failure (invalid event id/user event feature not enabled) - */ -int LIBITTAPI __itt_event_end(__itt_event event); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event)) -#define __itt_event_end ITTNOTIFY_DATA(event_end) -#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_event_end(event) (int)0 -#define __itt_event_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_event_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} events group */ - - -/** - * @defgroup arrays Arrays Visualizer - * @ingroup public - * Visualize arrays - * @{ - */ - -/** - * @enum __itt_av_data_type - * @brief Defines types of arrays data (for C/C++ intrinsic types) - */ -typedef enum -{ - __itt_e_first = 0, - __itt_e_char = 0, /* 1-byte integer */ - __itt_e_uchar, /* 1-byte unsigned integer */ - __itt_e_int16, /* 2-byte integer */ - __itt_e_uint16, /* 2-byte unsigned integer */ - __itt_e_int32, /* 4-byte integer */ - __itt_e_uint32, /* 4-byte unsigned integer */ - __itt_e_int64, /* 8-byte integer */ - __itt_e_uint64, /* 8-byte unsigned integer */ - __itt_e_float, /* 4-byte floating */ - __itt_e_double, /* 8-byte floating */ - __itt_e_last = __itt_e_double -} __itt_av_data_type; - -/** - * @brief Save an array data to a file. - * Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only). - * @param[in] data - pointer to the array data - * @param[in] rank - the rank of the array - * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions. - * The size of dimensions must be equal to the rank - * @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types) - * @param[in] filePath - the file path; the output format is defined by the file extension - * @param[in] columnOrder - defines how the array is stored in the linear memory. - * It should be 1 for column-major order (e.g. in FORTRAN) or 0 - for row-major order (e.g. in C). - */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -int ITTAPI __itt_av_saveA(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder); -int ITTAPI __itt_av_saveW(void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_av_save __itt_av_saveW -# define __itt_av_save_ptr __itt_av_saveW_ptr -#else /* UNICODE */ -# define __itt_av_save __itt_av_saveA -# define __itt_av_save_ptr __itt_av_saveA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -int ITTAPI __itt_av_save(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder)) -ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_av_saveA ITTNOTIFY_DATA(av_saveA) -#define __itt_av_saveA_ptr ITTNOTIFY_NAME(av_saveA) -#define __itt_av_saveW ITTNOTIFY_DATA(av_saveW) -#define __itt_av_saveW_ptr ITTNOTIFY_NAME(av_saveW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_av_save ITTNOTIFY_DATA(av_save) -#define __itt_av_save_ptr ITTNOTIFY_NAME(av_save) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_av_saveA(name) -#define __itt_av_saveA_ptr 0 -#define __itt_av_saveW(name) -#define __itt_av_saveW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_av_save(name) -#define __itt_av_save_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_av_saveA_ptr 0 -#define __itt_av_saveW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_av_save_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -void ITTAPI __itt_enable_attach(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, enable_attach, (void)) -#define __itt_enable_attach ITTNOTIFY_VOID(enable_attach) -#define __itt_enable_attach_ptr ITTNOTIFY_NAME(enable_attach) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_enable_attach() -#define __itt_enable_attach_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_enable_attach_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @cond exclude_from_gpa_documentation */ - -/** @} arrays group */ - -/** @endcond */ - -/** - * @brief Module load notification - * This API is used to report necessary information in case of bypassing default system loader. - * Notification should be done immediately after this module is loaded to process memory. - * @param[in] start_addr - module start address - * @param[in] end_addr - module end address - * @param[in] path - file system full path to the module - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_module_loadA(void *start_addr, void *end_addr, const char *path); -void ITTAPI __itt_module_loadW(void *start_addr, void *end_addr, const wchar_t *path); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_module_load __itt_module_loadW -# define __itt_module_load_ptr __itt_module_loadW_ptr -#else /* UNICODE */ -# define __itt_module_load __itt_module_loadA -# define __itt_module_load_ptr __itt_module_loadA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_module_load(void *start_addr, void *end_addr, const char *path); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, void, module_loadA, (void *start_addr, void *end_addr, const char *path)) -ITT_STUB(ITTAPI, void, module_loadW, (void *start_addr, void *end_addr, const wchar_t *path)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, void, module_load, (void *start_addr, void *end_addr, const char *path)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_module_loadA ITTNOTIFY_VOID(module_loadA) -#define __itt_module_loadA_ptr ITTNOTIFY_NAME(module_loadA) -#define __itt_module_loadW ITTNOTIFY_VOID(module_loadW) -#define __itt_module_loadW_ptr ITTNOTIFY_NAME(module_loadW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_module_load ITTNOTIFY_VOID(module_load) -#define __itt_module_load_ptr ITTNOTIFY_NAME(module_load) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_module_loadA(start_addr, end_addr, path) -#define __itt_module_loadA_ptr 0 -#define __itt_module_loadW(start_addr, end_addr, path) -#define __itt_module_loadW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_module_load(start_addr, end_addr, path) -#define __itt_module_load_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_module_loadA_ptr 0 -#define __itt_module_loadW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_module_load_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Report module unload - * This API is used to report necessary information in case of bypassing default system loader. - * Notification should be done just before the module is unloaded from process memory. - * @param[in] addr - base address of loaded module - */ -void ITTAPI __itt_module_unload(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, module_unload, (void *addr)) -#define __itt_module_unload ITTNOTIFY_VOID(module_unload) -#define __itt_module_unload_ptr ITTNOTIFY_NAME(module_unload) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_module_unload(addr) -#define __itt_module_unload_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_module_unload_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @cond exclude_from_documentation */ -typedef enum -{ - __itt_module_type_unknown = 0, - __itt_module_type_elf, - __itt_module_type_coff -} __itt_module_type; -/** @endcond */ - -/** @cond exclude_from_documentation */ -typedef enum -{ - itt_section_type_unknown, - itt_section_type_bss, /* notifies that the section contains uninitialized data. These are the relevant section types and the modules that contain them: - * ELF module: SHT_NOBITS section type - * COFF module: IMAGE_SCN_CNT_UNINITIALIZED_DATA section type - */ - itt_section_type_data, /* notifies that section contains initialized data. These are the relevant section types and the modules that contain them: - * ELF module: SHT_PROGBITS section type - * COFF module: IMAGE_SCN_CNT_INITIALIZED_DATA section type - */ - itt_section_type_text /* notifies that the section contains executable code. These are the relevant section types and the modules that contain them: - * ELF module: SHT_PROGBITS section type - * COFF module: IMAGE_SCN_CNT_CODE section type - */ -} __itt_section_type; -/** @endcond */ - -/** - * @hideinitializer - * @brief bit-mask, detects a section attribute that indicates whether a section can be executed as code: - * These are the relevant section attributes and the modules that contain them: - * ELF module: PF_X section attribute - * COFF module: IMAGE_SCN_MEM_EXECUTE attribute - */ -#define __itt_section_exec 0x20000000 - -/** - * @hideinitializer - * @brief bit-mask, detects a section attribute that indicates whether a section can be read. - * These are the relevant section attributes and the modules that contain them: - * ELF module: PF_R attribute - * COFF module: IMAGE_SCN_MEM_READ attribute - */ -#define __itt_section_read 0x40000000 - -/** - * @hideinitializer - * @brief bit-mask, detects a section attribute that indicates whether a section can be written to. - * These are the relevant section attributes and the modules that contain them: - * ELF module: PF_W attribute - * COFF module: IMAGE_SCN_MEM_WRITE attribute - */ -#define __itt_section_write 0x80000000 - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_section_info -{ - const char* name; /*!< Section name in UTF8 */ - __itt_section_type type; /*!< Section content and semantics description */ - size_t flags; /*!< Section bit flags that describe attributes using bit mask - * Zero if disabled, non-zero if enabled - */ - void* start_addr; /*!< Section load(relocated) start address */ - size_t size; /*!< Section file offset */ - size_t file_offset; /*!< Section size */ -} __itt_section_info; - -#pragma pack(pop) -/** @endcond */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_module_object -{ - unsigned int version; /*!< API version*/ - __itt_id module_id; /*!< Unique identifier. This is unchanged for sections that belong to the same module */ - __itt_module_type module_type; /*!< Binary module format */ - const char* module_name; /*!< Unique module name or path to module in UTF8 - * Contains module name when module_bufer and module_size exist - * Contains module path when module_bufer and module_size absent - * module_name remains the same for the certain module_id - */ - void* module_buffer; /*!< Module buffer content */ - size_t module_size; /*!< Module buffer size */ - /*!< If module_buffer and module_size exist, the binary module is dumped onto the system. - * If module_buffer and module_size do not exist, - * the binary module exists on the system already. - * The module_name parameter contains the path to the module. - */ - __itt_section_info* section_array; /*!< Reference to section information */ - size_t section_number; -} __itt_module_object; - -#pragma pack(pop) -/** @endcond */ - -/** - * @brief Load module content and its loaded(relocated) sections. - * This API is useful to save a module, or specify its location on the system and report information about loaded sections. - * The target module is saved on the system if module buffer content and size are available. - * If module buffer content and size are unavailable, the module name contains the path to the existing binary module. - * @param[in] module_obj - provides module and section information, along with unique module identifiers (name,module ID) - * which bind the binary module to particular sections. - */ -void ITTAPI __itt_module_load_with_sections(__itt_module_object* module_obj); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, module_load_with_sections, (__itt_module_object* module_obj)) -#define __itt_module_load_with_sections ITTNOTIFY_VOID(module_load_with_sections) -#define __itt_module_load_with_sections_ptr ITTNOTIFY_NAME(module_load_with_sections) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_module_load_with_sections(module_obj) -#define __itt_module_load_with_sections_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_module_load_with_sections_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Unload a module and its loaded(relocated) sections. - * This API notifies that the module and its sections were unloaded. - * @param[in] module_obj - provides module and sections information, along with unique module identifiers (name,module ID) - * which bind the binary module to particular sections. - */ -void ITTAPI __itt_module_unload_with_sections(__itt_module_object* module_obj); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, module_unload_with_sections, (__itt_module_object* module_obj)) -#define __itt_module_unload_with_sections ITTNOTIFY_VOID(module_unload_with_sections) -#define __itt_module_unload_with_sections_ptr ITTNOTIFY_NAME(module_unload_with_sections) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_module_unload_with_sections(module_obj) -#define __itt_module_unload_with_sections_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_module_unload_with_sections_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_histogram -{ - const __itt_domain* domain; /*!< Domain of the histogram*/ - const char* nameA; /*!< Name of the histogram */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* nameW; -#else /* UNICODE || _UNICODE */ - void* nameW; -#endif /* UNICODE || _UNICODE */ - __itt_metadata_type x_type; /*!< Type of the histogram X axis */ - __itt_metadata_type y_type; /*!< Type of the histogram Y axis */ - int extra1; /*!< Reserved to the runtime */ - void* extra2; /*!< Reserved to the runtime */ - struct ___itt_histogram* next; -} __itt_histogram; - -#pragma pack(pop) -/** @endcond */ - -/** - * @brief Create a typed histogram instance with given name/domain. - * @param[in] domain The domain controlling the call. - * @param[in] name The name of the histogram. - * @param[in] x_type The type of the X axis in histogram (may be 0 to calculate batch statistics). - * @param[in] y_type The type of the Y axis in histogram. -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_histogram* ITTAPI __itt_histogram_createA(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type); -__itt_histogram* ITTAPI __itt_histogram_createW(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type x_type, __itt_metadata_type y_type); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_histogram_create __itt_histogram_createW -# define __itt_histogram_create_ptr __itt_histogram_createW_ptr -#else /* UNICODE */ -# define __itt_histogram_create __itt_histogram_createA -# define __itt_histogram_create_ptr __itt_histogram_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_histogram* ITTAPI __itt_histogram_create(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_histogram*, histogram_createA, (const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type)) -ITT_STUB(ITTAPI, __itt_histogram*, histogram_createW, (const __itt_domain* domain, const wchar_t* name, __itt_metadata_type x_type, __itt_metadata_type y_type)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_histogram*, histogram_create, (const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_histogram_createA ITTNOTIFY_DATA(histogram_createA) -#define __itt_histogram_createA_ptr ITTNOTIFY_NAME(histogram_createA) -#define __itt_histogram_createW ITTNOTIFY_DATA(histogram_createW) -#define __itt_histogram_createW_ptr ITTNOTIFY_NAME(histogram_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_histogram_create ITTNOTIFY_DATA(histogram_create) -#define __itt_histogram_create_ptr ITTNOTIFY_NAME(histogram_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_histogram_createA(domain, name, x_type, y_type) (__itt_histogram*)0 -#define __itt_histogram_createA_ptr 0 -#define __itt_histogram_createW(domain, name, x_type, y_type) (__itt_histogram*)0 -#define __itt_histogram_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_histogram_create(domain, name, x_type, y_type) (__itt_histogram*)0 -#define __itt_histogram_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_histogram_createA_ptr 0 -#define __itt_histogram_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_histogram_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Submit statistics for a histogram instance. - * @param[in] histogram Pointer to the histogram instance to which the histogram statistic is to be dumped. - * @param[in] length The number of elements in dumped axis data array. - * @param[in] x_data The X axis dumped data itself (may be NULL to calculate batch statistics). - * @param[in] y_data The Y axis dumped data itself. -*/ -void ITTAPI __itt_histogram_submit(__itt_histogram* histogram, size_t length, void* x_data, void* y_data); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, histogram_submit, (__itt_histogram* histogram, size_t length, void* x_data, void* y_data)) -#define __itt_histogram_submit ITTNOTIFY_VOID(histogram_submit) -#define __itt_histogram_submit_ptr ITTNOTIFY_NAME(histogram_submit) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_histogram_submit(histogram, length, x_data, y_data) -#define __itt_histogram_submit_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_histogram_submit_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ - -/** -* @brief function allows to obtain the current collection state at the moment -* @return collection state as a enum __itt_collection_state -*/ -__itt_collection_state __itt_get_collection_state(void); - -/** -* @brief function releases resources allocated by ITT API static part -* this API should be called from the library destructor -* @return void -*/ -void __itt_release_resources(void); -/** @endcond */ - -/** - * @brief Create a typed counter with given domain pointer, string name and counter type -*/ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_counter ITTAPI __itt_counter_createA_v3(const __itt_domain* domain, const char* name, __itt_metadata_type type); -__itt_counter ITTAPI __itt_counter_createW_v3(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type type); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_counter_create_v3 __itt_counter_createW_v3 -# define __itt_counter_create_v3_ptr __itt_counter_createW_v3_ptr -#else /* UNICODE */ -# define __itt_counter_create_v3 __itt_counter_createA_v3 -# define __itt_counter_create_v3_ptr __itt_counter_createA_v3_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_counter ITTAPI __itt_counter_create_v3(const __itt_domain* domain, const char* name, __itt_metadata_type type); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_createA_v3, (const __itt_domain* domain, const char* name, __itt_metadata_type type)) -ITT_STUB(ITTAPI, __itt_counter, counter_createW_v3, (const __itt_domain* domain, const wchar_t* name, __itt_metadata_type type)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create_v3, (const __itt_domain* domain, const char* name, __itt_metadata_type type)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA_v3 ITTNOTIFY_DATA(counter_createA_v3) -#define __itt_counter_createA_v3_ptr ITTNOTIFY_NAME(counter_createA_v3) -#define __itt_counter_createW_v3 ITTNOTIFY_DATA(counter_createW_v3) -#define __itt_counter_createW_v3_ptr ITTNOTIFY_NAME(counter_createW_v3) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_v3 ITTNOTIFY_DATA(counter_create_v3) -#define __itt_counter_create_v3_ptr ITTNOTIFY_NAME(counter_create_v3) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA_v3(domain, name, type) (__itt_counter)0 -#define __itt_counter_createA_v3_ptr 0 -#define __itt_counter_createW_v3(domain, name, type) (__itt_counter)0 -#define __itt_counter_create_typedW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_v3(domain, name, type) (__itt_counter)0 -#define __itt_counter_create_v3_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_counter_createA_v3_ptr 0 -#define __itt_counter_createW_v3_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_counter_create_v3_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Set the counter value api - */ -void ITTAPI __itt_counter_set_value_v3(__itt_counter counter, void *value_ptr); - -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, counter_set_value_v3, (__itt_counter counter, void *value_ptr)) -#define __itt_counter_set_value_v3 ITTNOTIFY_VOID(counter_set_value_v3) -#define __itt_counter_set_value_v3_ptr ITTNOTIFY_NAME(counter_set_value_v3) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_counter_set_value_v3(counter, value_ptr) -#define __itt_counter_set_value_v3_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_counter_set_value_v3_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief describes the type of context metadata -*/ -typedef enum { - __itt_context_unknown = 0, /*!< Undefined type */ - __itt_context_nameA, /*!< ASCII string char* type */ - __itt_context_nameW, /*!< Unicode string wchar_t* type */ - __itt_context_deviceA, /*!< ASCII string char* type */ - __itt_context_deviceW, /*!< Unicode string wchar_t* type */ - __itt_context_unitsA, /*!< ASCII string char* type */ - __itt_context_unitsW, /*!< Unicode string wchar_t* type */ - __itt_context_pci_addrA, /*!< ASCII string char* type */ - __itt_context_pci_addrW, /*!< Unicode string wchar_t* type */ - __itt_context_tid, /*!< Unsigned 64-bit integer type */ - __itt_context_max_val, /*!< Unsigned 64-bit integer type */ - __itt_context_bandwidth_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_latency_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_occupancy_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_on_thread_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_is_abs_val_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_cpu_instructions_flag, /*!< Unsigned 64-bit integer type */ - __itt_context_cpu_cycles_flag /*!< Unsigned 64-bit integer type */ -} __itt_context_type; - -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_context_name __itt_context_nameW -# define __itt_context_device __itt_context_deviceW -# define __itt_context_units __itt_context_unitsW -# define __itt_context_pci_addr __itt_context_pci_addrW -#else /* UNICODE || _UNICODE */ -# define __itt_context_name __itt_context_nameA -# define __itt_context_device __itt_context_deviceA -# define __itt_context_units __itt_context_unitsA -# define __itt_context_pci_addr __itt_context_pci_addrA -#endif /* UNICODE || _UNICODE */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_context_metadata -{ - __itt_context_type type; /*!< Type of the context metadata value */ - void* value; /*!< Pointer to context metadata value itself */ -} __itt_context_metadata; - -#pragma pack(pop) -/** @endcond */ - -/** @cond exclude_from_documentation */ -#pragma pack(push, 8) - -typedef struct ___itt_counter_metadata -{ - __itt_counter counter; /*!< Associated context metadata counter */ - __itt_context_type type; /*!< Type of the context metadata value */ - const char* str_valueA; /*!< String context metadata value */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* str_valueW; -#else /* UNICODE || _UNICODE */ - void* str_valueW; -#endif /* UNICODE || _UNICODE */ - unsigned long long value; /*!< Numeric context metadata value */ - int extra1; /*!< Reserved to the runtime */ - void* extra2; /*!< Reserved to the runtime */ - struct ___itt_counter_metadata* next; -} __itt_counter_metadata; - -#pragma pack(pop) -/** @endcond */ - -/** - * @brief Bind context metadata to counter instance - * @param[in] counter Pointer to the counter instance to which the context metadata is to be associated. - * @param[in] length The number of elements in context metadata array. - * @param[in] metadata The context metadata itself. -*/ -void ITTAPI __itt_bind_context_metadata_to_counter(__itt_counter counter, size_t length, __itt_context_metadata* metadata); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, bind_context_metadata_to_counter, (__itt_counter counter, size_t length, __itt_context_metadata* metadata)) -#define __itt_bind_context_metadata_to_counter ITTNOTIFY_VOID(bind_context_metadata_to_counter) -#define __itt_bind_context_metadata_to_counter_ptr ITTNOTIFY_NAME(bind_context_metadata_to_counter) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_bind_context_metadata_to_counter(counter, length, metadata) -#define __itt_bind_context_metadata_to_counter_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_bind_context_metadata_to_counter_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _ITTNOTIFY_H_ */ - -#ifdef INTEL_ITTNOTIFY_API_PRIVATE - -#ifndef _ITTNOTIFY_PRIVATE_ -#define _ITTNOTIFY_PRIVATE_ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @ingroup clockdomain - * @brief Begin an overlapped task instance. - * @param[in] domain The domain for this task - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null. - * @param[in] parentid The parent of this task, or __itt_null. - * @param[in] name The name of this task. - */ -void ITTAPI __itt_task_begin_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name); - -/** - * @ingroup clockdomain - * @brief End an overlapped task instance. - * @param[in] domain The domain for this task - * @param[in] clock_domain The clock domain controlling the execution of this call. - * @param[in] timestamp The user defined timestamp. - * @param[in] taskid Explicit ID of finished task - */ -void ITTAPI __itt_task_end_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, task_begin_overlapped_ex, (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name)) -ITT_STUBV(ITTAPI, void, task_end_overlapped_ex, (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid)) -#define __itt_task_begin_overlapped_ex(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(task_begin_overlapped_ex,d,x,y,z,a,b) -#define __itt_task_begin_overlapped_ex_ptr ITTNOTIFY_NAME(task_begin_overlapped_ex) -#define __itt_task_end_overlapped_ex(d,x,y,z) ITTNOTIFY_VOID_D3(task_end_overlapped_ex,d,x,y,z) -#define __itt_task_end_overlapped_ex_ptr ITTNOTIFY_NAME(task_end_overlapped_ex) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_task_begin_overlapped_ex(domain,clock_domain,timestamp,taskid,parentid,name) -#define __itt_task_begin_overlapped_ex_ptr 0 -#define __itt_task_end_overlapped_ex(domain,clock_domain,timestamp,taskid) -#define __itt_task_end_overlapped_ex_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_task_begin_overlapped_ex_ptr 0 -#define __itt_task_end_overlapped_ptr 0 -#define __itt_task_end_overlapped_ex_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @defgroup makrs_internal Marks - * @ingroup internal - * Marks group - * @warning Internal API: - * - It is not shipped to outside of Intel - * - It is delivered to internal Intel teams using e-mail or SVN access only - * @{ - */ -/** @brief user mark type */ -typedef int __itt_mark_type; - -/** - * @brief Creates a user mark type with the specified name using char or Unicode string. - * @param[in] name - name of mark to create - * @return Returns a handle to the mark type - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_mark_type ITTAPI __itt_mark_createA(const char *name); -__itt_mark_type ITTAPI __itt_mark_createW(const wchar_t *name); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_mark_create __itt_mark_createW -# define __itt_mark_create_ptr __itt_mark_createW_ptr -#else /* UNICODE */ -# define __itt_mark_create __itt_mark_createA -# define __itt_mark_create_ptr __itt_mark_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_mark_type ITTAPI __itt_mark_create(const char *name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char *name)) -ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_mark_type, mark_create, (const char *name)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_createA ITTNOTIFY_DATA(mark_createA) -#define __itt_mark_createA_ptr ITTNOTIFY_NAME(mark_createA) -#define __itt_mark_createW ITTNOTIFY_DATA(mark_createW) -#define __itt_mark_createW_ptr ITTNOTIFY_NAME(mark_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_create ITTNOTIFY_DATA(mark_create) -#define __itt_mark_create_ptr ITTNOTIFY_NAME(mark_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_createA(name) (__itt_mark_type)0 -#define __itt_mark_createA_ptr 0 -#define __itt_mark_createW(name) (__itt_mark_type)0 -#define __itt_mark_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_create(name) (__itt_mark_type)0 -#define __itt_mark_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_createA_ptr 0 -#define __itt_mark_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Creates a "discrete" user mark type of the specified type and an optional parameter using char or Unicode string. - * - * - The mark of "discrete" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign. - * - The call is "synchronous" - function returns after mark is actually added to results. - * - This function is useful, for example, to mark different phases of application - * (beginning of the next mark automatically meand end of current region). - * - Can be used together with "continuous" marks (see below) at the same collection session - * @param[in] mt - mark, created by __itt_mark_create(const char* name) function - * @param[in] parameter - string parameter of mark - * @return Returns zero value in case of success, non-zero value otherwise. - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -int ITTAPI __itt_markA(__itt_mark_type mt, const char *parameter); -int ITTAPI __itt_markW(__itt_mark_type mt, const wchar_t *parameter); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_mark __itt_markW -# define __itt_mark_ptr __itt_markW_ptr -#else /* UNICODE */ -# define __itt_mark __itt_markA -# define __itt_mark_ptr __itt_markA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -int ITTAPI __itt_mark(__itt_mark_type mt, const char *parameter); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char *parameter)) -ITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark, (__itt_mark_type mt, const char *parameter)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_markA ITTNOTIFY_DATA(markA) -#define __itt_markA_ptr ITTNOTIFY_NAME(markA) -#define __itt_markW ITTNOTIFY_DATA(markW) -#define __itt_markW_ptr ITTNOTIFY_NAME(markW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark ITTNOTIFY_DATA(mark) -#define __itt_mark_ptr ITTNOTIFY_NAME(mark) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_markA(mt, parameter) (int)0 -#define __itt_markA_ptr 0 -#define __itt_markW(mt, parameter) (int)0 -#define __itt_markW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark(mt, parameter) (int)0 -#define __itt_mark_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_markA_ptr 0 -#define __itt_markW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Use this if necessary to create a "discrete" user event type (mark) for process - * rather then for one thread - * @see int __itt_mark(__itt_mark_type mt, const char* parameter); - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -int ITTAPI __itt_mark_globalA(__itt_mark_type mt, const char *parameter); -int ITTAPI __itt_mark_globalW(__itt_mark_type mt, const wchar_t *parameter); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_mark_global __itt_mark_globalW -# define __itt_mark_global_ptr __itt_mark_globalW_ptr -#else /* UNICODE */ -# define __itt_mark_global __itt_mark_globalA -# define __itt_mark_global_ptr __itt_mark_globalA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -int ITTAPI __itt_mark_global(__itt_mark_type mt, const char *parameter); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char *parameter)) -ITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark_global, (__itt_mark_type mt, const char *parameter)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_globalA ITTNOTIFY_DATA(mark_globalA) -#define __itt_mark_globalA_ptr ITTNOTIFY_NAME(mark_globalA) -#define __itt_mark_globalW ITTNOTIFY_DATA(mark_globalW) -#define __itt_mark_globalW_ptr ITTNOTIFY_NAME(mark_globalW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_global ITTNOTIFY_DATA(mark_global) -#define __itt_mark_global_ptr ITTNOTIFY_NAME(mark_global) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_globalA(mt, parameter) (int)0 -#define __itt_mark_globalA_ptr 0 -#define __itt_mark_globalW(mt, parameter) (int)0 -#define __itt_mark_globalW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_global(mt, parameter) (int)0 -#define __itt_mark_global_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_mark_globalA_ptr 0 -#define __itt_mark_globalW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_mark_global_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Creates an "end" point for "continuous" mark with specified name. - * - * - Returns zero value in case of success, non-zero value otherwise. - * Also returns non-zero value when preceding "begin" point for the - * mark with the same name failed to be created or not created. - * - The mark of "continuous" type is placed to collection results in - * case of success. It appears in overtime view(s) as a special tick - * sign (different from "discrete" mark) together with line from - * corresponding "begin" mark to "end" mark. - * @note Continuous marks can overlap and be nested inside each other. - * Discrete mark can be nested inside marked region - * @param[in] mt - mark, created by __itt_mark_create(const char* name) function - * @return Returns zero value in case of success, non-zero value otherwise. - */ -int ITTAPI __itt_mark_off(__itt_mark_type mt); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt)) -#define __itt_mark_off ITTNOTIFY_DATA(mark_off) -#define __itt_mark_off_ptr ITTNOTIFY_NAME(mark_off) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_mark_off(mt) (int)0 -#define __itt_mark_off_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_mark_off_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Use this if necessary to create an "end" point for mark of process - * @see int __itt_mark_off(__itt_mark_type mt); - */ -int ITTAPI __itt_mark_global_off(__itt_mark_type mt); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt)) -#define __itt_mark_global_off ITTNOTIFY_DATA(mark_global_off) -#define __itt_mark_global_off_ptr ITTNOTIFY_NAME(mark_global_off) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_mark_global_off(mt) (int)0 -#define __itt_mark_global_off_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_mark_global_off_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} marks group */ - -/** - * @defgroup counters_internal Counters - * @ingroup internal - * Counters group - * @{ - */ - - -/** - * @defgroup stitch Stack Stitching - * @ingroup internal - * Stack Stitching group - * @{ - */ -/** - * @brief opaque structure for counter identification - */ -typedef struct ___itt_caller *__itt_caller; - -/** - * @brief Create the stitch point e.g. a point in call stack where other stacks should be stitched to. - * The function returns a unique identifier which is used to match the cut points with corresponding stitch points. - */ -__itt_caller ITTAPI __itt_stack_caller_create(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void)) -#define __itt_stack_caller_create ITTNOTIFY_DATA(stack_caller_create) -#define __itt_stack_caller_create_ptr ITTNOTIFY_NAME(stack_caller_create) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_stack_caller_create() (__itt_caller)0 -#define __itt_stack_caller_create_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_stack_caller_create_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Destroy the information about stitch point identified by the pointer previously returned by __itt_stack_caller_create() - */ -void ITTAPI __itt_stack_caller_destroy(__itt_caller id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id)) -#define __itt_stack_caller_destroy ITTNOTIFY_VOID(stack_caller_destroy) -#define __itt_stack_caller_destroy_ptr ITTNOTIFY_NAME(stack_caller_destroy) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_stack_caller_destroy(id) -#define __itt_stack_caller_destroy_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_stack_caller_destroy_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Sets the cut point. Stack from each event which occurs after this call will be cut - * at the same stack level the function was called and stitched to the corresponding stitch point. - */ -void ITTAPI __itt_stack_callee_enter(__itt_caller id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id)) -#define __itt_stack_callee_enter ITTNOTIFY_VOID(stack_callee_enter) -#define __itt_stack_callee_enter_ptr ITTNOTIFY_NAME(stack_callee_enter) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_stack_callee_enter(id) -#define __itt_stack_callee_enter_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_stack_callee_enter_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief This function eliminates the cut point which was set by latest __itt_stack_callee_enter(). - */ -void ITTAPI __itt_stack_callee_leave(__itt_caller id); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id)) -#define __itt_stack_callee_leave ITTNOTIFY_VOID(stack_callee_leave) -#define __itt_stack_callee_leave_ptr ITTNOTIFY_NAME(stack_callee_leave) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_stack_callee_leave(id) -#define __itt_stack_callee_leave_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_stack_callee_leave_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @} stitch group */ - -/* ***************************************************************************************************************************** */ - -#include - -/** @cond exclude_from_documentation */ -typedef enum __itt_error_code -{ - __itt_error_success = 0, /*!< no error */ - __itt_error_no_module = 1, /*!< module can't be loaded */ - /* %1$s -- library name; win: %2$d -- system error code; unix: %2$s -- system error message. */ - __itt_error_no_symbol = 2, /*!< symbol not found */ - /* %1$s -- library name, %2$s -- symbol name. */ - __itt_error_unknown_group = 3, /*!< unknown group specified */ - /* %1$s -- env var name, %2$s -- group name. */ - __itt_error_cant_read_env = 4, /*!< GetEnvironmentVariable() failed */ - /* %1$s -- env var name, %2$d -- system error. */ - __itt_error_env_too_long = 5, /*!< variable value too long */ - /* %1$s -- env var name, %2$d -- actual length of the var, %3$d -- max allowed length. */ - __itt_error_system = 6 /*!< pthread_mutexattr_init or pthread_mutex_init failed */ - /* %1$s -- function name, %2$d -- errno. */ -} __itt_error_code; - -typedef void (__itt_error_handler_t)(__itt_error_code code, va_list); -__itt_error_handler_t* __itt_set_error_handler(__itt_error_handler_t*); - -const char* ITTAPI __itt_api_version(void); -/** @endcond */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#define __itt_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler) -void __itt_error_handler(__itt_error_code code, va_list args); -extern const int ITTNOTIFY_NAME(err); -#define __itt_err ITTNOTIFY_NAME(err) -ITT_STUB(ITTAPI, const char*, api_version, (void)) -#define __itt_api_version ITTNOTIFY_DATA(api_version) -#define __itt_api_version_ptr ITTNOTIFY_NAME(api_version) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_api_version() (const char*)0 -#define __itt_api_version_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_api_version_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _ITTNOTIFY_PRIVATE_ */ - -#endif /* INTEL_ITTNOTIFY_API_PRIVATE */ diff --git a/src/tbb/tools_api/ittnotify_config.h b/src/tbb/tools_api/ittnotify_config.h deleted file mode 100644 index 001d42e0e5..0000000000 --- a/src/tbb/tools_api/ittnotify_config.h +++ /dev/null @@ -1,775 +0,0 @@ -/* - Copyright (c) 2005-2024 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _ITTNOTIFY_CONFIG_H_ -#define _ITTNOTIFY_CONFIG_H_ - -/** @cond exclude_from_documentation */ -#ifndef ITT_OS_WIN -# define ITT_OS_WIN 1 -#endif /* ITT_OS_WIN */ - -#ifndef ITT_OS_LINUX -# define ITT_OS_LINUX 2 -#endif /* ITT_OS_LINUX */ - -#ifndef ITT_OS_MAC -# define ITT_OS_MAC 3 -#endif /* ITT_OS_MAC */ - -#ifndef ITT_OS_FREEBSD -# define ITT_OS_FREEBSD 4 -#endif /* ITT_OS_FREEBSD */ - -#ifndef ITT_OS_OPENBSD -# define ITT_OS_OPENBSD 5 -#endif /* ITT_OS_OPENBSD */ - -#ifndef ITT_OS -# if defined WIN32 || defined _WIN32 -# define ITT_OS ITT_OS_WIN -# elif defined( __APPLE__ ) && defined( __MACH__ ) -# define ITT_OS ITT_OS_MAC -# elif defined( __FreeBSD__ ) -# define ITT_OS ITT_OS_FREEBSD -# elif defined( __OpenBSD__ ) -# define ITT_OS ITT_OS_OPENBSD -# else -# define ITT_OS ITT_OS_LINUX -# endif -#endif /* ITT_OS */ - -#ifndef ITT_PLATFORM_WIN -# define ITT_PLATFORM_WIN 1 -#endif /* ITT_PLATFORM_WIN */ - -#ifndef ITT_PLATFORM_POSIX -# define ITT_PLATFORM_POSIX 2 -#endif /* ITT_PLATFORM_POSIX */ - -#ifndef ITT_PLATFORM_MAC -# define ITT_PLATFORM_MAC 3 -#endif /* ITT_PLATFORM_MAC */ - -#ifndef ITT_PLATFORM_FREEBSD -# define ITT_PLATFORM_FREEBSD 4 -#endif /* ITT_PLATFORM_FREEBSD */ - -#ifndef ITT_PLATFORM_OPENBSD -# define ITT_PLATFORM_OPENBSD 5 -#endif /* ITT_PLATFORM_OPENBSD */ - -#ifndef ITT_PLATFORM -# if ITT_OS==ITT_OS_WIN -# define ITT_PLATFORM ITT_PLATFORM_WIN -# elif ITT_OS==ITT_OS_MAC -# define ITT_PLATFORM ITT_PLATFORM_MAC -# elif ITT_OS==ITT_OS_FREEBSD -# define ITT_PLATFORM ITT_PLATFORM_FREEBSD -# elif ITT_OS==ITT_OS_OPENBSD -# define ITT_PLATFORM ITT_PLATFORM_OPENBSD -# else -# define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif -#endif /* ITT_PLATFORM */ - -#if defined(_UNICODE) && !defined(UNICODE) -#define UNICODE -#endif - -#include -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#include -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#include -#if defined(UNICODE) || defined(_UNICODE) -#include -#endif /* UNICODE || _UNICODE */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef ITTAPI_CDECL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define ITTAPI_CDECL __cdecl -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define ITTAPI_CDECL __attribute__ ((cdecl)) -# else /* _M_IX86 || __i386__ */ -# define ITTAPI_CDECL /* actual only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* ITTAPI_CDECL */ - -#ifndef STDCALL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define STDCALL __stdcall -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define STDCALL __attribute__ ((stdcall)) -# else /* _M_IX86 || __i386__ */ -# define STDCALL /* supported only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* STDCALL */ - -#define ITTAPI ITTAPI_CDECL -#define LIBITTAPI ITTAPI_CDECL - -/* TODO: Temporary for compatibility! */ -#define ITTAPI_CALL ITTAPI_CDECL -#define LIBITTAPI_CALL ITTAPI_CDECL - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -/* use __forceinline (VC++ specific) */ -#if defined(__MINGW32__) && !defined(__cplusplus) -#define ITT_INLINE static __inline__ __attribute__((__always_inline__,__gnu_inline__)) -#else -#define ITT_INLINE static __forceinline -#endif /* __MINGW32__ */ - -#define ITT_INLINE_ATTRIBUTE /* nothing */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/* - * Generally, functions are not inlined unless optimization is specified. - * For functions declared inline, this attribute inlines the function even - * if no optimization level was specified. - */ -#ifdef __STRICT_ANSI__ -#define ITT_INLINE static -#define ITT_INLINE_ATTRIBUTE __attribute__((unused)) -#else /* __STRICT_ANSI__ */ -#define ITT_INLINE static inline -#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused)) -#endif /* __STRICT_ANSI__ */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/** @endcond */ - -#ifndef ITT_ARCH_IA32 -# define ITT_ARCH_IA32 1 -#endif /* ITT_ARCH_IA32 */ - -#ifndef ITT_ARCH_IA32E -# define ITT_ARCH_IA32E 2 -#endif /* ITT_ARCH_IA32E */ - -#ifndef ITT_ARCH_IA64 -# define ITT_ARCH_IA64 3 -#endif /* ITT_ARCH_IA64 */ - -#ifndef ITT_ARCH_ARM -# define ITT_ARCH_ARM 4 -#endif /* ITT_ARCH_ARM */ - -#ifndef ITT_ARCH_PPC64 -# define ITT_ARCH_PPC64 5 -#endif /* ITT_ARCH_PPC64 */ - -#ifndef ITT_ARCH_ARM64 -# define ITT_ARCH_ARM64 6 -#endif /* ITT_ARCH_ARM64 */ - -#ifndef ITT_ARCH_LOONGARCH64 -# define ITT_ARCH_LOONGARCH64 7 -#endif /* ITT_ARCH_LOONGARCH64 */ - -#ifndef ITT_ARCH_S390X -# define ITT_ARCH_S390X 8 -#endif /* ITT_ARCH_S390X */ - -#ifndef ITT_ARCH_HPPA -# define ITT_ARCH_HPPA 9 -#endif /* ITT_ARCH_HPPA */ - -#ifndef ITT_ARCH_RISCV64 -# define ITT_ARCH_RISCV64 10 -#endif /* ITT_ARCH_RISCV64 */ - -#ifndef ITT_ARCH -# if defined _M_IX86 || defined __i386__ -# define ITT_ARCH ITT_ARCH_IA32 -# elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define ITT_ARCH ITT_ARCH_IA32E -# elif defined _M_IA64 || defined __ia64__ -# define ITT_ARCH ITT_ARCH_IA64 -# elif defined _M_ARM || defined __arm__ -# define ITT_ARCH ITT_ARCH_ARM -# elif defined __aarch64__ -# define ITT_ARCH ITT_ARCH_ARM64 -# elif defined __powerpc64__ -# define ITT_ARCH ITT_ARCH_PPC64 -# elif defined __loongarch__ -# define ITT_ARCH ITT_ARCH_LOONGARCH64 -# elif defined __s390__ || defined __s390x__ -# define ITT_ARCH ITT_ARCH_S390X -# elif defined __hppa__ -# define ITT_ARCH ITT_ARCH_HPPA -# elif defined __riscv && __riscv_xlen == 64 -# define ITT_ARCH ITT_ARCH_RISCV64 -# endif - -#endif - -#ifdef __cplusplus -# define ITT_EXTERN_C extern "C" -# define ITT_EXTERN_C_BEGIN extern "C" { -# define ITT_EXTERN_C_END } -#else -# define ITT_EXTERN_C /* nothing */ -# define ITT_EXTERN_C_BEGIN /* nothing */ -# define ITT_EXTERN_C_END /* nothing */ -#endif /* __cplusplus */ - -#define ITT_TO_STR_AUX(x) #x -#define ITT_TO_STR(x) ITT_TO_STR_AUX(x) - -#define __ITT_BUILD_ASSERT(expr, suffix) do { \ - static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \ - __itt_build_check_##suffix[0] = 0; \ -} while(0) -#define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix) -#define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__) - -#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 } - -/* Replace with snapshot date YYYYMMDD for promotion build. */ -#define API_VERSION_BUILD 20230630 - -#ifndef API_VERSION_NUM -#define API_VERSION_NUM 3.24.4 -#endif /* API_VERSION_NUM */ - -#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \ - " (" ITT_TO_STR(API_VERSION_BUILD) ")" - -/* OS communication functions */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#include -typedef HMODULE lib_t; -typedef DWORD TIDT; -typedef CRITICAL_SECTION mutex_t; -#ifdef __cplusplus -#define MUTEX_INITIALIZER {} -#else -#define MUTEX_INITIALIZER { 0 } -#endif -#define strong_alias(name, aliasname) /* empty for Windows */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#include -#if defined(UNICODE) || defined(_UNICODE) -#include -#endif /* UNICODE */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */ -#endif /* _GNU_SOURCE */ -#ifndef __USE_UNIX98 -#define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */ -#endif /*__USE_UNIX98*/ -#include -typedef void* lib_t; -typedef pthread_t TIDT; -typedef pthread_mutex_t mutex_t; -#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#define _strong_alias(name, aliasname) \ - extern __typeof (name) aliasname __attribute__ ((alias (#name))); -#define strong_alias(name, aliasname) _strong_alias(name, aliasname) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_get_proc(lib, name) GetProcAddress(lib, name) -#define __itt_mutex_init(mutex) InitializeCriticalSection(mutex) -#define __itt_mutex_lock(mutex) EnterCriticalSection(mutex) -#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex) -#define __itt_mutex_destroy(mutex) DeleteCriticalSection(mutex) -#define __itt_load_lib(name) LoadLibraryA(name) -#define __itt_unload_lib(handle) FreeLibrary(handle) -#define __itt_system_error() (int)GetLastError() -#define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2) -#define __itt_fstrnlen(s, l) strnlen_s(s, l) -#define __itt_fstrcpyn(s1, b, s2, l) strncpy_s(s1, b, s2, l) -#define __itt_thread_id() GetCurrentThreadId() -#define __itt_thread_yield() SwitchToThread() -#ifndef ITT_SIMPLE_INIT -ITT_INLINE long -__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; -ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) -{ - return InterlockedIncrement(ptr); -} -ITT_INLINE long -__itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) ITT_INLINE_ATTRIBUTE; -ITT_INLINE long -__itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) -{ - return InterlockedCompareExchange(ptr, exchange, comperand); -} -#endif /* ITT_SIMPLE_INIT */ - -#define DL_SYMBOLS (1) -#define PTHREAD_SYMBOLS (1) - -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -#define __itt_get_proc(lib, name) dlsym(lib, name) -#define __itt_mutex_init(mutex) {\ - pthread_mutexattr_t mutex_attr; \ - int error_code = pthread_mutexattr_init(&mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_init", \ - error_code); \ - error_code = pthread_mutexattr_settype(&mutex_attr, \ - PTHREAD_MUTEX_RECURSIVE); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \ - error_code); \ - error_code = pthread_mutex_init(mutex, &mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutex_init", \ - error_code); \ - error_code = pthread_mutexattr_destroy(&mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \ - error_code); \ -} -#define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex) -#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex) -#define __itt_mutex_destroy(mutex) pthread_mutex_destroy(mutex) -#define __itt_load_lib(name) dlopen(name, RTLD_LAZY) -#define __itt_unload_lib(handle) dlclose(handle) -#define __itt_system_error() errno -#define __itt_fstrcmp(s1, s2) strcmp(s1, s2) - -/* makes customer code define safe APIs for SDL_STRNLEN_S and SDL_STRNCPY_S */ -#ifdef SDL_STRNLEN_S -#define __itt_fstrnlen(s, l) SDL_STRNLEN_S(s, l) -#else -#define __itt_fstrnlen(s, l) strlen(s) -#endif /* SDL_STRNLEN_S */ -#ifdef SDL_STRNCPY_S -#define __itt_fstrcpyn(s1, b, s2, l) SDL_STRNCPY_S(s1, b, s2, l) -#else -#define __itt_fstrcpyn(s1, b, s2, l) { \ - if (b > 0) { \ - /* 'volatile' is used to suppress the warning that a destination */ \ - /* bound depends on the length of the source. */ \ - volatile size_t num_to_copy = (size_t)(b - 1) < (size_t)(l) ? \ - (size_t)(b - 1) : (size_t)(l); \ - strncpy(s1, s2, num_to_copy); \ - s1[num_to_copy] = 0; \ - } \ -} -#endif /* SDL_STRNCPY_S */ - -#define __itt_thread_id() pthread_self() -#define __itt_thread_yield() sched_yield() -#if ITT_ARCH==ITT_ARCH_IA64 -#ifdef __INTEL_COMPILER -#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val) -#else /* __INTEL_COMPILER */ -#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val) -#endif /* __INTEL_COMPILER */ -#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */ -ITT_INLINE long -__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE; -ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend) -{ - long result; - __asm__ __volatile__("lock\nxadd %0,%1" - : "=r"(result),"=m"(*(volatile int*)ptr) - : "0"(addend), "m"(*(volatile int*)ptr) - : "memory"); - return result; -} -#else -#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val) -#endif /* ITT_ARCH==ITT_ARCH_IA64 */ -#ifndef ITT_SIMPLE_INIT -ITT_INLINE long -__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; -ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) -{ - return __TBB_machine_fetchadd4(ptr, 1) + 1L; -} -ITT_INLINE long -__itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) ITT_INLINE_ATTRIBUTE; -ITT_INLINE long -__itt_interlocked_compare_exchange(volatile long* ptr, long exchange, long comperand) -{ - return __sync_val_compare_and_swap(ptr, exchange, comperand); -} -#endif /* ITT_SIMPLE_INIT */ - -void* dlopen(const char*, int) __attribute__((weak)); -void* dlsym(void*, const char*) __attribute__((weak)); -int dlclose(void*) __attribute__((weak)); -#define DL_SYMBOLS (dlopen && dlsym && dlclose) - -int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*) __attribute__((weak)); -int pthread_mutex_lock(pthread_mutex_t*) __attribute__((weak)); -int pthread_mutex_unlock(pthread_mutex_t*) __attribute__((weak)); -int pthread_mutex_destroy(pthread_mutex_t*) __attribute__((weak)); -int pthread_mutexattr_init(pthread_mutexattr_t*) __attribute__((weak)); -int pthread_mutexattr_settype(pthread_mutexattr_t*, int) __attribute__((weak)); -int pthread_mutexattr_destroy(pthread_mutexattr_t*) __attribute__((weak)); -pthread_t pthread_self(void) __attribute__((weak)); -#define PTHREAD_SYMBOLS (pthread_mutex_init && pthread_mutex_lock && pthread_mutex_unlock && pthread_mutex_destroy && pthread_mutexattr_init && pthread_mutexattr_settype && pthread_mutexattr_destroy && pthread_self) - -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/* strdup() is not included into C99 which results in a compiler warning about - * implicitly declared symbol. To avoid the issue strdup is implemented - * manually. - */ -#define ITT_STRDUP_MAX_STRING_SIZE 4096 -#define __itt_fstrdup(s, new_s) do { \ - if (s != NULL) { \ - size_t s_len = __itt_fstrnlen(s, ITT_STRDUP_MAX_STRING_SIZE); \ - new_s = (char *)malloc(s_len + 1); \ - if (new_s != NULL) { \ - __itt_fstrcpyn(new_s, s_len + 1, s, s_len); \ - } \ - } \ -} while(0) - -typedef enum { - __itt_thread_normal = 0, - __itt_thread_ignored = 1 -} __itt_thread_state; - -#pragma pack(push, 8) - -typedef struct ___itt_thread_info -{ - const char* nameA; /*!< Copy of original name in ASCII. */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* nameW; /*!< Copy of original name in UNICODE. */ -#else /* UNICODE || _UNICODE */ - void* nameW; -#endif /* UNICODE || _UNICODE */ - TIDT tid; - __itt_thread_state state; /*!< Thread state (paused or normal) */ - int extra1; /*!< Reserved to the runtime */ - void* extra2; /*!< Reserved to the runtime */ - struct ___itt_thread_info* next; -} __itt_thread_info; - -#include "ittnotify_types.h" /* For __itt_group_id definition */ - -typedef struct ___itt_api_info_20101001 -{ - const char* name; - void** func_ptr; - void* init_func; - __itt_group_id group; -} __itt_api_info_20101001; - -typedef struct ___itt_api_info -{ - const char* name; - void** func_ptr; - void* init_func; - void* null_func; - __itt_group_id group; -} __itt_api_info; - -typedef struct __itt_counter_info -{ - const char* nameA; /*!< Copy of original name in ASCII. */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* nameW; /*!< Copy of original name in UNICODE. */ -#else /* UNICODE || _UNICODE */ - void* nameW; -#endif /* UNICODE || _UNICODE */ - const char* domainA; /*!< Copy of original name in ASCII. */ -#if defined(UNICODE) || defined(_UNICODE) - const wchar_t* domainW; /*!< Copy of original name in UNICODE. */ -#else /* UNICODE || _UNICODE */ - void* domainW; -#endif /* UNICODE || _UNICODE */ - int type; - long index; - int extra1; /*!< Reserved to the runtime */ - void* extra2; /*!< Reserved to the runtime */ - struct __itt_counter_info* next; -} __itt_counter_info_t; - -struct ___itt_domain; -struct ___itt_string_handle; -struct ___itt_histogram; -struct ___itt_counter_metadata; - -#include "ittnotify.h" - -typedef struct ___itt_global -{ - unsigned char magic[8]; - unsigned long version_major; - unsigned long version_minor; - unsigned long version_build; - volatile long api_initialized; - volatile long mutex_initialized; - volatile long atomic_counter; - mutex_t mutex; - lib_t lib; - void* error_handler; - const char** dll_path_ptr; - __itt_api_info* api_list_ptr; - struct ___itt_global* next; - /* Joinable structures below */ - __itt_thread_info* thread_list; - struct ___itt_domain* domain_list; - struct ___itt_string_handle* string_list; - __itt_collection_state state; - __itt_counter_info_t* counter_list; - unsigned int ipt_collect_events; - struct ___itt_histogram* histogram_list; - struct ___itt_counter_metadata* counter_metadata_list; -} __itt_global; - -#pragma pack(pop) - -#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \ - h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ - if (h != NULL) { \ - h->tid = t; \ - h->nameA = NULL; \ - h->nameW = n ? _wcsdup(n) : NULL; \ - h->state = s; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->thread_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \ - h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \ - if (h != NULL) { \ - h->tid = t; \ - char *n_copy = NULL; \ - __itt_fstrdup(n, n_copy); \ - h->nameA = n_copy; \ - h->nameW = NULL; \ - h->state = s; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->thread_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \ - h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ - if (h != NULL) { \ - h->flags = 1; /* domain is enabled by default */ \ - h->nameA = NULL; \ - h->nameW = name ? _wcsdup(name) : NULL; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->domain_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \ - h = (__itt_domain*)malloc(sizeof(__itt_domain)); \ - if (h != NULL) { \ - h->flags = 1; /* domain is enabled by default */ \ - char *name_copy = NULL; \ - __itt_fstrdup(name, name_copy); \ - h->nameA = name_copy; \ - h->nameW = NULL; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->domain_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \ - h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ - if (h != NULL) { \ - h->strA = NULL; \ - h->strW = name ? _wcsdup(name) : NULL; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->string_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \ - h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \ - if (h != NULL) { \ - char *name_copy = NULL; \ - __itt_fstrdup(name, name_copy); \ - h->strA = name_copy; \ - h->strW = NULL; \ - h->extra1 = 0; /* reserved */ \ - h->extra2 = NULL; /* reserved */ \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->string_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_COUNTER_W(gptr,h,h_tail,name,domain,type) { \ - h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \ - if (h != NULL) { \ - h->nameA = NULL; \ - h->nameW = name ? _wcsdup(name) : NULL; \ - h->domainA = NULL; \ - h->domainW = domain ? _wcsdup(domain) : NULL; \ - h->type = type; \ - h->index = 0; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->counter_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_COUNTER_A(gptr,h,h_tail,name,domain,type) { \ - h = (__itt_counter_info_t*)malloc(sizeof(__itt_counter_info_t)); \ - if (h != NULL) { \ - char *name_copy = NULL; \ - __itt_fstrdup(name, name_copy); \ - h->nameA = name_copy; \ - h->nameW = NULL; \ - char *domain_copy = NULL; \ - __itt_fstrdup(domain, domain_copy); \ - h->domainA = domain_copy; \ - h->domainW = NULL; \ - h->type = type; \ - h->index = 0; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->counter_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_HISTOGRAM_W(gptr,h,h_tail,domain,name,x_type,y_type) { \ - h = (__itt_histogram*)malloc(sizeof(__itt_histogram)); \ - if (h != NULL) { \ - h->domain = domain; \ - h->nameA = NULL; \ - h->nameW = name ? _wcsdup(name) : NULL; \ - h->x_type = x_type; \ - h->y_type = y_type; \ - h->extra1 = 0; \ - h->extra2 = NULL; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->histogram_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_HISTOGRAM_A(gptr,h,h_tail,domain,name,x_type,y_type) { \ - h = (__itt_histogram*)malloc(sizeof(__itt_histogram)); \ - if (h != NULL) { \ - h->domain = domain; \ - char *name_copy = NULL; \ - __itt_fstrdup(name, name_copy); \ - h->nameA = name_copy; \ - h->nameW = NULL; \ - h->x_type = x_type; \ - h->y_type = y_type; \ - h->extra1 = 0; \ - h->extra2 = NULL; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->histogram_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_COUNTER_METADATA_NUM(gptr,h,h_tail,counter,type,value) { \ - h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \ - if (h != NULL) { \ - h->counter = counter; \ - h->type = type; \ - h->str_valueA = NULL; \ - h->str_valueW = NULL; \ - h->value = value; \ - h->extra1 = 0; \ - h->extra2 = NULL; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->counter_metadata_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_COUNTER_METADATA_STR_A(gptr,h,h_tail,counter,type,str_valueA) { \ - h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \ - if (h != NULL) { \ - h->counter = counter; \ - h->type = type; \ - char *str_value_copy = NULL; \ - __itt_fstrdup(str_valueA, str_value_copy); \ - h->str_valueA = str_value_copy; \ - h->str_valueW = NULL; \ - h->value = 0; \ - h->extra1 = 0; \ - h->extra2 = NULL; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->counter_metadata_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#define NEW_COUNTER_METADATA_STR_W(gptr,h,h_tail,counter,type,str_valueW) { \ - h = (__itt_counter_metadata*)malloc(sizeof(__itt_counter_metadata)); \ - if (h != NULL) { \ - h->counter = counter; \ - h->type = type; \ - h->str_valueA = NULL; \ - h->str_valueW = str_valueW ? _wcsdup(str_valueW) : NULL; \ - h->value = 0; \ - h->extra1 = 0; \ - h->extra2 = NULL; \ - h->next = NULL; \ - if (h_tail == NULL) \ - (gptr)->counter_metadata_list = h; \ - else \ - h_tail->next = h; \ - } \ -} - -#endif /* _ITTNOTIFY_CONFIG_H_ */ diff --git a/src/tbb/tools_api/ittnotify_static.c b/src/tbb/tools_api/ittnotify_static.c deleted file mode 100644 index c3a53bf0a6..0000000000 --- a/src/tbb/tools_api/ittnotify_static.c +++ /dev/null @@ -1,1807 +0,0 @@ -/* - Copyright (c) 2005-2024 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define INTEL_NO_MACRO_BODY -#define INTEL_ITTNOTIFY_API_PRIVATE -#include "ittnotify_config.h" - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if !defined(PATH_MAX) -#define PATH_MAX 512 -#endif -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -#include -#include -#include -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#include -#include -#include -#include - -#include "ittnotify.h" -#include "legacy/ittnotify.h" - -#include "disable_warnings.h" - -static const char api_version[] = API_VERSION "\0\n@(#) $Revision$\n"; - -#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n) - -#ifndef HAS_CPP_ATTR -#if defined(__cplusplus) && defined(__has_cpp_attribute) -#define HAS_CPP_ATTR(X) __has_cpp_attribute(X) -#else -#define HAS_CPP_ATTR(X) 0 -#endif -#endif - -#ifndef HAS_C_ATTR -#if defined(__STDC__) && defined(__has_c_attribute) -#define HAS_C_ATTR(X) __has_c_attribute(X) -#else -#define HAS_C_ATTR(X) 0 -#endif -#endif - -#ifndef HAS_GNU_ATTR -#if defined(__has_attribute) -#define HAS_GNU_ATTR(X) __has_attribute(X) -#else -#define HAS_GNU_ATTR(X) 0 -#endif -#endif - -#ifndef ITT_ATTRIBUTE_FALLTHROUGH -#if (HAS_CPP_ATTR(fallthrough) || HAS_C_ATTR(fallthrough)) && (__cplusplus >= 201703L || _MSVC_LANG >= 201703L) -#define ITT_ATTRIBUTE_FALLTHROUGH [[fallthrough]] -#elif HAS_CPP_ATTR(gnu::fallthrough) -#define ITT_ATTRIBUTE_FALLTHROUGH [[gnu::fallthrough]] -#elif HAS_CPP_ATTR(clang::fallthrough) -#define ITT_ATTRIBUTE_FALLTHROUGH [[clang::fallthrough]] -#elif HAS_GNU_ATTR(fallthrough) && !__INTEL_COMPILER -#define ITT_ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough)) -#else -#define ITT_ATTRIBUTE_FALLTHROUGH -#endif -#endif - -#if ITT_OS==ITT_OS_WIN -static const char* ittnotify_lib_name = "libittnotify.dll"; -#elif ITT_OS==ITT_OS_LINUX || ITT_OS==ITT_OS_FREEBSD|| ITT_OS==ITT_OS_OPENBSD -static const char* ittnotify_lib_name = "libittnotify.so"; -#elif ITT_OS==ITT_OS_MAC -static const char* ittnotify_lib_name = "libittnotify.dylib"; -#else -#error Unsupported or unknown OS. -#endif - -#ifdef __ANDROID__ -#include -#include -#include -#include -#include -#include -#include - -#ifdef ITT_ANDROID_LOG - #define ITT_ANDROID_LOG_TAG "INTEL_VTUNE_USERAPI" - #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__)) - #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__)) - #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__)) - #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__)) -#else - #define ITT_ANDROID_LOGI(...) - #define ITT_ANDROID_LOGW(...) - #define ITT_ANDROID_LOGE(...) - #define ITT_ANDROID_LOGD(...) -#endif - -/* default location of userapi collector on Android */ -#define ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(x) "/data/data/com.intel.vtune/perfrun/lib" \ - #x "/runtime/libittnotify.so" - -#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM -#define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(32) -#else -#define ANDROID_ITTNOTIFY_DEFAULT_PATH ANDROID_ITTNOTIFY_DEFAULT_PATH_MASK(64) -#endif - -#endif - - -#ifndef LIB_VAR_NAME -#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM -#define LIB_VAR_NAME INTEL_LIBITTNOTIFY32 -#else -#define LIB_VAR_NAME INTEL_LIBITTNOTIFY64 -#endif -#endif /* LIB_VAR_NAME */ - -#define ITT_MUTEX_INIT_AND_LOCK(p) { \ - if (PTHREAD_SYMBOLS) \ - { \ - if (!p.mutex_initialized) \ - { \ - if (__itt_interlocked_compare_exchange(&p.atomic_counter, 1, 0) == 0) \ - { \ - __itt_mutex_init(&p.mutex); \ - p.mutex_initialized = 1; \ - } \ - else \ - while (!p.mutex_initialized) \ - __itt_thread_yield(); \ - } \ - __itt_mutex_lock(&p.mutex); \ - } \ -} - -#define ITT_MUTEX_DESTROY(p) { \ - if (PTHREAD_SYMBOLS) \ - { \ - if (p.mutex_initialized) \ - { \ - if (__itt_interlocked_compare_exchange(&p.atomic_counter, 0, 1) == 1) \ - { \ - __itt_mutex_destroy(&p.mutex); \ - p.mutex_initialized = 0; \ - } \ - } \ - } \ -} - -#define ITT_MODULE_OBJECT_VERSION 1 - -typedef int (__itt_init_ittlib_t)(const char*, __itt_group_id); - -/* this define used to control initialization function name. */ -#ifndef __itt_init_ittlib_name -ITT_EXTERN_C int _N_(init_ittlib)(const char*, __itt_group_id); -static __itt_init_ittlib_t* __itt_init_ittlib_ptr = _N_(init_ittlib); -#define __itt_init_ittlib_name __itt_init_ittlib_ptr -#endif /* __itt_init_ittlib_name */ - -typedef void (__itt_fini_ittlib_t)(void); - -/* this define used to control finalization function name. */ -#ifndef __itt_fini_ittlib_name -ITT_EXTERN_C void _N_(fini_ittlib)(void); -static __itt_fini_ittlib_t* __itt_fini_ittlib_ptr = _N_(fini_ittlib); -#define __itt_fini_ittlib_name __itt_fini_ittlib_ptr -#endif /* __itt_fini_ittlib_name */ - -extern __itt_global _N_(_ittapi_global); - -/* building pointers to imported funcs */ -#undef ITT_STUBV -#undef ITT_STUB -#define ITT_STUB(api,type,name,args,params,ptr,group,format) \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\ -typedef type api ITT_JOIN(_N_(name),_t) args; \ -ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \ -{ \ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \ - __itt_init_ittlib_name(NULL, __itt_group_all); \ - if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \ - return ITTNOTIFY_NAME(name) params; \ - else \ - return (type)0; \ -} - -#define ITT_STUBV(api,type,name,args,params,ptr,group,format) \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\ -typedef type api ITT_JOIN(_N_(name),_t) args; \ -ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \ -{ \ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) \ - __itt_init_ittlib_name(NULL, __itt_group_all); \ - if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \ - ITTNOTIFY_NAME(name) params; \ - else \ - return; \ -} - -#undef __ITT_INTERNAL_INIT -#include "ittnotify_static.h" - -#undef ITT_STUB -#undef ITT_STUBV -#define ITT_STUB(api,type,name,args,params,ptr,group,format) \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\ -typedef type api ITT_JOIN(_N_(name),_t) args; \ -ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END - -#define ITT_STUBV(api,type,name,args,params,ptr,group,format) \ -static type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\ -typedef type api ITT_JOIN(_N_(name),_t) args; \ -ITT_EXTERN_C_BEGIN ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); ITT_EXTERN_C_END - -#define __ITT_INTERNAL_INIT -#include "ittnotify_static.h" -#undef __ITT_INTERNAL_INIT - -ITT_GROUP_LIST(group_list); - -#pragma pack(push, 8) - -typedef struct ___itt_group_alias -{ - const char* env_var; - __itt_group_id groups; -} __itt_group_alias; - -static __itt_group_alias group_alias[] = { - { "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_mark) }, - { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) }, - { NULL, (__itt_group_none) }, - { api_version, (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */ -}; - -#pragma pack(pop) - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */ -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -static __itt_api_info api_list[] = { -/* Define functions with static implementation */ -#undef ITT_STUB -#undef ITT_STUBV -#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)}, -#define ITT_STUBV ITT_STUB -#define __ITT_INTERNAL_INIT -#include "ittnotify_static.h" -#undef __ITT_INTERNAL_INIT -/* Define functions without static implementation */ -#undef ITT_STUB -#undef ITT_STUBV -#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)}, -#define ITT_STUBV ITT_STUB -#include "ittnotify_static.h" - {NULL, NULL, NULL, NULL, __itt_group_none} -}; - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(pop) -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/* static part descriptor which handles. all notification api attributes. */ -__itt_global _N_(_ittapi_global) = { - ITT_MAGIC, /* identification info */ - ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD, /* version info */ - 0, /* api_initialized */ - 0, /* mutex_initialized */ - 0, /* atomic_counter */ - MUTEX_INITIALIZER, /* mutex */ - NULL, /* dynamic library handle */ - NULL, /* error_handler */ - NULL, /* dll_path_ptr */ - (__itt_api_info*)&api_list, /* api_list_ptr */ - NULL, /* next __itt_global */ - NULL, /* thread_list */ - NULL, /* domain_list */ - NULL, /* string_list */ - __itt_collection_uninitialized, /* collection state */ - NULL, /* counter_list */ - 0, /* ipt_collect_events */ - NULL, /* histogram_list */ - NULL /* counter_metadata_list */ -}; - -typedef void (__itt_api_init_t)(__itt_global*, __itt_group_id); -typedef void (__itt_api_fini_t)(__itt_global*); - -static __itt_domain dummy_domain; -/* ========================================================================= */ - -#ifdef ITT_NOTIFY_EXT_REPORT -ITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args); -#endif /* ITT_NOTIFY_EXT_REPORT */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */ -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -static void __itt_report_error(int code, ...) -{ - va_list args; - va_start(args, code); - if (_N_(_ittapi_global).error_handler != NULL) - { - __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler; - handler((__itt_error_code)code, args); - } -#ifdef ITT_NOTIFY_EXT_REPORT - _N_(error_handler)((__itt_error_code)code, args); -#endif /* ITT_NOTIFY_EXT_REPORT */ - va_end(args); -} - -static int __itt_is_collector_available(void); - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(pop) -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(const wchar_t* name) -{ - __itt_domain *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(domain_createW)(name); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return &dummy_domain; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameW != NULL && !wcscmp(h->nameW, name)) break; - } - if (h == NULL) - { - NEW_DOMAIN_W(&_N_(_ittapi_global), h, h_tail, name); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return h; -} - -static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init))(const char* name) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(const char* name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_domain *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(domain_createA) && ITTNOTIFY_NAME(domain_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(domain_createA)(name); - } -#else - if (ITTNOTIFY_NAME(domain_create) && ITTNOTIFY_NAME(domain_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(domain_create)(name); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return &dummy_domain; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break; - } - if (h == NULL) - { - NEW_DOMAIN_A(&_N_(_ittapi_global), h, h_tail, name); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return h; -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init))(__itt_module_object* module_obj) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(module_load_with_sections) && ITTNOTIFY_NAME(module_load_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_load_with_sections),_init))) - { - if(module_obj != NULL) - { - module_obj->version = ITT_MODULE_OBJECT_VERSION; - ITTNOTIFY_NAME(module_load_with_sections)(module_obj); - } - } -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init))(__itt_module_object* module_obj) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(module_unload_with_sections) && ITTNOTIFY_NAME(module_unload_with_sections) != ITT_VERSIONIZE(ITT_JOIN(_N_(module_unload_with_sections),_init))) - { - if(module_obj != NULL) - { - module_obj->version = ITT_MODULE_OBJECT_VERSION; - ITTNOTIFY_NAME(module_unload_with_sections)(module_obj); - } - } -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))(const wchar_t* name) -{ - __itt_string_handle *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(string_handle_createW)(name); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next) - { - if (h->strW != NULL && !wcscmp(h->strW, name)) break; - } - if (h == NULL) - { - NEW_STRING_HANDLE_W(&_N_(_ittapi_global), h, h_tail, name); - } - } - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return h; -} - -static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init))(const char* name) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init))(const char* name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_string_handle *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(string_handle_createA) && ITTNOTIFY_NAME(string_handle_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(string_handle_createA)(name); - } -#else - if (ITTNOTIFY_NAME(string_handle_create) && ITTNOTIFY_NAME(string_handle_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(string_handle_create)(name); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next) - { - if (h->strA != NULL && !__itt_fstrcmp(h->strA, name)) break; - } - if (h == NULL) - { - NEW_STRING_HANDLE_A(&_N_(_ittapi_global), h, h_tail, name); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return h; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init))(const wchar_t *name, const wchar_t *domain) -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - __itt_metadata_type type = __itt_metadata_u64; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(counter_createW) && ITTNOTIFY_NAME(counter_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_createW)(name, domain); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) || - (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break; - - } - if (h == NULL) - { - NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type); - } - } - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init))(const char *name, const char *domain) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init))(const char *name, const char *domain) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - __itt_metadata_type type = __itt_metadata_u64; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(counter_createA) && ITTNOTIFY_NAME(counter_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_createA)(name, domain); - } -#else - if (ITTNOTIFY_NAME(counter_create) && ITTNOTIFY_NAME(counter_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_create)(name, domain); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameA != NULL && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) || - (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break; - } - if (h == NULL) - { - NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init))(const wchar_t *name, const wchar_t *domain, __itt_metadata_type type) -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(counter_create_typedW) && ITTNOTIFY_NAME(counter_create_typedW) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedW),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_create_typedW)(name, domain, type); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain == NULL) || - (h->domainW != NULL && domain != NULL && !wcscmp(h->domainW, domain)))) break; - - } - if (h == NULL) - { - NEW_COUNTER_W(&_N_(_ittapi_global), h, h_tail, name, domain, type); - } - } - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init))(const char *name, const char *domain, __itt_metadata_type type) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init))(const char *name, const char *domain, __itt_metadata_type type) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - - if (name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(counter_create_typedA) && ITTNOTIFY_NAME(counter_create_typedA) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typedA),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_create_typedA)(name, domain, type); - } -#else - if (ITTNOTIFY_NAME(counter_create_typed) && ITTNOTIFY_NAME(counter_create_typed) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_typed),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_create_typed)(name, domain, type); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameA != NULL && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain == NULL) || - (h->domainA != NULL && domain != NULL && !__itt_fstrcmp(h->domainA, domain)))) break; - } - if (h == NULL) - { - NEW_COUNTER_A(&_N_(_ittapi_global), h, h_tail, name, domain, type); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW),_init))(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type x_type, __itt_metadata_type y_type) -{ - __itt_histogram *h_tail = NULL, *h = NULL; - - if (domain == NULL || name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(histogram_createW) && ITTNOTIFY_NAME(histogram_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createW),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(histogram_createW)(domain, name, x_type, y_type); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL; h_tail = h, h = h->next) - { - if (h->domain == NULL) continue; - else if (h->domain == domain && h->nameW != NULL && !wcscmp(h->nameW, name)) break; - } - if (h == NULL) - { - NEW_HISTOGRAM_W(&_N_(_ittapi_global), h, h_tail, domain, name, x_type, y_type); - } - } - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_histogram*)h; -} - -static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_histogram* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_create),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_histogram *h_tail = NULL, *h = NULL; - - if (domain == NULL || name == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(histogram_createA) && ITTNOTIFY_NAME(histogram_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_createA),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(histogram_createA)(domain, name, x_type, y_type); - } -#else - if (ITTNOTIFY_NAME(histogram_create) && ITTNOTIFY_NAME(histogram_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(histogram_create),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(histogram_create)(domain, name, x_type, y_type); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).histogram_list; h != NULL; h_tail = h, h = h->next) - { - if (h->domain == NULL) continue; - else if (h->domain == domain && h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break; - } - if (h == NULL) - { - NEW_HISTOGRAM_A(&_N_(_ittapi_global), h, h_tail, domain, name, x_type, y_type); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_histogram*)h; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW_v3),_init))(const __itt_domain* domain, const wchar_t* name, __itt_metadata_type type) -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - - if (name == NULL || domain == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(counter_createW_v3) && ITTNOTIFY_NAME(counter_createW_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createW_v3),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_createW_v3)(domain, name, type); - } - else - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameW != NULL && h->type == (int)type && !wcscmp(h->nameW, name) && ((h->domainW == NULL && domain->nameW == NULL) || - (h->domainW != NULL && domain->nameW != NULL && !wcscmp(h->domainW, domain->nameW)))) break; - - } - if (h == NULL) - { - NEW_COUNTER_W(&_N_(_ittapi_global),h,h_tail,name,domain->nameW,type); - } - } - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA_v3),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type type) -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -static __itt_counter ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_v3),_init))(const __itt_domain* domain, const char* name, __itt_metadata_type type) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - __itt_counter_info_t *h_tail = NULL, *h = NULL; - - if (name == NULL || domain == NULL) - { - return NULL; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(counter_createA_v3) && ITTNOTIFY_NAME(counter_createA_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_createA_v3),_init))) - { - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_createA_v3)(domain, name, type); - } -#else - if (ITTNOTIFY_NAME(counter_create_v3) && ITTNOTIFY_NAME(counter_create_v3) != ITT_VERSIONIZE(ITT_JOIN(_N_(counter_create_v3),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return ITTNOTIFY_NAME(counter_create_v3)(domain, name, type); - } -#endif - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return NULL; - } - } - if (__itt_is_collector_available()) - { - for (h_tail = NULL, h = _N_(_ittapi_global).counter_list; h != NULL; h_tail = h, h = h->next) - { - if (h->nameA != NULL && h->type == (int)type && !__itt_fstrcmp(h->nameA, name) && ((h->domainA == NULL && domain->nameA == NULL) || - (h->domainA != NULL && domain->nameA != NULL && !__itt_fstrcmp(h->domainA, domain->nameA)))) break; - } - if (h == NULL) - { - NEW_COUNTER_A(&_N_(_ittapi_global),h,h_tail,name,domain->nameA,type); - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return (__itt_counter)h; -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(bind_context_metadata_to_counter),_init))(__itt_counter counter, size_t length, __itt_context_metadata* metadata) -{ - __itt_counter_metadata *h_tail = NULL, *h = NULL; - - if (counter == NULL || length == 0 || metadata == NULL) - { - return; - } - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (ITTNOTIFY_NAME(bind_context_metadata_to_counter) && ITTNOTIFY_NAME(bind_context_metadata_to_counter) != ITT_VERSIONIZE(ITT_JOIN(_N_(bind_context_metadata_to_counter),_init))) - { - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - ITTNOTIFY_NAME(bind_context_metadata_to_counter)(counter, length, metadata); - } - else - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#else - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif - return; - } - } - if (__itt_is_collector_available()) - { - size_t item; - char* str_valueA = NULL; -#if ITT_PLATFORM==ITT_PLATFORM_WIN - wchar_t* str_valueW = NULL; -#endif - unsigned long long value = 0; - __itt_context_type type = __itt_context_unknown; - - for (item = 0; item < length; item++) - { - type = metadata[item].type; - for (h_tail = NULL, h = _N_(_ittapi_global).counter_metadata_list; h != NULL; h_tail = h, h = h->next) - { - if (h->counter != NULL && h->counter == counter && h->type == type) break; - } - if (h == NULL && counter != NULL && type != __itt_context_unknown) - { - if (type == __itt_context_nameA || type == __itt_context_deviceA || type == __itt_context_unitsA || type == __itt_context_pci_addrA) - { - str_valueA = (char*)(metadata[item].value); - NEW_COUNTER_METADATA_STR_A(&_N_(_ittapi_global),h,h_tail,counter,type,str_valueA); - } -#if ITT_PLATFORM==ITT_PLATFORM_WIN - else if (type == __itt_context_nameW || type == __itt_context_deviceW || type == __itt_context_unitsW || type == __itt_context_pci_addrW) - { - str_valueW = (wchar_t*)(metadata[item].value); - NEW_COUNTER_METADATA_STR_W(&_N_(_ittapi_global),h,h_tail,counter,type,str_valueW); - } -#endif - else if (type >= __itt_context_tid && type <= __itt_context_cpu_cycles_flag) - { - value = *(unsigned long long*)(metadata[item].value); - NEW_COUNTER_METADATA_NUM(&_N_(_ittapi_global),h,h_tail,counter,type,value); - } - } - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -} -/* -------------------------------------------------------------------------- */ - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))) - { - ITTNOTIFY_NAME(pause)(); - } -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))) - { - ITTNOTIFY_NAME(resume)(); - } -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause_scoped),_init))(__itt_collection_scope scope) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(pause_scoped) && ITTNOTIFY_NAME(pause_scoped) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause_scoped),_init))) - { - ITTNOTIFY_NAME(pause_scoped)(scope); - } -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume_scoped),_init))(__itt_collection_scope scope) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(resume_scoped) && ITTNOTIFY_NAME(resume_scoped) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume_scoped),_init))) - { - ITTNOTIFY_NAME(resume_scoped)(scope); - } -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const wchar_t* name) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))) - { - ITTNOTIFY_NAME(thread_set_nameW)(name); - } -} - -static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen) -{ - (void)namelen; - ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(name); - return 0; -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(const char* name) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const char* name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (ITTNOTIFY_NAME(thread_set_nameA) && ITTNOTIFY_NAME(thread_set_nameA) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))) - { - ITTNOTIFY_NAME(thread_set_nameA)(name); - } -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - if (ITTNOTIFY_NAME(thread_set_name) && ITTNOTIFY_NAME(thread_set_name) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))) - { - ITTNOTIFY_NAME(thread_set_name)(name); - } -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setA),_init))(const char* name, int namelen) -{ - (void)namelen; - ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(name); - return 0; -} -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_set),_init))(const char* name, int namelen) -{ - (void)namelen; - ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(name); - return 0; -} -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))) - { - ITTNOTIFY_NAME(thread_ignore)(); - } -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void) -{ - ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(); -} - -static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void) -{ -#ifdef __ANDROID__ - /* - * if LIB_VAR_NAME env variable were set before then stay previous value - * else set default path - */ - setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0); -#endif -} - -/* -------------------------------------------------------------------------- */ - -static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len) -{ - int i; - int j; - - if (!s || !sep || !out || !len) - return NULL; - - for (i = 0; s[i]; i++) - { - int b = 0; - for (j = 0; sep[j]; j++) - if (s[i] == sep[j]) - { - b = 1; - break; - } - if (!b) - break; - } - - if (!s[i]) - return NULL; - - *len = 0; - *out = &s[i]; - - for (; s[i]; i++, (*len)++) - { - int b = 0; - for (j = 0; sep[j]; j++) - if (s[i] == sep[j]) - { - b = 1; - break; - } - if (b) - break; - } - - for (; s[i]; i++) - { - int b = 0; - for (j = 0; sep[j]; j++) - if (s[i] == sep[j]) - { - b = 1; - break; - } - if (!b) - break; - } - - return &s[i]; -} - -/* This function return value of env variable that placed into static buffer. - * !!! The same static buffer is used for subsequent calls. !!! - * This was done to avoid dynamic allocation for few calls. - * Actually we need this function only four times. - */ -static const char* __itt_get_env_var(const char* name) -{ -#define MAX_ENV_VALUE_SIZE 4086 - static char env_buff[MAX_ENV_VALUE_SIZE]; - static char* env_value = (char*)env_buff; - - if (name != NULL) - { -#if ITT_PLATFORM==ITT_PLATFORM_WIN - size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff); - DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len); - if (rc >= max_len) - __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1, (size_t)(max_len - 1)); - else if (rc > 0) - { - const char* ret = (const char*)env_value; - env_value += rc + 1; - return ret; - } - else - { - /* If environment variable is empty, GetEnvironmentVariables() - * returns zero (number of characters (not including terminating null), - * and GetLastError() returns ERROR_SUCCESS. */ - DWORD err = GetLastError(); - if (err == ERROR_SUCCESS) - return env_value; - - if (err != ERROR_ENVVAR_NOT_FOUND) - __itt_report_error(__itt_error_cant_read_env, name, (int)err); - } -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ - char* env = getenv(name); - if (env != NULL) - { - size_t len = __itt_fstrnlen(env, MAX_ENV_VALUE_SIZE); - size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff); - if (len < max_len) - { - const char* ret = (const char*)env_value; - __itt_fstrcpyn(env_value, max_len, env, len + 1); - env_value += len + 1; - return ret; - } else - __itt_report_error(__itt_error_env_too_long, name, (size_t)len, (size_t)(max_len - 1)); - } -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - } - return NULL; -} - -static const char* __itt_get_lib_name(void) -{ - const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME)); - -#ifdef __ANDROID__ - if (lib_name == NULL) - { - -#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM - const char* const marker_filename = "com.intel.itt.collector_lib_32"; -#else - const char* const marker_filename = "com.intel.itt.collector_lib_64"; -#endif - - char system_wide_marker_filename[PATH_MAX] = {0}; - int itt_marker_file_fd = -1; - ssize_t res = 0; - - res = snprintf(system_wide_marker_filename, PATH_MAX - 1, "%s%s", "/data/local/tmp/", marker_filename); - if (res < 0) - { - ITT_ANDROID_LOGE("Unable to concatenate marker file string."); - return lib_name; - } - itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY); - - if (itt_marker_file_fd == -1) - { - const pid_t my_pid = getpid(); - char cmdline_path[PATH_MAX] = {0}; - char package_name[PATH_MAX] = {0}; - char app_sandbox_file[PATH_MAX] = {0}; - int cmdline_fd = 0; - - ITT_ANDROID_LOGI("Unable to open system-wide marker file."); - res = snprintf(cmdline_path, PATH_MAX - 1, "/proc/%d/cmdline", my_pid); - if (res < 0) - { - ITT_ANDROID_LOGE("Unable to get cmdline path string."); - return lib_name; - } - - ITT_ANDROID_LOGI("CMD file: %s\n", cmdline_path); - cmdline_fd = open(cmdline_path, O_RDONLY); - if (cmdline_fd == -1) - { - ITT_ANDROID_LOGE("Unable to open %s file!", cmdline_path); - return lib_name; - } - res = read(cmdline_fd, package_name, PATH_MAX - 1); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to read %s file!", cmdline_path); - res = close(cmdline_fd); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path); - } - return lib_name; - } - res = close(cmdline_fd); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path); - return lib_name; - } - ITT_ANDROID_LOGI("Package name: %s\n", package_name); - res = snprintf(app_sandbox_file, PATH_MAX - 1, "/data/data/%s/%s", package_name, marker_filename); - if (res < 0) - { - ITT_ANDROID_LOGE("Unable to concatenate marker file string."); - return lib_name; - } - - ITT_ANDROID_LOGI("Lib marker file name: %s\n", app_sandbox_file); - itt_marker_file_fd = open(app_sandbox_file, O_RDONLY); - if (itt_marker_file_fd == -1) - { - ITT_ANDROID_LOGE("Unable to open app marker file!"); - return lib_name; - } - } - - { - char itt_lib_name[PATH_MAX] = {0}; - - res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to read %s file!", itt_marker_file_fd); - res = close(itt_marker_file_fd); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd); - } - return lib_name; - } - ITT_ANDROID_LOGI("ITT Lib path: %s", itt_lib_name); - res = close(itt_marker_file_fd); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd); - return lib_name; - } - ITT_ANDROID_LOGI("Set env %s to %s", ITT_TO_STR(LIB_VAR_NAME), itt_lib_name); - res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0); - if (res == -1) - { - ITT_ANDROID_LOGE("Unable to set env var!"); - return lib_name; - } - lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME)); - ITT_ANDROID_LOGI("ITT Lib path from env: %s", lib_name); - } - } -#endif - - return lib_name; -} - -/* Avoid clashes with std::min */ -#define __itt_min(a,b) ((a) < (b) ? (a) : (b)) - -static __itt_group_id __itt_get_groups(void) -{ - int i; - __itt_group_id res = __itt_group_none; - const char* var_name = "INTEL_ITTNOTIFY_GROUPS"; - const char* group_str = __itt_get_env_var(var_name); - - if (group_str != NULL) - { - int len; - char gr[255]; - const char* chunk; - while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL) - { - int min_len = __itt_min(len, (int)(sizeof(gr) - 1)); - __itt_fstrcpyn(gr, sizeof(gr) - 1, chunk, min_len); - gr[min_len] = 0; - - for (i = 0; group_list[i].name != NULL; i++) - { - if (!__itt_fstrcmp(gr, group_list[i].name)) - { - res = (__itt_group_id)(res | group_list[i].id); - break; - } - } - } - /* TODO: !!! Workaround for bug with warning for unknown group !!! - * Should be fixed in new initialization scheme. - * Now the following groups should be set always. */ - for (i = 0; group_list[i].id != __itt_group_none; i++) - if (group_list[i].id != __itt_group_all && - group_list[i].id > __itt_group_splitter_min && - group_list[i].id < __itt_group_splitter_max) - res = (__itt_group_id)(res | group_list[i].id); - return res; - } - else - { - for (i = 0; group_alias[i].env_var != NULL; i++) - if (__itt_get_env_var(group_alias[i].env_var) != NULL) - return group_alias[i].groups; - } - - return res; -} - -#undef __itt_min - -static int __itt_lib_version(lib_t lib) -{ - if (lib == NULL) - return 0; - if (__itt_get_proc(lib, "__itt_api_init")) - return 2; - if (__itt_get_proc(lib, "__itt_api_version")) - return 1; - return 0; -} - -/* It's not used right now! Comment it out to avoid warnings. -static void __itt_reinit_all_pointers(void) -{ - register int i; - // Fill all pointers with initial stubs - for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) - *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func; -} -*/ - -static void __itt_nullify_all_pointers(void) -{ - int i; - /* Nulify all pointers except domain_create, string_handle_create and counter_create */ - for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) - *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; -} - -static int __itt_is_collector_available(void) -{ - int is_available; - - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).state == __itt_collection_uninitialized) - { - _N_(_ittapi_global).state = (NULL == __itt_get_lib_name()) ? __itt_collection_collector_absent : __itt_collection_collector_exists; - } - is_available = (_N_(_ittapi_global).state == __itt_collection_collector_exists || - _N_(_ittapi_global).state == __itt_collection_init_successful); - __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - return is_available; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */ -#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */ -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -ITT_EXTERN_C void _N_(fini_ittlib)(void) -{ - __itt_api_fini_t* __itt_api_fini_ptr = NULL; - static volatile TIDT current_thread = 0; - - if (_N_(_ittapi_global).api_initialized) - { - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - if (_N_(_ittapi_global).api_initialized) - { - if (current_thread == 0) - { - if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id(); - if (_N_(_ittapi_global).lib != NULL) - { - __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_fini"); - } - if (__itt_api_fini_ptr) - { - __itt_api_fini_ptr(&_N_(_ittapi_global)); - } - - __itt_nullify_all_pointers(); - - /* TODO: !!! not safe !!! don't support unload so far. - * if (_N_(_ittapi_global).lib != NULL) - * __itt_unload_lib(_N_(_ittapi_global).lib); - * _N_(_ittapi_global).lib = NULL; - */ - _N_(_ittapi_global).api_initialized = 0; - current_thread = 0; - } - } - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - } -} - -/* !!! this function should be called under mutex lock !!! */ -static void __itt_free_allocated_resources(void) -{ - __itt_string_handle* current_string = _N_(_ittapi_global).string_list; - while (current_string != NULL) - { - __itt_string_handle* tmp = current_string->next; - free((char*)current_string->strA); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - free((wchar_t*)current_string->strW); -#endif - free(current_string); - current_string = tmp; - } - _N_(_ittapi_global).string_list = NULL; - - __itt_domain* current_domain = _N_(_ittapi_global).domain_list; - while (current_domain != NULL) - { - __itt_domain* tmp = current_domain->next; - free((char*)current_domain->nameA); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - free((wchar_t*)current_domain->nameW); -#endif - free(current_domain); - current_domain = tmp; - } - _N_(_ittapi_global).domain_list = NULL; - - __itt_counter_info_t* current_couter = _N_(_ittapi_global).counter_list; - while (current_couter != NULL) - { - __itt_counter_info_t* tmp = current_couter->next; - free((char*)current_couter->nameA); - free((char*)current_couter->domainA); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - free((wchar_t*)current_couter->nameW); - free((wchar_t*)current_couter->domainW); -#endif - free(current_couter); - current_couter = tmp; - } - _N_(_ittapi_global).counter_list = NULL; - - __itt_histogram* current_histogram = _N_(_ittapi_global).histogram_list; - while (current_histogram != NULL) - { - __itt_histogram* tmp = current_histogram->next; - free((char*)current_histogram->nameA); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - free((wchar_t*)current_histogram->nameW); -#endif - free(current_histogram); - current_histogram = tmp; - } - _N_(_ittapi_global).histogram_list = NULL; - - - __itt_counter_metadata* current_counter_metadata = _N_(_ittapi_global).counter_metadata_list; - while (current_counter_metadata != NULL) - { - __itt_counter_metadata* tmp = current_counter_metadata->next; - free((char*)current_counter_metadata->str_valueA); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - free((wchar_t*)current_counter_metadata->str_valueW); -#endif - free(current_counter_metadata); - current_counter_metadata = tmp; - } - _N_(_ittapi_global).counter_metadata_list = NULL; -} - -ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_groups) -{ - int i; - __itt_group_id groups; -#ifdef ITT_COMPLETE_GROUP - __itt_group_id zero_group = __itt_group_none; -#endif /* ITT_COMPLETE_GROUP */ - static volatile TIDT current_thread = 0; - - if (!_N_(_ittapi_global).api_initialized) - { -#ifndef ITT_SIMPLE_INIT - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); -#endif /* ITT_SIMPLE_INIT */ - - if (!_N_(_ittapi_global).api_initialized) - { - if (current_thread == 0) - { - if (PTHREAD_SYMBOLS) current_thread = __itt_thread_id(); - if (lib_name == NULL) - { - lib_name = __itt_get_lib_name(); - } - groups = __itt_get_groups(); - if (DL_SYMBOLS && (groups != __itt_group_none || lib_name != NULL)) - { - _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name); - - if (_N_(_ittapi_global).lib != NULL) - { - _N_(_ittapi_global).state = __itt_collection_init_successful; - __itt_api_init_t* __itt_api_init_ptr; - int lib_version = __itt_lib_version(_N_(_ittapi_global).lib); - - switch (lib_version) - { - case 0: - groups = __itt_group_legacy; - ITT_ATTRIBUTE_FALLTHROUGH; - case 1: - /* Fill all pointers from dynamic library */ - for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) - { - if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups) - { - *_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); - if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL) - { - /* Restore pointers for function with static implementation */ - *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; - __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name); -#ifdef ITT_COMPLETE_GROUP - zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group); -#endif /* ITT_COMPLETE_GROUP */ - } - } - else - *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; - } - - if (groups == __itt_group_legacy) - { - /* Compatibility with legacy tools */ - ITTNOTIFY_NAME(thread_ignore) = ITTNOTIFY_NAME(thr_ignore); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - ITTNOTIFY_NAME(sync_createA) = ITTNOTIFY_NAME(sync_set_nameA); - ITTNOTIFY_NAME(sync_createW) = ITTNOTIFY_NAME(sync_set_nameW); -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ - ITTNOTIFY_NAME(sync_create) = ITTNOTIFY_NAME(sync_set_name); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - ITTNOTIFY_NAME(sync_prepare) = ITTNOTIFY_NAME(notify_sync_prepare); - ITTNOTIFY_NAME(sync_cancel) = ITTNOTIFY_NAME(notify_sync_cancel); - ITTNOTIFY_NAME(sync_acquired) = ITTNOTIFY_NAME(notify_sync_acquired); - ITTNOTIFY_NAME(sync_releasing) = ITTNOTIFY_NAME(notify_sync_releasing); - } - -#ifdef ITT_COMPLETE_GROUP - for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) - if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group) - *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; -#endif /* ITT_COMPLETE_GROUP */ - break; - case 2: - __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_init"); - if (__itt_api_init_ptr) - __itt_api_init_ptr(&_N_(_ittapi_global), init_groups); - break; - } - } - else - { - _N_(_ittapi_global).state = __itt_collection_init_fail; - __itt_free_allocated_resources(); - __itt_nullify_all_pointers(); - - __itt_report_error(__itt_error_no_module, lib_name, -#if ITT_PLATFORM==ITT_PLATFORM_WIN - __itt_system_error() -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - dlerror() -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - ); - } - } - else - { - _N_(_ittapi_global).state = __itt_collection_collector_absent; - __itt_nullify_all_pointers(); - } - _N_(_ittapi_global).api_initialized = 1; - current_thread = 0; - /* !!! Just to avoid unused code elimination !!! */ - if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0; - } - } - -#ifndef ITT_SIMPLE_INIT - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); -#endif /* ITT_SIMPLE_INIT */ - } - - /* Evaluating if any function ptr is non empty and it's in init_groups */ - for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) - { - if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func && - _N_(_ittapi_global).api_list_ptr[i].group & init_groups) - { - return 1; - } - } - return 0; -} - -ITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler) -{ - __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler; - _N_(_ittapi_global).error_handler = (void*)(size_t)handler; - return prev; -} - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#if _MSC_VER -#pragma warning(pop) -#endif -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** __itt_mark_pt_region functions marks region of interest - * region parameter defines different regions. - * 0 <= region < 8 */ - -#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__) -void __itt_pt_mark(__itt_pt_region region); -void __itt_pt_mark_event(__itt_pt_region region); -#endif - -ITT_EXTERN_C void _N_(mark_pt_region_begin)(__itt_pt_region region) -{ -#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__) - if (_N_(_ittapi_global).ipt_collect_events == 1) - { - __itt_pt_mark_event(2*region); - } - else - { - __itt_pt_mark(2*region); - } -#else - (void)region; -#endif -} - -ITT_EXTERN_C void _N_(mark_pt_region_end)(__itt_pt_region region) -{ -#if defined(ITT_API_IPT_SUPPORT) && (ITT_PLATFORM==ITT_PLATFORM_WIN || ITT_PLATFORM==ITT_PLATFORM_POSIX) && !defined(__ANDROID__) - if (_N_(_ittapi_global).ipt_collect_events == 1) - { - __itt_pt_mark_event(2*region + 1); - } - else - { - __itt_pt_mark(2*region + 1); - } -#else - (void)region; -#endif -} - -ITT_EXTERN_C __itt_collection_state (_N_(get_collection_state))(void) -{ - if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list == NULL) - { - __itt_init_ittlib_name(NULL, __itt_group_all); - } - return _N_(_ittapi_global).state; -} - -/* !!! should be called from the library destructor !!! - * this function destroys the mutex and frees resources - * allocated by ITT API static part - */ -ITT_EXTERN_C void (_N_(release_resources))(void) -{ - ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); - __itt_free_allocated_resources(); - if (PTHREAD_SYMBOLS) __itt_mutex_unlock(&_N_(_ittapi_global).mutex); - ITT_MUTEX_DESTROY(_N_(_ittapi_global)); -} diff --git a/src/tbb/tools_api/ittnotify_static.h b/src/tbb/tools_api/ittnotify_static.h deleted file mode 100644 index 7f57291401..0000000000 --- a/src/tbb/tools_api/ittnotify_static.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - Copyright (c) 2005-2023 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ittnotify_config.h" - -#ifndef ITT_FORMAT_DEFINED -# ifndef ITT_FORMAT -# define ITT_FORMAT -# endif /* ITT_FORMAT */ -# ifndef ITT_NO_PARAMS -# define ITT_NO_PARAMS -# endif /* ITT_NO_PARAMS */ -#endif /* ITT_FORMAT_DEFINED */ - -/* - * parameters for macro expected: - * ITT_STUB(api, type, func_name, arguments, params, func_name_in_dll, group, printf_fmt) - */ -#ifdef __ITT_INTERNAL_INIT - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char *name), (ITT_FORMAT name), domain_createA, __itt_group_structure, "\"%s\"") -ITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name), (ITT_FORMAT name), domain_createW, __itt_group_structure, "\"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_domain*, domain_create, (const char *name), (ITT_FORMAT name), domain_create, __itt_group_structure, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -ITT_STUBV(ITTAPI, void, module_load_with_sections, (__itt_module_object* module_obj), (ITT_FORMAT module_obj), module_load_with_sections, __itt_group_module, "%p") -ITT_STUBV(ITTAPI, void, module_unload_with_sections, (__itt_module_object* module_obj), (ITT_FORMAT module_obj), module_unload_with_sections, __itt_group_module, "%p") - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char *name), (ITT_FORMAT name), string_handle_createA, __itt_group_structure, "\"%s\"") -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name), (ITT_FORMAT name), string_handle_createW, __itt_group_structure, "\"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create, (const char *name), (ITT_FORMAT name), string_handle_create, __itt_group_structure, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char *name, const char *domain), (ITT_FORMAT name, domain), counter_createA, __itt_group_counter, "\"%s\", \"%s\"") -ITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), counter_createW, __itt_group_counter, "\"%s\", \"%s\"") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create, (const char *name, const char *domain), (ITT_FORMAT name, domain), counter_create, __itt_group_counter, "\"%s\", \"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_create_typedA, (const char *name, const char *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typedA, __itt_group_counter, "\"%s\", \"%s\", %d") -ITT_STUB(ITTAPI, __itt_counter, counter_create_typedW, (const wchar_t *name, const wchar_t *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typedW, __itt_group_counter, "\"%s\", \"%s\", %d") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create_typed, (const char *name, const char *domain, __itt_metadata_type type), (ITT_FORMAT name, domain, type), counter_create_typed, __itt_group_counter, "\"%s\", \"%s\", %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - - -ITT_STUBV(ITTAPI, void, pause, (void), (ITT_NO_PARAMS), pause, __itt_group_control | __itt_group_legacy, "no args") -ITT_STUBV(ITTAPI, void, resume, (void), (ITT_NO_PARAMS), resume, __itt_group_control | __itt_group_legacy, "no args") -ITT_STUBV(ITTAPI, void, pause_scoped, (__itt_collection_scope scope), (ITT_FORMAT scope), pause_scoped, __itt_group_control, "%d") -ITT_STUBV(ITTAPI, void, resume_scoped, (__itt_collection_scope scope), (ITT_FORMAT scope), resume_scoped, __itt_group_control, "%d") - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, thread_set_nameA, (const char *name), (ITT_FORMAT name), thread_set_nameA, __itt_group_thread, "\"%s\"") -ITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name), (ITT_FORMAT name), thread_set_nameW, __itt_group_thread, "\"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, thread_set_name, (const char *name), (ITT_FORMAT name), thread_set_name, __itt_group_thread, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, thread_ignore, (void), (ITT_NO_PARAMS), thread_ignore, __itt_group_thread, "no args") - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, int, thr_name_setA, (const char *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setA, __itt_group_thread | __itt_group_legacy, "\"%s\", %d") -ITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setW, __itt_group_thread | __itt_group_legacy, "\"%S\", %d") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen), (ITT_FORMAT name, namelen), thr_name_set, __itt_group_thread | __itt_group_legacy, "\"%s\", %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(LIBITTAPI, void, thr_ignore, (void), (ITT_NO_PARAMS), thr_ignore, __itt_group_thread | __itt_group_legacy, "no args") - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_histogram*, histogram_createA, (const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type), (ITT_FORMAT domain, name, x_type, y_type), histogram_createA, __itt_group_structure, "%p, \"%s\", %d, %d") -ITT_STUB(ITTAPI, __itt_histogram*, histogram_createW, (const __itt_domain* domain, const wchar_t* name, __itt_metadata_type x_type, __itt_metadata_type y_type), (ITT_FORMAT domain, name, x_type, y_type), histogram_createW, __itt_group_structure, "%p, \"%s\", %d, %d") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_histogram*, histogram_create, (const __itt_domain* domain, const char* name, __itt_metadata_type x_type, __itt_metadata_type y_type), (ITT_FORMAT domain, name, x_type, y_type), histogram_create, __itt_group_structure, "%p, \"%s\", %d, %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - - #if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_counter, counter_createA_v3, (const __itt_domain* domain, const char *name, __itt_metadata_type type), (ITT_FORMAT domain, name, type), counter_createA_v3, __itt_group_counter, "%p, \"%s\", %d") -ITT_STUB(ITTAPI, __itt_counter, counter_createW_v3, (const __itt_domain* domain, const wchar_t *name, __itt_metadata_type type), (ITT_FORMAT domain, name, type), counter_createW_v3, __itt_group_counter, "%p, \"%s\", %d") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_counter, counter_create_v3, (const __itt_domain* domain, const char *name, __itt_metadata_type type), (ITT_FORMAT domain, name, type), counter_create_v3, __itt_group_counter, "%p, \"%s\", %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -ITT_STUBV(ITTAPI, void, bind_context_metadata_to_counter, (__itt_counter counter, size_t length, __itt_context_metadata* metadata), (ITT_FORMAT counter, length, metadata), bind_context_metadata_to_counter, __itt_group_structure, "%p, %lu, %p") - -#endif /* __ITT_INTERNAL_BODY */ - -ITT_STUBV(ITTAPI, void, enable_attach, (void), (ITT_NO_PARAMS), enable_attach, __itt_group_all, "no args") - -#else /* __ITT_INTERNAL_INIT */ - -ITT_STUBV(ITTAPI, void, detach, (void), (ITT_NO_PARAMS), detach, __itt_group_control | __itt_group_legacy, "no args") - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x") -ITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\", \"%S\", %x") -ITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char *name), (ITT_FORMAT addr, name), sync_renameA, __itt_group_sync | __itt_group_fsync, "%p, \"%s\"") -ITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name), (ITT_FORMAT addr, name), sync_renameW, __itt_group_sync | __itt_group_fsync, "%p, \"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_create, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_create, __itt_group_sync | __itt_group_fsync, "%p, \"%s\", \"%s\", %x") -ITT_STUBV(ITTAPI, void, sync_rename, (void *addr, const char *name), (ITT_FORMAT addr, name), sync_rename, __itt_group_sync | __itt_group_fsync, "%p, \"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_destroy, (void *addr), (ITT_FORMAT addr), sync_destroy, __itt_group_sync | __itt_group_fsync, "%p") - -ITT_STUBV(ITTAPI, void, sync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_sync, "%p") -ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_sync, "%p") -ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_sync, "%p") -ITT_STUBV(ITTAPI, void, sync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync, "%p") - -ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask), (ITT_FORMAT mask), suppress_push, __itt_group_suppress, "%p") -ITT_STUBV(ITTAPI, void, suppress_pop, (void), (ITT_NO_PARAMS), suppress_pop, __itt_group_suppress, "no args") -ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_mark_range, __itt_group_suppress, "%d, %p, %p, %d") -ITT_STUBV(ITTAPI, void, suppress_clear_range,(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_clear_range,__itt_group_suppress, "%d, %p, %p, %d") - -ITT_STUBV(ITTAPI, void, fsync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_fsync, "%p") -ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_fsync, "%p") -ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_fsync, "%p") -ITT_STUBV(ITTAPI, void, fsync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_fsync, "%p") - -ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_site_instance *instance, const char *name), (ITT_FORMAT site, instance, name), model_site_begin, __itt_group_model, "%p, %p, \"%s\"") -ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance), (ITT_FORMAT site, instance), model_site_end, __itt_group_model, "%p, %p") -ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name), (ITT_FORMAT task, instance, name), model_task_begin, __itt_group_model, "%p, %p, \"%s\"") -ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance), (ITT_FORMAT task, instance), model_task_end, __itt_group_model, "%p, %p") -ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock), (ITT_FORMAT lock), model_lock_acquire, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock), (ITT_FORMAT lock), model_lock_release, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_record_allocation, (void *addr, size_t size), (ITT_FORMAT addr, size), model_record_allocation, __itt_group_model, "%p, %d") -ITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr), (ITT_FORMAT addr), model_record_deallocation, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_induction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_induction_uses, __itt_group_model, "%p, %d") -ITT_STUBV(ITTAPI, void, model_reduction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses, __itt_group_model, "%p, %d") -ITT_STUBV(ITTAPI, void, model_observe_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses, __itt_group_model, "%p, %d") -ITT_STUBV(ITTAPI, void, model_clear_uses, (void* addr), (ITT_FORMAT addr), model_clear_uses, __itt_group_model, "%p") - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name), (ITT_FORMAT name), model_site_beginW, __itt_group_model, "\"%s\"") -ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name), (ITT_FORMAT name), model_task_beginW, __itt_group_model, "\"%s\"") -ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name), (ITT_FORMAT name), model_iteration_taskW, __itt_group_model, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name), (ITT_FORMAT name), model_site_beginA, __itt_group_model, "\"%s\"") -ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL, __itt_group_model, "\"%s\", %d") -ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name), (ITT_FORMAT name), model_task_beginA, __itt_group_model, "\"%s\"") -ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL, __itt_group_model, "\"%s\", %d") -ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name), (ITT_FORMAT name), model_iteration_taskA, __itt_group_model, "\"%s\"") -ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, "\"%s\", %d") -ITT_STUBV(ITTAPI, void, model_site_end_2, (void), (ITT_NO_PARAMS), model_site_end_2, __itt_group_model, "no args") -ITT_STUBV(ITTAPI, void, model_task_end_2, (void), (ITT_NO_PARAMS), model_task_end_2, __itt_group_model, "no args") -ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock), (ITT_FORMAT lock), model_lock_acquire_2, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock), (ITT_FORMAT lock), model_lock_release_2, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t count), (ITT_FORMAT count), model_aggregate_task, __itt_group_model, "%d") -ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args") -#endif /* __ITT_INTERNAL_BODY */ - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char *name, const char *domain), (ITT_FORMAT name, domain), heap_function_createA, __itt_group_heap, "\"%s\", \"%s\"") -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), heap_function_createW, __itt_group_heap, "\"%s\", \"%s\"") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_heap_function, heap_function_create, (const char *name, const char *domain), (ITT_FORMAT name, domain), heap_function_create, __itt_group_heap, "\"%s\", \"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* __ITT_INTERNAL_BODY */ -ITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized), (ITT_FORMAT h, size, initialized), heap_allocate_begin, __itt_group_heap, "%p, %lu, %d") -ITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void** addr, size_t size, int initialized), (ITT_FORMAT h, addr, size, initialized), heap_allocate_end, __itt_group_heap, "%p, %p, %lu, %d") -ITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr), (ITT_FORMAT h, addr), heap_free_begin, __itt_group_heap, "%p, %p") -ITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr), (ITT_FORMAT h, addr), heap_free_end, __itt_group_heap, "%p, %p") -ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_size, initialized), heap_reallocate_begin, __itt_group_heap, "%p, %p, %lu, %d") -ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end, __itt_group_heap, "%p, %p, %p, %lu, %d") -ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, "no args") -ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void), (ITT_NO_PARAMS), heap_internal_access_end, __itt_group_heap, "no args") -ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void), (ITT_NO_PARAMS), heap_record_memory_growth_begin, __itt_group_heap, "no args") -ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void), (ITT_NO_PARAMS), heap_record_memory_growth_end, __itt_group_heap, "no args") -ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask), (ITT_FORMAT reset_mask), heap_reset_detection, __itt_group_heap, "%u") -ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask), (ITT_FORMAT record_mask), heap_record, __itt_group_heap, "%u") - -ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_create, __itt_group_structure, "%p, %lu") -ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_destroy, __itt_group_structure, "%p, %lu") - -ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void), (ITT_NO_PARAMS), get_timestamp, __itt_group_structure, "no args") - -ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), region_begin, __itt_group_structure, "%p, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, region_end, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), region_end, __itt_group_structure, "%p, %lu") - -#ifndef __ITT_INTERNAL_BODY -ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_begin_v3, __itt_group_structure, "%p, %p") -ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_end_v3, __itt_group_structure, "%p, %p") -ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, "%p, %p, %lu, %lu") -#endif /* __ITT_INTERNAL_BODY */ - -ITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_group, __itt_group_structure, "%p, %lu, %lu, %p") - -ITT_STUBV(ITTAPI, void, task_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_begin, __itt_group_structure, "%p, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parent, void* fn), (ITT_FORMAT domain, id, parent, fn), task_begin_fn, __itt_group_structure, "%p, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_end, (const __itt_domain *domain), (ITT_FORMAT domain), task_end, __itt_group_structure, "%p") - -ITT_STUBV(ITTAPI, void, counter_inc_v3, (const __itt_domain *domain, __itt_string_handle *name), (ITT_FORMAT domain, name), counter_inc_v3, __itt_group_structure, "%p, %p") -ITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long value), (ITT_FORMAT domain, name, value), counter_inc_delta_v3, __itt_group_structure, "%p, %p, %lu") -ITT_STUBV(ITTAPI, void, counter_dec_v3, (const __itt_domain *domain, __itt_string_handle *name), (ITT_FORMAT domain, name), counter_dec_v3, __itt_group_structure, "%p, %p") -ITT_STUBV(ITTAPI, void, counter_dec_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long value), (ITT_FORMAT domain, name, value), counter_dec_delta_v3, __itt_group_structure, "%p, %p, %lu") - -ITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, id, name, scope), marker, __itt_group_structure, "%p, %lu, %p, %d") - -ITT_STUBV(ITTAPI, void, metadata_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, id, key, type, count, data), metadata_add, __itt_group_structure, "%p, %lu, %p, %d, %lu, %p") -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length), (ITT_FORMAT domain, id, key, data, length), metadata_str_addA, __itt_group_structure, "%p, %lu, %p, %p, %lu") -ITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t* data, size_t length), (ITT_FORMAT domain, id, key, data, length), metadata_str_addW, __itt_group_structure, "%p, %lu, %p, %p, %lu") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length), (ITT_FORMAT domain, id, key, data, length), metadata_str_add, __itt_group_structure, "%p, %lu, %p, %p, %lu") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -ITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, relation, tail), relation_add_to_current, __itt_group_structure, "%p, %lu, %p") -ITT_STUBV(ITTAPI, void, relation_add, (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, head, relation, tail), relation_add, __itt_group_structure, "%p, %p, %lu, %p") - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen), (ITT_FORMAT name, namelen), event_createA, __itt_group_mark | __itt_group_legacy, "\"%s\", %d") -ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), event_createW, __itt_group_mark | __itt_group_legacy, "\"%S\", %d") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen), (ITT_FORMAT name, namelen), event_create, __itt_group_mark | __itt_group_legacy, "\"%s\", %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event), (ITT_FORMAT event), event_start, __itt_group_mark | __itt_group_legacy, "%d") -ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event), (ITT_FORMAT event), event_end, __itt_group_mark | __itt_group_legacy, "%d") -#endif /* __ITT_INTERNAL_BODY */ - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", \"%s\", %x") -ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", \"%S\", %x") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_set_name, (void *addr, const char *objtype, const char *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_name, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "p, \"%s\", \"%s\", %x") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *p, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x") -ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *p, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%S\", %d, \"%S\", %d, %x") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, int, notify_sync_name, (void *p, const char *objtype, int typelen, const char *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_name, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p, \"%s\", %d, \"%s\", %d, %x") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -ITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *p), (ITT_FORMAT p), notify_sync_prepare, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p") -ITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *p), (ITT_FORMAT p), notify_sync_cancel, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p") -ITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *p), (ITT_FORMAT p), notify_sync_acquired, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p") -ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *p), (ITT_FORMAT p), notify_sync_releasing, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, "%p") -#endif /* __ITT_INTERNAL_BODY */ - -ITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_read, __itt_group_legacy, "%p, %lu") -ITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_write, __itt_group_legacy, "%p, %lu") -ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_update, __itt_group_legacy, "%p, %lu") - -ITT_STUB(LIBITTAPI, __itt_state_t, state_get, (void), (ITT_NO_PARAMS), state_get, __itt_group_legacy, "no args") -ITT_STUB(LIBITTAPI, __itt_state_t, state_set, (__itt_state_t s), (ITT_FORMAT s), state_set, __itt_group_legacy, "%d") -ITT_STUB(LIBITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s), (ITT_FORMAT p, s), obj_mode_set, __itt_group_legacy, "%d, %d") -ITT_STUB(LIBITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s), (ITT_FORMAT p, s), thr_mode_set, __itt_group_legacy, "%d, %d") - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char *domain), (ITT_FORMAT domain), frame_createA, __itt_group_frame, "\"%s\"") -ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain), (ITT_FORMAT domain), frame_createW, __itt_group_frame, "\"%s\"") -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_frame, frame_create, (const char *domain), (ITT_FORMAT domain), frame_create, __itt_group_frame, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createA, (const char *name), (ITT_FORMAT name), pt_region_createA, __itt_group_structure, "\"%s\"") -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_createW, (const wchar_t *name), (ITT_FORMAT name), pt_region_createW, __itt_group_structure, "\"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_pt_region, pt_region_create, (const char *name), (ITT_FORMAT name), pt_region_create, __itt_group_structure, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* __ITT_INTERNAL_BODY */ -ITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame), (ITT_FORMAT frame), frame_begin, __itt_group_frame, "%p") -ITT_STUBV(ITTAPI, void, frame_end, (__itt_frame frame), (ITT_FORMAT frame), frame_end, __itt_group_frame, "%p") - -ITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id), (ITT_FORMAT id), counter_destroy, __itt_group_counter, "%p") -ITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id), (ITT_FORMAT id), counter_inc, __itt_group_counter, "%p") -ITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value), (ITT_FORMAT id, value), counter_inc_delta, __itt_group_counter, "%p, %lu") -ITT_STUBV(ITTAPI, void, counter_dec, (__itt_counter id), (ITT_FORMAT id), counter_dec, __itt_group_counter, "%p") -ITT_STUBV(ITTAPI, void, counter_dec_delta, (__itt_counter id, unsigned long long value), (ITT_FORMAT id, value), counter_dec_delta, __itt_group_counter, "%p, %lu") -ITT_STUBV(ITTAPI, void, counter_set_value, (__itt_counter id, void *value_ptr), (ITT_FORMAT id, value_ptr), counter_set_value, __itt_group_counter, "%p, %p") -ITT_STUBV(ITTAPI, void, counter_set_value_ex, (__itt_counter id, __itt_clock_domain *clock_domain, unsigned long long timestamp, void *value_ptr), (ITT_FORMAT id, clock_domain, timestamp, value_ptr), counter_set_value_ex, __itt_group_counter, "%p, %p, %llu, %p") - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char *name), (ITT_FORMAT name), mark_createA, __itt_group_mark, "\"%s\"") -ITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name), (ITT_FORMAT name), mark_createW, __itt_group_mark, "\"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_mark_type, mark_create, (const char *name), (ITT_FORMAT name), mark_create, __itt_group_mark, "\"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* __ITT_INTERNAL_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), markA, __itt_group_mark, "%d, \"%s\"") -ITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), markW, __itt_group_mark, "%d, \"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark, __itt_group_mark, "%d, \"%s\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_off, __itt_group_mark, "%d") -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark_globalA, __itt_group_mark, "%d, \"%s\"") -ITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), mark_globalW, __itt_group_mark, "%d, \"%S\"") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark_global, (__itt_mark_type mt, const char *parameter), (ITT_FORMAT mt, parameter), mark_global, __itt_group_mark, "%d, \"%S\"") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_global_off, __itt_group_mark, "%d") - -#ifndef __ITT_INTERNAL_BODY -ITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void), (ITT_NO_PARAMS), stack_caller_create, __itt_group_stitch, "no args") -#endif /* __ITT_INTERNAL_BODY */ -ITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id), (ITT_FORMAT id), stack_caller_destroy, __itt_group_stitch, "%p") -ITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id), (ITT_FORMAT id), stack_callee_enter, __itt_group_stitch, "%p") -ITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id), (ITT_FORMAT id), stack_callee_leave, __itt_group_stitch, "%p") - -ITT_STUB(ITTAPI, __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data), (ITT_FORMAT fn, fn_data), clock_domain_create, __itt_group_structure, "%p, %p") -ITT_STUBV(ITTAPI, void, clock_domain_reset, (void), (ITT_NO_PARAMS), clock_domain_reset, __itt_group_structure, "no args") -ITT_STUBV(ITTAPI, void, id_create_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_create_ex, __itt_group_structure, "%p, %p, %lu, %lu") -ITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_destroy_ex, __itt_group_structure, "%p, %p, %lu, %lu") -ITT_STUBV(ITTAPI, void, task_begin_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_begin_fn_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, fn), task_begin_fn_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_end_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp), (ITT_FORMAT domain, clock_domain, timestamp), task_end_ex, __itt_group_structure, "%p, %p, %lu") -ITT_STUBV(ITTAPI, void, task_begin_overlapped, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_begin_overlapped, __itt_group_structure, "%p, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_begin_overlapped_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_overlapped_ex, __itt_group_structure, "%p, %p, %lu, %lu, %lu, %p") -ITT_STUBV(ITTAPI, void, task_end_overlapped, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), task_end_overlapped, __itt_group_structure, "%p, %lu") -ITT_STUBV(ITTAPI, void, task_end_overlapped_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), task_end_overlapped_ex, __itt_group_structure, "%p, %p, %lu, %lu") -ITT_STUBV(ITTAPI, void, marker_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, clock_domain, timestamp, id, name, scope), marker_ex, __itt_group_structure, "%p, %p, %lu, %lu, %p, %d") -ITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, scope, key, type, count, data), metadata_add_with_scope, __itt_group_structure, "%p, %d, %p, %d, %lu, %p") -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length), (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeA, __itt_group_structure, "%p, %d, %p, %p, %lu") -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length), (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeW, __itt_group_structure, "%p, %d, %p, %p, %lu") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, metadata_str_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length), (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scope, __itt_group_structure, "%p, %d, %p, %p, %lu") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, clock_domain, timestamp, relation, tail), relation_add_to_current_ex, __itt_group_structure, "%p, %p, %lu, %d, %lu") -ITT_STUBV(ITTAPI, void, relation_add_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, clock_domain, timestamp, head, relation, tail), relation_add_ex, __itt_group_structure, "%p, %p, %lu, %lu, %d, %lu") -ITT_STUB(ITTAPI, __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type), (ITT_FORMAT name, track_group_type), track_group_create, __itt_group_structure, "%p, %d") -ITT_STUB(ITTAPI, __itt_track*, track_create, (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type), (ITT_FORMAT track_group, name, track_type), track_create, __itt_group_structure, "%p, %p, %d") -ITT_STUBV(ITTAPI, void, set_track, (__itt_track *track), (ITT_FORMAT track), set_track, __itt_group_structure, "%p") - -#ifndef __ITT_INTERNAL_BODY -ITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, "no args") -#endif /* __ITT_INTERNAL_BODY */ - -#ifndef __ITT_INTERNAL_BODY -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveA, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d") -ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveW, __itt_group_arrays, "%p, %d, %p, %d, \"%S\", %d") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_save, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* __ITT_INTERNAL_BODY */ - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, module_loadA, (void *start_addr, void* end_addr, const char *path), (ITT_FORMAT start_addr, end_addr, path), module_loadA, __itt_group_module, "%p, %p, %p") -ITT_STUBV(ITTAPI, void, module_loadW, (void *start_addr, void* end_addr, const wchar_t *path), (ITT_FORMAT start_addr, end_addr, path), module_loadW, __itt_group_module, "%p, %p, %p") -#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, module_load, (void *start_addr, void *end_addr, const char *path), (ITT_FORMAT start_addr, end_addr, path), module_load, __itt_group_module, "%p, %p, %p") -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, module_unload, (void *start_addr), (ITT_FORMAT start_addr), module_unload, __itt_group_module, "%p") - -ITT_STUBV(ITTAPI, void, histogram_submit, (__itt_histogram* histogram, size_t length, void* x_data, void* y_data), (ITT_FORMAT histogram, length, x_data, y_data), histogram_submit, __itt_group_structure, "%p, %lu, %p, %p") - -ITT_STUBV(ITTAPI, void, counter_set_value_v3, (__itt_counter counter, void *value_ptr), (ITT_FORMAT counter, value_ptr), counter_set_value_v3, __itt_group_counter, "%p, %p") - -#endif /* __ITT_INTERNAL_INIT */ diff --git a/src/tbb/tools_api/ittnotify_types.h b/src/tbb/tools_api/ittnotify_types.h deleted file mode 100644 index 1c0fded40b..0000000000 --- a/src/tbb/tools_api/ittnotify_types.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - Copyright (c) 2005-2022 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _ITTNOTIFY_TYPES_H_ -#define _ITTNOTIFY_TYPES_H_ - -typedef enum ___itt_group_id -{ - __itt_group_none = 0, - __itt_group_legacy = 1<<0, - __itt_group_control = 1<<1, - __itt_group_thread = 1<<2, - __itt_group_mark = 1<<3, - __itt_group_sync = 1<<4, - __itt_group_fsync = 1<<5, - __itt_group_jit = 1<<6, - __itt_group_model = 1<<7, - __itt_group_splitter_min = 1<<7, - __itt_group_counter = 1<<8, - __itt_group_frame = 1<<9, - __itt_group_stitch = 1<<10, - __itt_group_heap = 1<<11, - __itt_group_splitter_max = 1<<12, - __itt_group_structure = 1<<12, - __itt_group_suppress = 1<<13, - __itt_group_arrays = 1<<14, - __itt_group_module = 1<<15, - __itt_group_all = -1 -} __itt_group_id; - -#pragma pack(push, 8) - -typedef struct ___itt_group_list -{ - __itt_group_id id; - const char* name; -} __itt_group_list; - -#pragma pack(pop) - -#define ITT_GROUP_LIST(varname) \ - static __itt_group_list varname[] = { \ - { __itt_group_all, "all" }, \ - { __itt_group_control, "control" }, \ - { __itt_group_thread, "thread" }, \ - { __itt_group_mark, "mark" }, \ - { __itt_group_sync, "sync" }, \ - { __itt_group_fsync, "fsync" }, \ - { __itt_group_jit, "jit" }, \ - { __itt_group_model, "model" }, \ - { __itt_group_counter, "counter" }, \ - { __itt_group_frame, "frame" }, \ - { __itt_group_stitch, "stitch" }, \ - { __itt_group_heap, "heap" }, \ - { __itt_group_structure, "structure" }, \ - { __itt_group_suppress, "suppress" }, \ - { __itt_group_arrays, "arrays" }, \ - { __itt_group_module, "module" }, \ - { __itt_group_none, NULL } \ - } - -#endif /* _ITTNOTIFY_TYPES_H_ */ diff --git a/src/tbb/tools_api/legacy/ittnotify.h b/src/tbb/tools_api/legacy/ittnotify.h deleted file mode 100644 index 837bc48008..0000000000 --- a/src/tbb/tools_api/legacy/ittnotify.h +++ /dev/null @@ -1,1015 +0,0 @@ -/* - Copyright (c) 2005-2024 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _LEGACY_ITTNOTIFY_H_ -#define _LEGACY_ITTNOTIFY_H_ - -/** - * @file - * @brief Legacy User API functions and types - */ - -/** @cond exclude_from_documentation */ -#ifndef ITT_OS_WIN -# define ITT_OS_WIN 1 -#endif /* ITT_OS_WIN */ - -#ifndef ITT_OS_LINUX -# define ITT_OS_LINUX 2 -#endif /* ITT_OS_LINUX */ - -#ifndef ITT_OS_MAC -# define ITT_OS_MAC 3 -#endif /* ITT_OS_MAC */ - -#ifndef ITT_OS_FREEBSD -# define ITT_OS_FREEBSD 4 -#endif /* ITT_OS_FREEBSD */ - -#ifndef ITT_OS_OPENBSD -# define ITT_OS_OPENBSD 5 -#endif /* ITT_OS_OPENBSD */ - -#ifndef ITT_OS -# if defined WIN32 || defined _WIN32 -# define ITT_OS ITT_OS_WIN -# elif defined( __APPLE__ ) && defined( __MACH__ ) -# define ITT_OS ITT_OS_MAC -# elif defined( __FreeBSD__ ) -# define ITT_OS ITT_OS_FREEBSD -# elif defined( __OpenBSD__ ) -# define ITT_OS ITT_OS_OPENBSD -# else -# define ITT_OS ITT_OS_LINUX -# endif -#endif /* ITT_OS */ - -#ifndef ITT_PLATFORM_WIN -# define ITT_PLATFORM_WIN 1 -#endif /* ITT_PLATFORM_WIN */ - -#ifndef ITT_PLATFORM_POSIX -# define ITT_PLATFORM_POSIX 2 -#endif /* ITT_PLATFORM_POSIX */ - -#ifndef ITT_PLATFORM_MAC -# define ITT_PLATFORM_MAC 3 -#endif /* ITT_PLATFORM_MAC */ - -#ifndef ITT_PLATFORM_FREEBSD -# define ITT_PLATFORM_FREEBSD 4 -#endif /* ITT_PLATFORM_FREEBSD */ - -#ifndef ITT_PLATFORM_OPENBSD -# define ITT_PLATFORM_OPENBSD 5 -#endif /* ITT_PLATFORM_OPENBSD */ - -#ifndef ITT_PLATFORM -# if ITT_OS==ITT_OS_WIN -# define ITT_PLATFORM ITT_PLATFORM_WIN -# elif ITT_OS==ITT_OS_MAC -# define ITT_PLATFORM ITT_PLATFORM_MAC -# elif ITT_OS==ITT_OS_FREEBSD -# define ITT_PLATFORM ITT_PLATFORM_FREEBSD -# elif ITT_OS==ITT_OS_OPENBSD -# define ITT_PLATFORM ITT_PLATFORM_OPENBSD -# else -# define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif -#endif /* ITT_PLATFORM */ - -#if defined(_UNICODE) && !defined(UNICODE) -#define UNICODE -#endif - -#include -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#include -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#include -#if defined(UNICODE) || defined(_UNICODE) -#include -#endif /* UNICODE || _UNICODE */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -#ifndef ITTAPI_CDECL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define ITTAPI_CDECL __cdecl -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define ITTAPI_CDECL __attribute__ ((cdecl)) -# else /* _M_IX86 || __i386__ */ -# define ITTAPI_CDECL /* actual only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* ITTAPI_CDECL */ - -#ifndef STDCALL -# if ITT_PLATFORM==ITT_PLATFORM_WIN -# define STDCALL __stdcall -# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_IX86 || defined __i386__ -# define STDCALL __attribute__ ((stdcall)) -# else /* _M_IX86 || __i386__ */ -# define STDCALL /* supported only on x86 platform */ -# endif /* _M_IX86 || __i386__ */ -# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* STDCALL */ - -#define ITTAPI ITTAPI_CDECL -#define LIBITTAPI ITTAPI_CDECL - -/* TODO: Temporary for compatibility! */ -#define ITTAPI_CALL ITTAPI_CDECL -#define LIBITTAPI_CALL ITTAPI_CDECL - -#if ITT_PLATFORM==ITT_PLATFORM_WIN -/* use __forceinline (VC++ specific) */ -#if defined(__MINGW32__) && !defined(__cplusplus) -#define ITT_INLINE static __inline__ __attribute__((__always_inline__,__gnu_inline__)) -#else -#define ITT_INLINE static __forceinline -#endif /* __MINGW32__ */ - -#define ITT_INLINE_ATTRIBUTE /* nothing */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/* - * Generally, functions are not inlined unless optimization is specified. - * For functions declared inline, this attribute inlines the function even - * if no optimization level was specified. - */ -#ifdef __STRICT_ANSI__ -#define ITT_INLINE static -#define ITT_INLINE_ATTRIBUTE __attribute__((unused)) -#else /* __STRICT_ANSI__ */ -#define ITT_INLINE static inline -#define ITT_INLINE_ATTRIBUTE __attribute__((always_inline, unused)) -#endif /* __STRICT_ANSI__ */ -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -/** @endcond */ - -/** @cond exclude_from_documentation */ -/* Helper macro for joining tokens */ -#define ITT_JOIN_AUX(p,n) p##n -#define ITT_JOIN(p,n) ITT_JOIN_AUX(p,n) - -#ifdef ITT_MAJOR -#undef ITT_MAJOR -#endif -#ifdef ITT_MINOR -#undef ITT_MINOR -#endif -#define ITT_MAJOR 3 -#define ITT_MINOR 0 - -/* Standard versioning of a token with major and minor version numbers */ -#define ITT_VERSIONIZE(x) \ - ITT_JOIN(x, \ - ITT_JOIN(_, \ - ITT_JOIN(ITT_MAJOR, \ - ITT_JOIN(_, ITT_MINOR)))) - -#ifndef INTEL_ITTNOTIFY_PREFIX -# define INTEL_ITTNOTIFY_PREFIX __itt_ -#endif /* INTEL_ITTNOTIFY_PREFIX */ -#ifndef INTEL_ITTNOTIFY_POSTFIX -# define INTEL_ITTNOTIFY_POSTFIX _ptr_ -#endif /* INTEL_ITTNOTIFY_POSTFIX */ - -#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n) -#define ITTNOTIFY_NAME(n) ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX))) - -#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n) -#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n) - -#define ITTNOTIFY_VOID_D0(n,d) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d) -#define ITTNOTIFY_VOID_D1(n,d,x) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x) -#define ITTNOTIFY_VOID_D2(n,d,x,y) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y) -#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z) -#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a) -#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b) -#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (d == NULL) ? (void)0 : (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c) -#define ITTNOTIFY_DATA_D0(n,d) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d) -#define ITTNOTIFY_DATA_D1(n,d,x) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x) -#define ITTNOTIFY_DATA_D2(n,d,x,y) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y) -#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z) -#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a) -#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b) -#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (d == NULL) ? 0 : (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ? 0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c) - -#ifdef ITT_STUB -#undef ITT_STUB -#endif -#ifdef ITT_STUBV -#undef ITT_STUBV -#endif -#define ITT_STUBV(api,type,name,args) \ - typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args; \ - extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name); -#define ITT_STUB ITT_STUBV -/** @endcond */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @defgroup legacy Legacy API - * @{ - * @} - */ - -/** - * @defgroup legacy_control Collection Control - * @ingroup legacy - * General behavior: application continues to run, but no profiling information is being collected - * - * Pausing occurs not only for the current thread but for all process as well as spawned processes - * - Intel(R) Parallel Inspector and Intel(R) Inspector XE: - * - Does not analyze or report errors that involve memory access. - * - Other errors are reported as usual. Pausing data collection in - * Intel(R) Parallel Inspector and Intel(R) Inspector XE - * only pauses tracing and analyzing memory access. - * It does not pause tracing or analyzing threading APIs. - * . - * - Intel(R) VTune(TM) Profiler: - * - Does continue to record when new threads are started. - * . - * - Other effects: - * - Possible reduction of runtime overhead. - * . - * @{ - */ -#ifndef _ITTNOTIFY_H_ -/** @brief Pause collection */ -void ITTAPI __itt_pause(void); -/** @brief Resume collection */ -void ITTAPI __itt_resume(void); -/** @brief Detach collection */ -void ITTAPI __itt_detach(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, pause, (void)) -ITT_STUBV(ITTAPI, void, resume, (void)) -ITT_STUBV(ITTAPI, void, detach, (void)) -#define __itt_pause ITTNOTIFY_VOID(pause) -#define __itt_pause_ptr ITTNOTIFY_NAME(pause) -#define __itt_resume ITTNOTIFY_VOID(resume) -#define __itt_resume_ptr ITTNOTIFY_NAME(resume) -#define __itt_detach ITTNOTIFY_VOID(detach) -#define __itt_detach_ptr ITTNOTIFY_NAME(detach) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_pause() -#define __itt_pause_ptr 0 -#define __itt_resume() -#define __itt_resume_ptr 0 -#define __itt_detach() -#define __itt_detach_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_pause_ptr 0 -#define __itt_resume_ptr 0 -#define __itt_detach_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -#endif /* _ITTNOTIFY_H_ */ -/** @} legacy_control group */ - -/** - * @defgroup legacy_threads Threads - * @ingroup legacy - * Threads group - * @warning Legacy API - * @{ - */ -/** - * @deprecated Legacy API - * @brief Set name to be associated with thread in analysis GUI. - * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched) - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -int LIBITTAPI __itt_thr_name_setA(const char *name, int namelen); -int LIBITTAPI __itt_thr_name_setW(const wchar_t *name, int namelen); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_thr_name_set __itt_thr_name_setW -# define __itt_thr_name_set_ptr __itt_thr_name_setW_ptr -#else -# define __itt_thr_name_set __itt_thr_name_setA -# define __itt_thr_name_set_ptr __itt_thr_name_setA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -int LIBITTAPI __itt_thr_name_set(const char *name, int namelen); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, int, thr_name_setA, (const char *name, int namelen)) -ITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thr_name_setA ITTNOTIFY_DATA(thr_name_setA) -#define __itt_thr_name_setA_ptr ITTNOTIFY_NAME(thr_name_setA) -#define __itt_thr_name_setW ITTNOTIFY_DATA(thr_name_setW) -#define __itt_thr_name_setW_ptr ITTNOTIFY_NAME(thr_name_setW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thr_name_set ITTNOTIFY_DATA(thr_name_set) -#define __itt_thr_name_set_ptr ITTNOTIFY_NAME(thr_name_set) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thr_name_setA(name, namelen) -#define __itt_thr_name_setA_ptr 0 -#define __itt_thr_name_setW(name, namelen) -#define __itt_thr_name_setW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thr_name_set(name, namelen) -#define __itt_thr_name_set_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_thr_name_setA_ptr 0 -#define __itt_thr_name_setW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_thr_name_set_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Mark current thread as ignored from this point on, for the duration of its existence. - */ -void LIBITTAPI __itt_thr_ignore(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, thr_ignore, (void)) -#define __itt_thr_ignore ITTNOTIFY_VOID(thr_ignore) -#define __itt_thr_ignore_ptr ITTNOTIFY_NAME(thr_ignore) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_thr_ignore() -#define __itt_thr_ignore_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_thr_ignore_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} legacy_threads group */ - -/** - * @defgroup legacy_sync Synchronization - * @ingroup legacy - * Synchronization group - * @warning Legacy API - * @{ - */ -/** - * @hideinitializer - * @brief possible value of attribute argument for sync object type - */ -#define __itt_attr_barrier 1 - -/** - * @hideinitializer - * @brief possible value of attribute argument for sync object type - */ -#define __itt_attr_mutex 2 - -/** - * @deprecated Legacy API - * @brief Assign a name to a sync object using char or Unicode string - * @param[in] addr - pointer to the sync object. You should use a real pointer to your object - * to make sure that the values don't clash with other object addresses - * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will - * be assumed to be of generic "User Synchronization" type - * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned - * to the object -- you can use the __itt_sync_rename call later to assign - * the name - * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the - * exact semantics of how prepare/acquired/releasing calls work. - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -void ITTAPI __itt_sync_set_nameA(void *addr, const char *objtype, const char *objname, int attribute); -void ITTAPI __itt_sync_set_nameW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_sync_set_name __itt_sync_set_nameW -# define __itt_sync_set_name_ptr __itt_sync_set_nameW_ptr -#else /* UNICODE */ -# define __itt_sync_set_name __itt_sync_set_nameA -# define __itt_sync_set_name_ptr __itt_sync_set_nameA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -void ITTAPI __itt_sync_set_name(void *addr, const char* objtype, const char* objname, int attribute); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char *objtype, const char *objname, int attribute)) -ITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUBV(ITTAPI, void, sync_set_name, (void *addr, const char *objtype, const char *objname, int attribute)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_set_nameA ITTNOTIFY_VOID(sync_set_nameA) -#define __itt_sync_set_nameA_ptr ITTNOTIFY_NAME(sync_set_nameA) -#define __itt_sync_set_nameW ITTNOTIFY_VOID(sync_set_nameW) -#define __itt_sync_set_nameW_ptr ITTNOTIFY_NAME(sync_set_nameW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_set_name ITTNOTIFY_VOID(sync_set_name) -#define __itt_sync_set_name_ptr ITTNOTIFY_NAME(sync_set_name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_set_nameA(addr, objtype, objname, attribute) -#define __itt_sync_set_nameA_ptr 0 -#define __itt_sync_set_nameW(addr, objtype, objname, attribute) -#define __itt_sync_set_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_set_name(addr, objtype, objname, attribute) -#define __itt_sync_set_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_sync_set_nameA_ptr 0 -#define __itt_sync_set_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_sync_set_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Assign a name and type to a sync object using char or Unicode string - * @param[in] addr - pointer to the sync object. You should use a real pointer to your object - * to make sure that the values don't clash with other object addresses - * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will - * be assumed to be of generic "User Synchronization" type - * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned - * to the object -- you can use the __itt_sync_rename call later to assign - * the name - * @param[in] typelen, namelen - a length of string for appropriate objtype and objname parameter - * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the - * exact semantics of how prepare/acquired/releasing calls work. - * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched) - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -int LIBITTAPI __itt_notify_sync_nameA(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute); -int LIBITTAPI __itt_notify_sync_nameW(void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_notify_sync_name __itt_notify_sync_nameW -#else -# define __itt_notify_sync_name __itt_notify_sync_nameA -#endif -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -int LIBITTAPI __itt_notify_sync_name(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute)) -ITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, int, notify_sync_name, (void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_notify_sync_nameA ITTNOTIFY_DATA(notify_sync_nameA) -#define __itt_notify_sync_nameA_ptr ITTNOTIFY_NAME(notify_sync_nameA) -#define __itt_notify_sync_nameW ITTNOTIFY_DATA(notify_sync_nameW) -#define __itt_notify_sync_nameW_ptr ITTNOTIFY_NAME(notify_sync_nameW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_notify_sync_name ITTNOTIFY_DATA(notify_sync_name) -#define __itt_notify_sync_name_ptr ITTNOTIFY_NAME(notify_sync_name) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_notify_sync_nameA(addr, objtype, typelen, objname, namelen, attribute) -#define __itt_notify_sync_nameA_ptr 0 -#define __itt_notify_sync_nameW(addr, objtype, typelen, objname, namelen, attribute) -#define __itt_notify_sync_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_notify_sync_name(addr, objtype, typelen, objname, namelen, attribute) -#define __itt_notify_sync_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_notify_sync_nameA_ptr 0 -#define __itt_notify_sync_nameW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_notify_sync_name_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Enter spin loop on user-defined sync object - */ -void LIBITTAPI __itt_notify_sync_prepare(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *addr)) -#define __itt_notify_sync_prepare ITTNOTIFY_VOID(notify_sync_prepare) -#define __itt_notify_sync_prepare_ptr ITTNOTIFY_NAME(notify_sync_prepare) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_notify_sync_prepare(addr) -#define __itt_notify_sync_prepare_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_notify_sync_prepare_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Quit spin loop without acquiring spin object - */ -void LIBITTAPI __itt_notify_sync_cancel(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *addr)) -#define __itt_notify_sync_cancel ITTNOTIFY_VOID(notify_sync_cancel) -#define __itt_notify_sync_cancel_ptr ITTNOTIFY_NAME(notify_sync_cancel) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_notify_sync_cancel(addr) -#define __itt_notify_sync_cancel_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_notify_sync_cancel_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Successful spin loop completion (sync object acquired) - */ -void LIBITTAPI __itt_notify_sync_acquired(void *addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *addr)) -#define __itt_notify_sync_acquired ITTNOTIFY_VOID(notify_sync_acquired) -#define __itt_notify_sync_acquired_ptr ITTNOTIFY_NAME(notify_sync_acquired) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_notify_sync_acquired(addr) -#define __itt_notify_sync_acquired_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_notify_sync_acquired_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Start sync object releasing code. Is called before the lock release call. - */ -void LIBITTAPI __itt_notify_sync_releasing(void* addr); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *addr)) -#define __itt_notify_sync_releasing ITTNOTIFY_VOID(notify_sync_releasing) -#define __itt_notify_sync_releasing_ptr ITTNOTIFY_NAME(notify_sync_releasing) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_notify_sync_releasing(addr) -#define __itt_notify_sync_releasing_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_notify_sync_releasing_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} legacy_sync group */ - -#ifndef _ITTNOTIFY_H_ -/** - * @defgroup legacy_events Events - * @ingroup legacy - * Events group - * @{ - */ - -/** @brief user event type */ -typedef int __itt_event; - -/** - * @brief Create an event notification - * @note name or namelen being null/name and namelen not matching, user event feature not enabled - * @return non-zero event identifier upon success and __itt_err otherwise - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_event LIBITTAPI __itt_event_createA(const char *name, int namelen); -__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_event_create __itt_event_createW -# define __itt_event_create_ptr __itt_event_createW_ptr -#else -# define __itt_event_create __itt_event_createA -# define __itt_event_create_ptr __itt_event_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char *name, int namelen)) -ITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(LIBITTAPI, __itt_event, event_create, (const char *name, int namelen)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA ITTNOTIFY_DATA(event_createA) -#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA) -#define __itt_event_createW ITTNOTIFY_DATA(event_createW) -#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create ITTNOTIFY_DATA(event_create) -#define __itt_event_create_ptr ITTNOTIFY_NAME(event_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA(name, namelen) (__itt_event)0 -#define __itt_event_createA_ptr 0 -#define __itt_event_createW(name, namelen) (__itt_event)0 -#define __itt_event_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create(name, namelen) (__itt_event)0 -#define __itt_event_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_event_createA_ptr 0 -#define __itt_event_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_event_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an event occurrence. - * @return __itt_err upon failure (invalid event id/user event feature not enabled) - */ -int LIBITTAPI __itt_event_start(__itt_event event); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(LIBITTAPI, int, event_start, (__itt_event event)) -#define __itt_event_start ITTNOTIFY_DATA(event_start) -#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_event_start(event) (int)0 -#define __itt_event_start_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_event_start_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @brief Record an event end occurrence. - * @note It is optional if events do not have durations. - * @return __itt_err upon failure (invalid event id/user event feature not enabled) - */ -int LIBITTAPI __itt_event_end(__itt_event event); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event)) -#define __itt_event_end ITTNOTIFY_DATA(event_end) -#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_event_end(event) (int)0 -#define __itt_event_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_event_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} legacy_events group */ -#endif /* _ITTNOTIFY_H_ */ - -/** - * @defgroup legacy_memory Memory Accesses - * @ingroup legacy - */ - -/** - * @deprecated Legacy API - * @brief Inform the tool of memory accesses on reading - */ -void LIBITTAPI __itt_memory_read(void *addr, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size)) -#define __itt_memory_read ITTNOTIFY_VOID(memory_read) -#define __itt_memory_read_ptr ITTNOTIFY_NAME(memory_read) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_memory_read(addr, size) -#define __itt_memory_read_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_memory_read_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Inform the tool of memory accesses on writing - */ -void LIBITTAPI __itt_memory_write(void *addr, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size)) -#define __itt_memory_write ITTNOTIFY_VOID(memory_write) -#define __itt_memory_write_ptr ITTNOTIFY_NAME(memory_write) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_memory_write(addr, size) -#define __itt_memory_write_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_memory_write_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief Inform the tool of memory accesses on updating - */ -void LIBITTAPI __itt_memory_update(void *address, size_t size); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size)) -#define __itt_memory_update ITTNOTIFY_VOID(memory_update) -#define __itt_memory_update_ptr ITTNOTIFY_NAME(memory_update) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_memory_update(addr, size) -#define __itt_memory_update_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_memory_update_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} legacy_memory group */ - -/** - * @defgroup legacy_state Thread and Object States - * @ingroup legacy - */ - -/** @brief state type */ -typedef int __itt_state_t; - -/** @cond exclude_from_documentation */ -typedef enum __itt_obj_state { - __itt_obj_state_err = 0, - __itt_obj_state_clr = 1, - __itt_obj_state_set = 2, - __itt_obj_state_use = 3 -} __itt_obj_state_t; - -typedef enum __itt_thr_state { - __itt_thr_state_err = 0, - __itt_thr_state_clr = 1, - __itt_thr_state_set = 2 -} __itt_thr_state_t; - -typedef enum __itt_obj_prop { - __itt_obj_prop_watch = 1, - __itt_obj_prop_ignore = 2, - __itt_obj_prop_sharable = 3 -} __itt_obj_prop_t; - -typedef enum __itt_thr_prop { - __itt_thr_prop_quiet = 1 -} __itt_thr_prop_t; -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief managing thread and object states - */ -__itt_state_t LIBITTAPI __itt_state_get(void); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_state_t, state_get, (void)) -#define __itt_state_get ITTNOTIFY_DATA(state_get) -#define __itt_state_get_ptr ITTNOTIFY_NAME(state_get) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_state_get(void) (__itt_state_t)0 -#define __itt_state_get_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_state_get_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief managing thread and object states - */ -__itt_state_t LIBITTAPI __itt_state_set(__itt_state_t s); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_state_t, state_set, (__itt_state_t s)) -#define __itt_state_set ITTNOTIFY_DATA(state_set) -#define __itt_state_set_ptr ITTNOTIFY_NAME(state_set) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_state_set(s) (__itt_state_t)0 -#define __itt_state_set_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_state_set_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief managing thread and object modes - */ -__itt_thr_state_t LIBITTAPI __itt_thr_mode_set(__itt_thr_prop_t p, __itt_thr_state_t s); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s)) -#define __itt_thr_mode_set ITTNOTIFY_DATA(thr_mode_set) -#define __itt_thr_mode_set_ptr ITTNOTIFY_NAME(thr_mode_set) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_thr_mode_set(p, s) (__itt_thr_state_t)0 -#define __itt_thr_mode_set_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_thr_mode_set_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** - * @deprecated Legacy API - * @brief managing thread and object modes - */ -__itt_obj_state_t LIBITTAPI __itt_obj_mode_set(__itt_obj_prop_t p, __itt_obj_state_t s); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUB(ITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s)) -#define __itt_obj_mode_set ITTNOTIFY_DATA(obj_mode_set) -#define __itt_obj_mode_set_ptr ITTNOTIFY_NAME(obj_mode_set) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_obj_mode_set(p, s) (__itt_obj_state_t)0 -#define __itt_obj_mode_set_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_obj_mode_set_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} legacy_state group */ - -/** - * @defgroup frames Frames - * @ingroup legacy - * Frames group - * @{ - */ -/** - * @brief opaque structure for frame identification - */ -typedef struct __itt_frame_t *__itt_frame; - -/** - * @brief Create a global frame with given domain - */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -__itt_frame ITTAPI __itt_frame_createA(const char *domain); -__itt_frame ITTAPI __itt_frame_createW(const wchar_t *domain); -#if defined(UNICODE) || defined(_UNICODE) -# define __itt_frame_create __itt_frame_createW -# define __itt_frame_create_ptr __itt_frame_createW_ptr -#else /* UNICODE */ -# define __itt_frame_create __itt_frame_createA -# define __itt_frame_create_ptr __itt_frame_createA_ptr -#endif /* UNICODE */ -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -__itt_frame ITTAPI __itt_frame_create(const char *domain); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -#if ITT_PLATFORM==ITT_PLATFORM_WIN -ITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char *domain)) -ITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain)) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -ITT_STUB(ITTAPI, __itt_frame, frame_create, (const char *domain)) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_frame_createA ITTNOTIFY_DATA(frame_createA) -#define __itt_frame_createA_ptr ITTNOTIFY_NAME(frame_createA) -#define __itt_frame_createW ITTNOTIFY_DATA(frame_createW) -#define __itt_frame_createW_ptr ITTNOTIFY_NAME(frame_createW) -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_frame_create ITTNOTIFY_DATA(frame_create) -#define __itt_frame_create_ptr ITTNOTIFY_NAME(frame_create) -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#else /* INTEL_NO_ITTNOTIFY_API */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_frame_createA(domain) -#define __itt_frame_createA_ptr 0 -#define __itt_frame_createW(domain) -#define __itt_frame_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_frame_create(domain) -#define __itt_frame_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#if ITT_PLATFORM==ITT_PLATFORM_WIN -#define __itt_frame_createA_ptr 0 -#define __itt_frame_createW_ptr 0 -#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#define __itt_frame_create_ptr 0 -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ - -/** @brief Record a frame begin occurrence. */ -void ITTAPI __itt_frame_begin(__itt_frame frame); -/** @brief Record a frame end occurrence. */ -void ITTAPI __itt_frame_end (__itt_frame frame); - -/** @cond exclude_from_documentation */ -#ifndef INTEL_NO_MACRO_BODY -#ifndef INTEL_NO_ITTNOTIFY_API -ITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame)) -ITT_STUBV(ITTAPI, void, frame_end, (__itt_frame frame)) -#define __itt_frame_begin ITTNOTIFY_VOID(frame_begin) -#define __itt_frame_begin_ptr ITTNOTIFY_NAME(frame_begin) -#define __itt_frame_end ITTNOTIFY_VOID(frame_end) -#define __itt_frame_end_ptr ITTNOTIFY_NAME(frame_end) -#else /* INTEL_NO_ITTNOTIFY_API */ -#define __itt_frame_begin(frame) -#define __itt_frame_begin_ptr 0 -#define __itt_frame_end(frame) -#define __itt_frame_end_ptr 0 -#endif /* INTEL_NO_ITTNOTIFY_API */ -#else /* INTEL_NO_MACRO_BODY */ -#define __itt_frame_begin_ptr 0 -#define __itt_frame_end_ptr 0 -#endif /* INTEL_NO_MACRO_BODY */ -/** @endcond */ -/** @} frames group */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _LEGACY_ITTNOTIFY_H_ */ diff --git a/src/tbbmalloc/CMakeLists.txt b/src/tbbmalloc/CMakeLists.txt index 76044fce30..de7a9ba176 100644 --- a/src/tbbmalloc/CMakeLists.txt +++ b/src/tbbmalloc/CMakeLists.txt @@ -12,14 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_library(tbbmalloc +add_library(tbbmalloc backend.cpp backref.cpp frontend.cpp large_objects.cpp tbbmalloc.cpp ../tbb/itt_notify.cpp) - + if (WIN32) target_sources(tbbmalloc PRIVATE tbbmalloc.rc) endif() @@ -104,13 +104,14 @@ endif() target_link_libraries(tbbmalloc PRIVATE + ittapi::ittnotify Threads::Threads ${TBB_LIB_LINK_LIBS} ${TBB_COMMON_LINK_LIBS} ) if(TBB_BUILD_APPLE_FRAMEWORKS) - set_target_properties(tbbmalloc PROPERTIES + set_target_properties(tbbmalloc PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION ${TBBMALLOC_BINARY_VERSION}.${TBB_BINARY_MINOR_VERSION} XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER com.intel.tbbmalloc