/** * Copyright (C) ARM Limited 2013-2016. 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. */ #ifndef DRIVER_H #define DRIVER_H #include #include "mxml/mxml.h" class Buffer; class Counter; class DriverCounter { public: DriverCounter(DriverCounter *const next, const char *const name); virtual ~DriverCounter(); DriverCounter *getNext() const { return mNext; } const char *getName() const { return mName; } int getKey() const { return mKey; } bool isEnabled() const { return mEnabled; } void setEnabled(const bool enabled) { mEnabled = enabled; } virtual int64_t read() { return -1; } private: DriverCounter *const mNext; const char *const mName; const int mKey; bool mEnabled; // Intentionally unimplemented DriverCounter(const DriverCounter &); DriverCounter &operator=(const DriverCounter &); }; class Driver { public: static Driver *getHead() { return head; } virtual ~Driver(); // Returns true if this driver can manage the counter virtual bool claimCounter(const Counter &counter) const = 0; // Clears and disables all counters virtual void resetCounters() = 0; // Enables and prepares the counter for capture virtual void setupCounter(Counter &counter) = 0; // Performs any actions needed for setup or based on eventsXML virtual void readEvents(mxml_node_t *const) {} // Emits available counters virtual int writeCounters(mxml_node_t *const root) const = 0; // Emits possible dynamically generated events/counters virtual void writeEvents(mxml_node_t *const) const {} Driver *getNext() const { return next; } protected: Driver(); private: static Driver *head; Driver *next; // Intentionally unimplemented Driver(const Driver &); Driver &operator=(const Driver &); }; class SimpleDriver : public Driver { public: virtual ~SimpleDriver(); bool claimCounter(const Counter &counter) const; bool countersEnabled() const; void resetCounters(); void setupCounter(Counter &counter); int writeCounters(mxml_node_t *root) const; protected: SimpleDriver() : mCounters(NULL) {} DriverCounter *getCounters() const { return mCounters; } void setCounters(DriverCounter *const counter) { mCounters = counter; } DriverCounter *findCounter(const Counter &counter) const; private: DriverCounter *mCounters; // Intentionally unimplemented SimpleDriver(const SimpleDriver &); SimpleDriver &operator=(const SimpleDriver &); }; class PolledDriver : public SimpleDriver { public: virtual ~PolledDriver(); virtual void start() {} virtual void read(Buffer *const buffer); protected: PolledDriver() {} private: // Intentionally unimplemented PolledDriver(const PolledDriver &); PolledDriver &operator=(const PolledDriver &); }; #endif // DRIVER_H