blob: 54dc4a29d44ee2db826d5e0336f78d404c0c86a2 [file] [edit]
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include <sstream>
#include "SysCpuMonitor.h"
#include "RecordTask.h"
#include "RecordSession.h"
#include "Scheduler.h"
#include "log.h"
using namespace std;
namespace rr {
SysCpuMonitor::SysCpuMonitor(Task*, const string&) {
}
static string make_cpu_online_data(RecordTask* t) {
const cpu_set_t cpus = t->session().scheduler().pretend_affinity_mask();
int real_ncpus = sysconf(_SC_NPROCESSORS_CONF);
bool last_was_set = false;
std::stringstream result;
bool first = true;
for (int i = 0; i < real_ncpus; ++i) {
bool this_is_set = CPU_ISSET(i, &cpus);
if (this_is_set) {
if (!last_was_set) {
if (!first) {
result << ",";
}
first = false;
result << i;
}
if (!CPU_ISSET(i+1, &cpus)) {
if (last_was_set) {
result << "-" << i;
}
}
}
last_was_set = this_is_set;
}
result << "\n";
return result.str();
}
bool SysCpuMonitor::emulate_read(
RecordTask* t, const vector<Range>& ranges,
LazyOffset& lazy_offset, uint64_t* result) {
string data = make_cpu_online_data(t);
int64_t offset = lazy_offset.retrieve(false);
*result = t->write_ranges(ranges, (uint8_t*)data.data() + offset,
offset > (ssize_t)data.size() ? 0 : data.size() - offset);
return true;
}
} // namespace rr