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