From 730ab7f66781e433083572fb9000092e172bec3c Mon Sep 17 00:00:00 2001 From: Jon Medhurst Date: Thu, 30 Oct 2014 18:01:15 +0000 Subject: gator: Version 5.20 Signed-off-by: Jon Medhurst --- tools/gator/daemon/MemInfoDriver.cpp | 93 ++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 tools/gator/daemon/MemInfoDriver.cpp (limited to 'tools/gator/daemon/MemInfoDriver.cpp') diff --git a/tools/gator/daemon/MemInfoDriver.cpp b/tools/gator/daemon/MemInfoDriver.cpp new file mode 100644 index 000000000000..cce15c16fcdc --- /dev/null +++ b/tools/gator/daemon/MemInfoDriver.cpp @@ -0,0 +1,93 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "MemInfoDriver.h" + +#include "Logging.h" +#include "SessionData.h" + +class MemInfoCounter : public DriverCounter { +public: + MemInfoCounter(DriverCounter *next, char *const name, int64_t *const value); + ~MemInfoCounter(); + + int64_t read(); + +private: + int64_t *const mValue; + + // Intentionally unimplemented + MemInfoCounter(const MemInfoCounter &); + MemInfoCounter &operator=(const MemInfoCounter &); +}; + +MemInfoCounter::MemInfoCounter(DriverCounter *next, char *const name, int64_t *const value) : DriverCounter(next, name), mValue(value) { +} + +MemInfoCounter::~MemInfoCounter() { +} + +int64_t MemInfoCounter::read() { + return *mValue; +} + +MemInfoDriver::MemInfoDriver() : mBuf(), mMemUsed(0), mMemFree(0), mBuffers(0) { +} + +MemInfoDriver::~MemInfoDriver() { +} + +void MemInfoDriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_memused2"), &mMemUsed)); + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_memfree"), &mMemFree)); + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_bufferram"), &mBuffers)); +} + +void MemInfoDriver::read(Buffer *const buffer) { + if (!countersEnabled()) { + return; + } + + if (!mBuf.read("/proc/meminfo")) { + logg->logError(__FILE__, __LINE__, "Failed to read /proc/meminfo"); + handleException(); + } + + char *key = mBuf.getBuf(); + char *colon; + int64_t memTotal = 0; + while ((colon = strchr(key, ':')) != NULL) { + char *end = strchr(colon + 1, '\n'); + if (end != NULL) { + *end = '\0'; + } + *colon = '\0'; + + if (strcmp(key, "MemTotal") == 0) { + memTotal = strtoll(colon + 1, NULL, 10) << 10; + } else if (strcmp(key, "MemFree") == 0) { + mMemFree = strtoll(colon + 1, NULL, 10) << 10; + } else if (strcmp(key, "Buffers") == 0) { + mBuffers = strtoll(colon + 1, NULL, 10) << 10; + } + + if (end == NULL) { + break; + } + key = end + 1; + } + + mMemUsed = memTotal - mMemFree; + + super::read(buffer); +} -- cgit v1.2.3