• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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