xref: /aosp_15_r20/hardware/interfaces/tests/libhwbinder/1.0/default/ScheduleTest.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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, &param));
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, &param));
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