1 #include "vtuneapi.h"
2 #ifdef _MSC_VER // for msvc
3 #include <cstdlib>
4 #endif
5
6 std::map<std::string, std::shared_ptr<VTuneDomain>> VTuneDomain::domains_;
7 std::map<std::string, __itt_string_handle*> VTuneDomain::string_handlers_;
8
createDomain(const char * domain_name)9 std::shared_ptr<VTuneDomain> VTuneDomain::createDomain(
10 const char* domain_name) {
11 auto domain = getDomain(domain_name);
12
13 if (domain == nullptr) {
14 #ifdef _MSC_VER // for msvc
15 wchar_t buffer[255];
16 mbstowcs(buffer, domain_name, 255);
17 __itt_domain* itt_domain = __itt_domain_create(buffer); // call api
18 #else // for clang and gcc
19 __itt_domain* itt_domain = __itt_domain_create(domain_name); // call api
20 #endif
21 if (itt_domain != NULL) {
22 std::string key(domain_name);
23 std::shared_ptr<VTuneDomain> value(new VTuneDomain(itt_domain));
24 domain = value;
25 domains_.insert(std::make_pair(key, value));
26 }
27 }
28
29 return domain;
30 }
31
destroyDomain(const char * domain_name)32 void VTuneDomain::destroyDomain(const char* domain_name) {
33 auto it = domains_.find(domain_name);
34 if (it != domains_.end()) {
35 domains_.erase(it);
36 }
37 }
38
getDomain(const char * domain_name)39 std::shared_ptr<VTuneDomain> VTuneDomain::getDomain(const char* domain_name) {
40 std::shared_ptr<VTuneDomain> result(nullptr);
41
42 auto it = domains_.find(domain_name);
43 if (it != domains_.end()) {
44 result = it->second;
45 }
46
47 return result;
48 }
49
getString(const char * str)50 __itt_string_handle* VTuneDomain::getString(const char* str) {
51 __itt_string_handle* result = NULL;
52
53 auto it = string_handlers_.find(str);
54 if (it != string_handlers_.end()) {
55 result = it->second;
56 } else {
57 #ifdef _MSC_VER // for msvc
58 wchar_t buffer[255];
59 mbstowcs(buffer, str, 255);
60 result = __itt_string_handle_create(buffer); // call api
61 #else // for clang and gcc
62 result = __itt_string_handle_create(str);
63 #endif
64 std::string key(str);
65 string_handlers_.insert(std::make_pair(key, result));
66 }
67
68 return result;
69 }
70
beginTask(const char * task_name)71 bool VTuneDomain::beginTask(const char* task_name) {
72 bool result = false;
73
74 __itt_string_handle* name = getString(task_name);
75 if (name != NULL) {
76 __itt_task_begin(domain_, __itt_null, __itt_null, name);
77 result = true;
78 }
79
80 return result;
81 }
82
endTask()83 void VTuneDomain::endTask() { __itt_task_end(domain_); }
84