#include "ScheduleTest.h" #include #include #include using namespace std; #define ASSERT(cond) \ do { \ if (!(cond)) { \ cerr << __func__ << ":" << __LINE__ << " condition:" << #cond \ << " failed\n" \ << endl; \ exit(EXIT_FAILURE); \ } \ } while (0) static int threadPri() { struct sched_param param; int policy; ASSERT(!pthread_getschedparam(pthread_self(), &policy, ¶m)); return param.sched_priority; } static void threadDump(const char* prefix, int verbose) { struct sched_param param; int policy; if (!verbose) return; cout << "--------------------------------------------------" << endl; cout << setw(12) << left << prefix << " pid: " << getpid() << " tid: " << gettid() << " cpu: " << sched_getcpu() << endl; ASSERT(!pthread_getschedparam(pthread_self(), &policy, ¶m)); string s = (policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : "???"; cout << setw(12) << left << s << param.sched_priority << endl; return; } namespace android { namespace hardware { namespace tests { namespace libhwbinder { namespace V1_0 { namespace implementation { // Methods from ::android::hardware::tests::libhwbinder::V1_0::IScheduleTest // follow. Return ScheduleTest::send(uint32_t cfg, uint32_t callerSta) { // TODO implement int priority = threadPri(); int priority_caller = (callerSta >> 16) & 0xffff; int verbose = cfg & 1; threadDump("hwbinder", verbose); uint32_t h = 0, s = 0; if (priority_caller != priority) { h++; if (verbose) { cout << "err priority_caller:" << priority_caller << ", priority:" << priority << endl; } } int cpu = sched_getcpu(); int cpu_caller = (callerSta)&0xffff; if (cpu != cpu_caller) { s++; } return (h << 16) | (s & 0xffff); } // Methods from ::android::hidl::base::V1_0::IBase follow. IScheduleTest* HIDL_FETCH_IScheduleTest(const char* /* name */) { return new ScheduleTest(); } } // namespace implementation } // namespace V1_0 } // namespace libhwbinder } // namespace tests } // namespace hardware } // namespace android