1 /*
2  * Copyright (c) 2014 Google, Inc.  All Rights Reserved.
3  *
4  */
5 #ifndef POWER_HAL_TIME_QOS_MANAGER_H
6 #define POWER_HAL_TIME_QOS_MANAGER_H
7 
8 #include <stdint.h>
9 #include <sys/types.h>
10 
11 #include <utils/threads.h>
12 #include <utils/String8.h>
13 #include <utils/Errors.h>
14 #include <utils/Log.h>
15 
16 using namespace android;
17 
18 extern void sysfs_write(const char *path, const char *s);
19 
20 class QosObject {
21 public:
~QosObject()22     virtual ~QosObject() {}
23 
24     virtual void enter() = 0;
25     virtual void exit() = 0;
26 };
27 
28 class SysfsQosObject : public QosObject {
29 public:
SysfsQosObject(const char * nodeName,const char * enterCmd,const char * exitCmd)30     SysfsQosObject(const char* nodeName, const char* enterCmd, const char* exitCmd)
31      : mNodeName(nodeName), mEnterCmd(enterCmd), mExitCmd(exitCmd) {}
32 
33     virtual void enter();
34     virtual void exit();
35 
36 private:
37     const char *mNodeName;
38     const char *mEnterCmd;
39     const char *mExitCmd;
40 
41 };
42 
43 class TimedQosManager : public Thread {
44 public:
TimedQosManager(const char * name,QosObject * qosObj,bool oneShot)45     TimedQosManager(const char *name, QosObject *qosObj, bool oneShot) :
46         Thread(false), mName(name), mQosObject(qosObj), mOneShot(oneShot), mLock("lock") {}
47 
~TimedQosManager()48     virtual ~TimedQosManager() { delete mQosObject; }
49 
50     virtual bool threadLoop();
51 
52     void requestTimedQos(nsecs_t timeout);
53 
54 private:
55     const char *mName;
56     QosObject *mQosObject;
57     bool mOneShot;
58 
59     Mutex mLock;
60     Condition mCondition;
61 
62     nsecs_t mTargetTime;
63 };
64 
65 #endif
66