blob: b6f7b73d59a1d385ce3751c1554d191d2dab2c86 [file] [log] [blame]
#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_); }