diff options
author | Mark Brown <broonie@kernel.org> | 2014-11-21 17:41:15 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-11-21 17:41:15 +0000 |
commit | a0cee48898708dd3074492edf369fd4c5aecb6c3 (patch) | |
tree | aec33bcf75e1d93b6403740ac44847b94e484282 /tools/gator/daemon/MemInfoDriver.cpp | |
parent | 7d5de3be939c7e0ad8c7011991a9b3356e2f8516 (diff) | |
parent | 845187c7b4f1d0a1f6c84325d2c0f81a79e1cd9f (diff) |
Merge remote-tracking branch 'lsk/v3.14/topic/gator' into linux-linaro-lsk-v3.14
Diffstat (limited to 'tools/gator/daemon/MemInfoDriver.cpp')
-rw-r--r-- | tools/gator/daemon/MemInfoDriver.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
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); +} |