blob: ff3a5457d344553f946c1da9b0fdfde118b94e47 [file] [log] [blame]
Yifan Hong9517f9c2016-10-13 11:21:56 -07001
2#define LOG_TAG "hidl_test"
3
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07004#include "FooCallback.h"
Yifan Hong0c4c7a32016-11-28 15:59:24 -08005#include <android/log.h>
Yifan Hong30dc3de2016-10-17 11:38:15 -07006#include <hidl-test/FooHelper.h>
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07007#include <inttypes.h>
Yifan Hong30dc3de2016-10-17 11:38:15 -07008#include <utils/Timers.h>
Yifan Hongd5b5b2e2016-10-06 13:50:49 -07009
10namespace android {
11namespace hardware {
12namespace tests {
13namespace foo {
14namespace V1_0 {
15namespace implementation {
16
Yifan Hong9517f9c2016-10-13 11:21:56 -070017enum {
18 NOT_REPORTED = -1LL
19};
20
21FooCallback::FooCallback()
22 : mLock{}, mCond{} {
23 for (size_t i = 0; i < invokeInfo.size(); i++) {
24 invokeInfo[i].invoked = false;
25 invokeInfo[i].timeNs = NOT_REPORTED;
26 invokeInfo[i].callerBlockedNs = NOT_REPORTED;
27 }
28}
29
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070030Return<void> FooCallback::heyItsYou(
31 const sp<IFooCallback> &_cb) {
32 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070033 ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get());
34 nsecs_t end = systemTime();
35 {
36 Mutex::Autolock lock(mLock);
37 invokeInfo[0].invoked = true;
38 invokeInfo[0].timeNs = end - start;
39 mCond.signal();
40 }
41 ALOGI("SERVER(FooCallback) 2: heyItsYou returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070042 return Void();
43}
44
45Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
46 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070047 ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070048 sleep(DELAY_S);
Yifan Hong9517f9c2016-10-13 11:21:56 -070049 ALOGI("SERVER(FooCallback) 4: heyItsYouIsntIt cb = %p responding", _cb.get());
50 nsecs_t end = systemTime();
51 {
52 Mutex::Autolock lock(mLock);
53 invokeInfo[1].invoked = true;
54 invokeInfo[1].timeNs = end - start;
55 mCond.signal();
56 }
57 ALOGI("SERVER(FooCallback) 5: heyItsYouIsntIt cb = %p responding", _cb.get());
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070058 return true;
59}
60
61Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
62 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070063 ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070064 sleep(DELAY_S);
Yifan Hong9517f9c2016-10-13 11:21:56 -070065 ALOGI("SERVER(FooCallback) 6.2: heyItsTheMeaningOfLife = %d done sleeping", tmol);
66 nsecs_t end = systemTime();
67 {
68 Mutex::Autolock lock(mLock);
69 invokeInfo[2].invoked = true;
70 invokeInfo[2].timeNs = end - start;
71 mCond.signal();
72 }
73 ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070074 return Void();
75}
76
77Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
Yifan Hong9517f9c2016-10-13 11:21:56 -070078 ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070079 nsecs_t leftToWaitNs = ns;
Yifan Hong9517f9c2016-10-13 11:21:56 -070080 bool cond;
81 {
82 Mutex::Autolock lock(mLock);
83 while ((cond = ((!invokeInfo[0].invoked ||
84 !invokeInfo[1].invoked ||
85 !invokeInfo[2].invoked ||
86 invokeInfo[0].callerBlockedNs == NOT_REPORTED ||
87 invokeInfo[1].callerBlockedNs == NOT_REPORTED ||
88 invokeInfo[2].callerBlockedNs == NOT_REPORTED) &&
89 leftToWaitNs > 0))) {
90 nsecs_t start = systemTime();
91 ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
92 if (rc != ::android::OK) {
93 ALOGW("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
94 if (rc == -ETIMEDOUT) {
95 // time's up
96 leftToWaitNs = -1;
97 }
98 break;
99 }
100 ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
101 leftToWaitNs -= systemTime() - start;
102 }
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700103 }
Yifan Hong9517f9c2016-10-13 11:21:56 -0700104 ALOGI("SERVER(FooCallback) 8.2: reportResults returned;"
105 "invoked? %d, %d, %d; leftToWaitNs = %" PRId64 "; cond = %d",
106 invokeInfo[0].invoked, invokeInfo[1].invoked, invokeInfo[2].invoked,
107 leftToWaitNs, cond);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700108 cb(leftToWaitNs, invokeInfo);
109 return Void();
110}
111
112Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
Yifan Hong9517f9c2016-10-13 11:21:56 -0700113 ALOGI("SERVER(FooCallback) 7.1: youBlockedMeFor");
114 {
115 Mutex::Autolock lock(mLock);
116 for (size_t i = 0; i < 3; i++) {
117 invokeInfo[i].callerBlockedNs = ns[i];
118 }
119 mCond.signal();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700120 }
Yifan Hong9517f9c2016-10-13 11:21:56 -0700121 ALOGI("SERVER(FooCallback) 7.2: returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700122 return Void();
123}
124
125IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
126 return new FooCallback();
127}
128
129} // namespace implementation
130} // namespace V1_0
131} // namespace foo
132} // namespace tests
133} // namespace hardware
134} // namespace android