Program Listing for File Replay.hpp¶
↰ Return to documentation for file (umpire/Replay.hpp
)
//////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC and Umpire
// project contributors. See the COPYRIGHT file for details.
//
// SPDX-License-Identifier: (MIT)
//////////////////////////////////////////////////////////////////////////////
#ifndef UMPIRE_Replay_HPP
#define UMPIRE_Replay_HPP
#include <chrono>
#include <string>
#include <sstream>
#include <iostream>
#include "umpire/strategy/DynamicPool.hpp"
#include "umpire/strategy/DynamicPoolMap.hpp"
#include "umpire/strategy/DynamicPoolList.hpp"
namespace umpire {
class Allocator;
std::ostream& operator<< (std::ostream& out, umpire::Allocator& );
std::ostream& operator<< (std::ostream& out,
umpire::strategy::DynamicPoolMap::CoalesceHeuristic& );
std::ostream& operator<< (std::ostream& out,
umpire::strategy::DynamicPoolList::CoalesceHeuristic& );
class Replay {
public:
void logMessage( const std::string& message );
static Replay* getReplayLogger();
bool replayLoggingEnabled();
uint64_t replayUid() { return m_replayUid; }
static std::string printReplayAllocator( void ) {
m_argument_number = 0;
return std::string("");
}
template <typename T, typename... Args>
static std::string printReplayAllocator(T&& firstArg, Args&&... args) {
std::stringstream ss;
if (typeid(firstArg) != typeid(umpire::strategy::DynamicPool::CoalesceHeuristic)) {
m_argument_number++;
if ( m_argument_number != 1 )
ss << ", ";
ss << "\"" << firstArg << "\"";
}
ss << printReplayAllocator(std::forward<Args>(args)...);
return ss.str();
}
private:
Replay();
~Replay() = default;
Replay(const Replay&) = delete;
Replay& operator=(const Replay&) = delete;
bool replayEnabled;
uint64_t m_replayUid;
static int m_argument_number;
};
} /* namespace umpire */
#define UMPIRE_REPLAY( msg ) \
{ \
if (umpire::Replay::getReplayLogger()->replayLoggingEnabled()) { \
std::ostringstream local_msg; \
auto time = std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()).time_since_epoch();\
local_msg \
<< "{ \"kind\":\"replay\", \"uid\":" \
<< umpire::Replay::getReplayLogger()->replayUid() << ", " \
<< "\"timestamp\":" \
<< static_cast<long>(time.count()) << ", " \
<< msg \
<< " }" \
<< std::endl; \
umpire::Replay::getReplayLogger()->logMessage(local_msg.str()); \
} \
}
#endif /* UMPIRE_Replay_HPP */