#include "vtuneapi.h" #ifdef _MSC_VER // for msvc #include <cstdlib> #endif std::map<std::string, std::shared_ptr<VTuneDomain>> VTuneDomain::domains_; std::map<std::string, __itt_string_handle*> VTuneDomain::string_handlers_; std::shared_ptr<VTuneDomain> VTuneDomain::createDomain( const char* domain_name) { auto domain = getDomain(domain_name); if (domain == nullptr) { #ifdef _MSC_VER // for msvc wchar_t buffer[255]; mbstowcs(buffer, domain_name, 255); __itt_domain* itt_domain = __itt_domain_create(buffer); // call api #else // for clang and gcc __itt_domain* itt_domain = __itt_domain_create(domain_name); // call api #endif if (itt_domain != NULL) { std::string key(domain_name); std::shared_ptr<VTuneDomain> value(new VTuneDomain(itt_domain)); domain = value; domains_.insert(std::make_pair(key, value)); } } return domain; } void VTuneDomain::destroyDomain(const char* domain_name) { auto it = domains_.find(domain_name); if (it != domains_.end()) { domains_.erase(it); } } std::shared_ptr<VTuneDomain> VTuneDomain::getDomain(const char* domain_name) { std::shared_ptr<VTuneDomain> result(nullptr); auto it = domains_.find(domain_name); if (it != domains_.end()) { result = it->second; } return result; } __itt_string_handle* VTuneDomain::getString(const char* str) { __itt_string_handle* result = NULL; auto it = string_handlers_.find(str); if (it != string_handlers_.end()) { result = it->second; } else { #ifdef _MSC_VER // for msvc wchar_t buffer[255]; mbstowcs(buffer, str, 255); result = __itt_string_handle_create(buffer); // call api #else // for clang and gcc result = __itt_string_handle_create(str); #endif std::string key(str); string_handlers_.insert(std::make_pair(key, result)); } return result; } bool VTuneDomain::beginTask(const char* task_name) { bool result = false; __itt_string_handle* name = getString(task_name); if (name != NULL) { __itt_task_begin(domain_, __itt_null, __itt_null, name); result = true; } return result; } void VTuneDomain::endTask() { __itt_task_end(domain_); }