diff options
Diffstat (limited to 'tools/gator/daemon/Driver.cpp')
-rw-r--r-- | tools/gator/daemon/Driver.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tools/gator/daemon/Driver.cpp b/tools/gator/daemon/Driver.cpp new file mode 100644 index 000000000000..275da31c7a0d --- /dev/null +++ b/tools/gator/daemon/Driver.cpp @@ -0,0 +1,96 @@ +/** + * 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 "Driver.h" + +#include "Buffer.h" +#include "SessionData.h" + +DriverCounter::DriverCounter(DriverCounter *const next, const char *const name) : mNext(next), mName(name), mKey(getEventKey()), mEnabled(false) { +} + +DriverCounter::~DriverCounter() { + delete mName; +} + +Driver *Driver::head = NULL; + +Driver::Driver() : next(head) { + head = this; +} + +SimpleDriver::~SimpleDriver() { + DriverCounter *counters = mCounters; + while (counters != NULL) { + DriverCounter *counter = counters; + counters = counter->getNext(); + delete counter; + } +} + +DriverCounter *SimpleDriver::findCounter(const Counter &counter) const { + for (DriverCounter *driverCounter = mCounters; driverCounter != NULL; driverCounter = driverCounter->getNext()) { + if (strcmp(driverCounter->getName(), counter.getType()) == 0) { + return driverCounter; + } + } + + return NULL; +} + +bool SimpleDriver::claimCounter(const Counter &counter) const { + return findCounter(counter) != NULL; +} + +bool SimpleDriver::countersEnabled() const { + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + if (counter->isEnabled()) { + return true; + } + } + return false; +} + +void SimpleDriver::resetCounters() { + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + counter->setEnabled(false); + } +} + +void SimpleDriver::setupCounter(Counter &counter) { + DriverCounter *const driverCounter = findCounter(counter); + if (driverCounter == NULL) { + counter.setEnabled(false); + return; + } + driverCounter->setEnabled(true); + counter.setKey(driverCounter->getKey()); +} + +int SimpleDriver::writeCounters(mxml_node_t *root) const { + int count = 0; + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + mxml_node_t *node = mxmlNewElement(root, "counter"); + mxmlElementSetAttr(node, "name", counter->getName()); + ++count; + } + + return count; +} + +PolledDriver::~PolledDriver() { +} + +void PolledDriver::read(Buffer *const buffer) { + for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) { + if (!counter->isEnabled()) { + continue; + } + buffer->event64(counter->getKey(), counter->read()); + } +} |