1*4d7e907cSAndroid Build Coastguard Worker #include "ScheduleTest.h"
2*4d7e907cSAndroid Build Coastguard Worker #include <pthread.h>
3*4d7e907cSAndroid Build Coastguard Worker #include <iomanip>
4*4d7e907cSAndroid Build Coastguard Worker #include <iostream>
5*4d7e907cSAndroid Build Coastguard Worker
6*4d7e907cSAndroid Build Coastguard Worker using namespace std;
7*4d7e907cSAndroid Build Coastguard Worker
8*4d7e907cSAndroid Build Coastguard Worker #define ASSERT(cond) \
9*4d7e907cSAndroid Build Coastguard Worker do { \
10*4d7e907cSAndroid Build Coastguard Worker if (!(cond)) { \
11*4d7e907cSAndroid Build Coastguard Worker cerr << __func__ << ":" << __LINE__ << " condition:" << #cond \
12*4d7e907cSAndroid Build Coastguard Worker << " failed\n" \
13*4d7e907cSAndroid Build Coastguard Worker << endl; \
14*4d7e907cSAndroid Build Coastguard Worker exit(EXIT_FAILURE); \
15*4d7e907cSAndroid Build Coastguard Worker } \
16*4d7e907cSAndroid Build Coastguard Worker } while (0)
17*4d7e907cSAndroid Build Coastguard Worker
threadPri()18*4d7e907cSAndroid Build Coastguard Worker static int threadPri() {
19*4d7e907cSAndroid Build Coastguard Worker struct sched_param param;
20*4d7e907cSAndroid Build Coastguard Worker int policy;
21*4d7e907cSAndroid Build Coastguard Worker ASSERT(!pthread_getschedparam(pthread_self(), &policy, ¶m));
22*4d7e907cSAndroid Build Coastguard Worker return param.sched_priority;
23*4d7e907cSAndroid Build Coastguard Worker }
24*4d7e907cSAndroid Build Coastguard Worker
threadDump(const char * prefix,int verbose)25*4d7e907cSAndroid Build Coastguard Worker static void threadDump(const char* prefix, int verbose) {
26*4d7e907cSAndroid Build Coastguard Worker struct sched_param param;
27*4d7e907cSAndroid Build Coastguard Worker int policy;
28*4d7e907cSAndroid Build Coastguard Worker if (!verbose) return;
29*4d7e907cSAndroid Build Coastguard Worker cout << "--------------------------------------------------" << endl;
30*4d7e907cSAndroid Build Coastguard Worker cout << setw(12) << left << prefix << " pid: " << getpid()
31*4d7e907cSAndroid Build Coastguard Worker << " tid: " << gettid() << " cpu: " << sched_getcpu() << endl;
32*4d7e907cSAndroid Build Coastguard Worker ASSERT(!pthread_getschedparam(pthread_self(), &policy, ¶m));
33*4d7e907cSAndroid Build Coastguard Worker string s = (policy == SCHED_OTHER)
34*4d7e907cSAndroid Build Coastguard Worker ? "SCHED_OTHER"
35*4d7e907cSAndroid Build Coastguard Worker : (policy == SCHED_FIFO)
36*4d7e907cSAndroid Build Coastguard Worker ? "SCHED_FIFO"
37*4d7e907cSAndroid Build Coastguard Worker : (policy == SCHED_RR) ? "SCHED_RR" : "???";
38*4d7e907cSAndroid Build Coastguard Worker cout << setw(12) << left << s << param.sched_priority << endl;
39*4d7e907cSAndroid Build Coastguard Worker return;
40*4d7e907cSAndroid Build Coastguard Worker }
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker namespace android {
43*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
44*4d7e907cSAndroid Build Coastguard Worker namespace tests {
45*4d7e907cSAndroid Build Coastguard Worker namespace libhwbinder {
46*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
47*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
48*4d7e907cSAndroid Build Coastguard Worker
49*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::tests::libhwbinder::V1_0::IScheduleTest
50*4d7e907cSAndroid Build Coastguard Worker // follow.
send(uint32_t cfg,uint32_t callerSta)51*4d7e907cSAndroid Build Coastguard Worker Return<uint32_t> ScheduleTest::send(uint32_t cfg, uint32_t callerSta) {
52*4d7e907cSAndroid Build Coastguard Worker // TODO implement
53*4d7e907cSAndroid Build Coastguard Worker int priority = threadPri();
54*4d7e907cSAndroid Build Coastguard Worker int priority_caller = (callerSta >> 16) & 0xffff;
55*4d7e907cSAndroid Build Coastguard Worker int verbose = cfg & 1;
56*4d7e907cSAndroid Build Coastguard Worker threadDump("hwbinder", verbose);
57*4d7e907cSAndroid Build Coastguard Worker uint32_t h = 0, s = 0;
58*4d7e907cSAndroid Build Coastguard Worker if (priority_caller != priority) {
59*4d7e907cSAndroid Build Coastguard Worker h++;
60*4d7e907cSAndroid Build Coastguard Worker if (verbose) {
61*4d7e907cSAndroid Build Coastguard Worker cout << "err priority_caller:" << priority_caller
62*4d7e907cSAndroid Build Coastguard Worker << ", priority:" << priority << endl;
63*4d7e907cSAndroid Build Coastguard Worker }
64*4d7e907cSAndroid Build Coastguard Worker }
65*4d7e907cSAndroid Build Coastguard Worker int cpu = sched_getcpu();
66*4d7e907cSAndroid Build Coastguard Worker int cpu_caller = (callerSta)&0xffff;
67*4d7e907cSAndroid Build Coastguard Worker if (cpu != cpu_caller) {
68*4d7e907cSAndroid Build Coastguard Worker s++;
69*4d7e907cSAndroid Build Coastguard Worker }
70*4d7e907cSAndroid Build Coastguard Worker return (h << 16) | (s & 0xffff);
71*4d7e907cSAndroid Build Coastguard Worker }
72*4d7e907cSAndroid Build Coastguard Worker
73*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hidl::base::V1_0::IBase follow.
74*4d7e907cSAndroid Build Coastguard Worker
HIDL_FETCH_IScheduleTest(const char *)75*4d7e907cSAndroid Build Coastguard Worker IScheduleTest* HIDL_FETCH_IScheduleTest(const char* /* name */) {
76*4d7e907cSAndroid Build Coastguard Worker return new ScheduleTest();
77*4d7e907cSAndroid Build Coastguard Worker }
78*4d7e907cSAndroid Build Coastguard Worker
79*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
80*4d7e907cSAndroid Build Coastguard Worker } // namespace V1_0
81*4d7e907cSAndroid Build Coastguard Worker } // namespace libhwbinder
82*4d7e907cSAndroid Build Coastguard Worker } // namespace tests
83*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
84*4d7e907cSAndroid Build Coastguard Worker } // namespace android
85