/** * Copyright (C) ARM Limited 2013-2015. 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()); } }