blob: 72c731424bde40c9cf80548136e8c641ff88c8f8 [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurstb1d07442015-05-08 12:04:18 +01002 * Copyright (C) ARM Limited 2013-2015. All rights reserved.
Jon Medhurstaaf37a32013-06-11 12:10:56 +01003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include "Driver.h"
10
Jon Medhurst96b56152014-10-30 18:01:15 +000011#include "Buffer.h"
12#include "SessionData.h"
13
14DriverCounter::DriverCounter(DriverCounter *const next, const char *const name) : mNext(next), mName(name), mKey(getEventKey()), mEnabled(false) {
15}
16
17DriverCounter::~DriverCounter() {
18 delete mName;
19}
20
Jon Medhurstaaf37a32013-06-11 12:10:56 +010021Driver *Driver::head = NULL;
22
23Driver::Driver() : next(head) {
24 head = this;
25}
Jon Medhurst96b56152014-10-30 18:01:15 +000026
27SimpleDriver::~SimpleDriver() {
28 DriverCounter *counters = mCounters;
29 while (counters != NULL) {
30 DriverCounter *counter = counters;
31 counters = counter->getNext();
32 delete counter;
33 }
34}
35
36DriverCounter *SimpleDriver::findCounter(const Counter &counter) const {
37 for (DriverCounter *driverCounter = mCounters; driverCounter != NULL; driverCounter = driverCounter->getNext()) {
38 if (strcmp(driverCounter->getName(), counter.getType()) == 0) {
39 return driverCounter;
40 }
41 }
42
43 return NULL;
44}
45
46bool SimpleDriver::claimCounter(const Counter &counter) const {
47 return findCounter(counter) != NULL;
48}
49
50bool SimpleDriver::countersEnabled() const {
51 for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
52 if (counter->isEnabled()) {
53 return true;
54 }
55 }
56 return false;
57}
58
59void SimpleDriver::resetCounters() {
60 for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
61 counter->setEnabled(false);
62 }
63}
64
65void SimpleDriver::setupCounter(Counter &counter) {
66 DriverCounter *const driverCounter = findCounter(counter);
67 if (driverCounter == NULL) {
68 counter.setEnabled(false);
69 return;
70 }
71 driverCounter->setEnabled(true);
72 counter.setKey(driverCounter->getKey());
73}
74
75int SimpleDriver::writeCounters(mxml_node_t *root) const {
76 int count = 0;
77 for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
78 mxml_node_t *node = mxmlNewElement(root, "counter");
79 mxmlElementSetAttr(node, "name", counter->getName());
80 ++count;
81 }
82
83 return count;
84}
85
86PolledDriver::~PolledDriver() {
87}
88
89void PolledDriver::read(Buffer *const buffer) {
90 for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) {
91 if (!counter->isEnabled()) {
92 continue;
93 }
94 buffer->event64(counter->getKey(), counter->read());
95 }
96}