#include "stats.hpp" #include void Stats::accept_connection(std::unique_ptr&& socket) { auto it = connections.emplace(connections.end(), std::move(socket)); it->on_done([this, it](){ connections.erase(it); }); it->async_receive([it, this](cmix_proto::CMixMessage const& message) { handle_message(it, message); }); } void Stats::handle_performance(std::list::iterator it, cmix_proto::Performance perf) { data[perf.node()][perf.column() + "wall_time"].push_back(std::stol(perf.wall_time())); data[perf.node()][perf.column() + "system_time"].push_back(std::stol(perf.system_time())); data[perf.node()][perf.column() + "user_time"].push_back(std::stol(perf.user_time())); it->async_receive([it, this](cmix_proto::CMixMessage const& message) { handle_message(it, message); }); } void Stats::handle_message(std::list::iterator it, cmix_proto::CMixMessage message) { switch(message.contents_case()) { case cmix_proto::CMixMessage::ContentsCase::kPerformance: { BOOST_LOG_TRIVIAL(trace) << "Handling performance"; handle_performance(it, message.performance()); break; } case cmix_proto::CMixMessage::ContentsCase::kBye: { BOOST_LOG_TRIVIAL(trace) << "Handling Bye"; break; } case cmix_proto::CMixMessage::ContentsCase::CONTENTS_NOT_SET: case cmix_proto::CMixMessage::ContentsCase::kInitialization: case cmix_proto::CMixMessage::ContentsCase::kSecretkey: case cmix_proto::CMixMessage::ContentsCase::kImaclient: case cmix_proto::CMixMessage::ContentsCase::kImanode: case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: case cmix_proto::CMixMessage::ContentsCase::kNodeready: case cmix_proto::CMixMessage::ContentsCase::kUsermessage: case cmix_proto::CMixMessage::ContentsCase::kPrepre: case cmix_proto::CMixMessage::ContentsCase::kPremix: case cmix_proto::CMixMessage::ContentsCase::kPrepost: case cmix_proto::CMixMessage::ContentsCase::kRealpre: case cmix_proto::CMixMessage::ContentsCase::kRealmix: case cmix_proto::CMixMessage::ContentsCase::kRealpost: case cmix_proto::CMixMessage::ContentsCase::kCommitments: case cmix_proto::CMixMessage::ContentsCase::kPayload: { BOOST_LOG_TRIVIAL(error) << "handle_message: CMixMessage contains unknown contents."; connections.erase(it); break; } } } Stats::Stats(boost::asio::io_service& io_service, ListenSettings lsettings) : io_service(io_service) , server(io_service, lsettings, [this](std::unique_ptr&& socket){accept_connection(std::move(socket));}) {} void Stats::run() { io_service.run(); } //Very inefficient... but easy. void Stats::output(std::string file) { for(auto table : data) { std::ofstream ofs(file + "_" + table.first); for(auto it = table.second.begin(); it != table.second.end(); ++it) { if(it != table.second.begin()) { ofs << ", "; } ofs << it->first; } ofs << std::endl; for(size_t i = 0; i < table.second.begin()->second.size(); ++i) { for(auto it = table.second.begin(); it != table.second.end(); ++it) { if(it != table.second.begin()) { ofs << ", "; } if(table.second.begin()->second.size() != it->second.size()) { ofs << it->second[i*2]; } else { ofs << it->second[i]; } } ofs << std::endl; } } }