blob: d3eef77b134055f71408f109804971f28fb8f309 [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"
5#include <android-base/logging.h>
6#include <inttypes.h>
7
8namespace android {
9namespace hardware {
10namespace tests {
11namespace foo {
12namespace V1_0 {
13namespace implementation {
14
Yifan Hong9517f9c2016-10-13 11:21:56 -070015enum {
16 NOT_REPORTED = -1LL
17};
18
19FooCallback::FooCallback()
20 : mLock{}, mCond{} {
21 for (size_t i = 0; i < invokeInfo.size(); i++) {
22 invokeInfo[i].invoked = false;
23 invokeInfo[i].timeNs = NOT_REPORTED;
24 invokeInfo[i].callerBlockedNs = NOT_REPORTED;
25 }
26}
27
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070028Return<void> FooCallback::heyItsYou(
29 const sp<IFooCallback> &_cb) {
30 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070031 ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get());
32 nsecs_t end = systemTime();
33 {
34 Mutex::Autolock lock(mLock);
35 invokeInfo[0].invoked = true;
36 invokeInfo[0].timeNs = end - start;
37 mCond.signal();
38 }
39 ALOGI("SERVER(FooCallback) 2: heyItsYou returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070040 return Void();
41}
42
43Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
44 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070045 ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070046 sleep(DELAY_S);
Yifan Hong9517f9c2016-10-13 11:21:56 -070047 ALOGI("SERVER(FooCallback) 4: heyItsYouIsntIt cb = %p responding", _cb.get());
48 nsecs_t end = systemTime();
49 {
50 Mutex::Autolock lock(mLock);
51 invokeInfo[1].invoked = true;
52 invokeInfo[1].timeNs = end - start;
53 mCond.signal();
54 }
55 ALOGI("SERVER(FooCallback) 5: heyItsYouIsntIt cb = %p responding", _cb.get());
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070056 return true;
57}
58
59Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
60 nsecs_t start = systemTime();
Yifan Hong9517f9c2016-10-13 11:21:56 -070061 ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070062 sleep(DELAY_S);
Yifan Hong9517f9c2016-10-13 11:21:56 -070063 ALOGI("SERVER(FooCallback) 6.2: heyItsTheMeaningOfLife = %d done sleeping", tmol);
64 nsecs_t end = systemTime();
65 {
66 Mutex::Autolock lock(mLock);
67 invokeInfo[2].invoked = true;
68 invokeInfo[2].timeNs = end - start;
69 mCond.signal();
70 }
71 ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070072 return Void();
73}
74
75Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
Yifan Hong9517f9c2016-10-13 11:21:56 -070076 ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
Yifan Hongd5b5b2e2016-10-06 13:50:49 -070077 nsecs_t leftToWaitNs = ns;
Yifan Hong9517f9c2016-10-13 11:21:56 -070078 bool cond;
79 {
80 Mutex::Autolock lock(mLock);
81 while ((cond = ((!invokeInfo[0].invoked ||
82 !invokeInfo[1].invoked ||
83 !invokeInfo[2].invoked ||
84 invokeInfo[0].callerBlockedNs == NOT_REPORTED ||
85 invokeInfo[1].callerBlockedNs == NOT_REPORTED ||
86 invokeInfo[2].callerBlockedNs == NOT_REPORTED) &&
87 leftToWaitNs > 0))) {
88 nsecs_t start = systemTime();
89 ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
90 if (rc != ::android::OK) {
91 ALOGW("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
92 if (rc == -ETIMEDOUT) {
93 // time's up
94 leftToWaitNs = -1;
95 }
96 break;
97 }
98 ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
99 leftToWaitNs -= systemTime() - start;
100 }
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700101 }
Yifan Hong9517f9c2016-10-13 11:21:56 -0700102 ALOGI("SERVER(FooCallback) 8.2: reportResults returned;"
103 "invoked? %d, %d, %d; leftToWaitNs = %" PRId64 "; cond = %d",
104 invokeInfo[0].invoked, invokeInfo[1].invoked, invokeInfo[2].invoked,
105 leftToWaitNs, cond);
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700106 cb(leftToWaitNs, invokeInfo);
107 return Void();
108}
109
110Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
Yifan Hong9517f9c2016-10-13 11:21:56 -0700111 ALOGI("SERVER(FooCallback) 7.1: youBlockedMeFor");
112 {
113 Mutex::Autolock lock(mLock);
114 for (size_t i = 0; i < 3; i++) {
115 invokeInfo[i].callerBlockedNs = ns[i];
116 }
117 mCond.signal();
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700118 }
Yifan Hong9517f9c2016-10-13 11:21:56 -0700119 ALOGI("SERVER(FooCallback) 7.2: returned");
Yifan Hongd5b5b2e2016-10-06 13:50:49 -0700120 return Void();
121}
122
123IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
124 return new FooCallback();
125}
126
127} // namespace implementation
128} // namespace V1_0
129} // namespace foo
130} // namespace tests
131} // namespace hardware
132} // namespace android