blob: 08d3ce08a399f45684c7edb7d948ce25663865fe [file] [log] [blame]
Yifan Hongdd39db02016-10-06 13:50:49 -07001#include "FooCallback.h"
2#include <android-base/logging.h>
3#include <inttypes.h>
4
5namespace android {
6namespace hardware {
7namespace tests {
8namespace foo {
9namespace V1_0 {
10namespace implementation {
11
12Return<void> FooCallback::heyItsYou(
13 const sp<IFooCallback> &_cb) {
14 nsecs_t start = systemTime();
15 ALOGI("SERVER(FooCallback) heyItsYou cb = %p", _cb.get());
16 mLock.lock();
17 invokeInfo[0].invoked = true;
18 invokeInfo[0].timeNs = systemTime() - start;
19 mCond.signal();
20 mLock.unlock();
21 return Void();
22}
23
24Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
25 nsecs_t start = systemTime();
26 ALOGI("SERVER(FooCallback) heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
27 sleep(DELAY_S);
28 ALOGI("SERVER(FooCallback) heyItsYouIsntIt cb = %p responding", _cb.get());
29 mLock.lock();
30 invokeInfo[1].invoked = true;
31 invokeInfo[1].timeNs = systemTime() - start;
32 mCond.signal();
33 mLock.unlock();
34 return true;
35}
36
37Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
38 nsecs_t start = systemTime();
39 ALOGI("SERVER(FooCallback) heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
40 sleep(DELAY_S);
41 ALOGI("SERVER(FooCallback) heyItsTheMeaningOfLife = %d done sleeping", tmol);
42 mLock.lock();
43 invokeInfo[2].invoked = true;
44 invokeInfo[2].timeNs = systemTime() - start;
45 mCond.signal();
46 mLock.unlock();
47 return Void();
48}
49
50Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
51 ALOGI("SERVER(FooCallback) reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
52 nsecs_t leftToWaitNs = ns;
53 mLock.lock();
54 while (!(invokeInfo[0].invoked && invokeInfo[1].invoked && invokeInfo[2].invoked) &&
55 leftToWaitNs > 0) {
56 nsecs_t start = systemTime();
57 ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
58 if (rc != ::android::OK) {
59 ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
60 break;
61 }
62 ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
63 leftToWaitNs -= systemTime() - start;
64 }
65 mLock.unlock();
66 cb(leftToWaitNs, invokeInfo);
67 return Void();
68}
69
70Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
71 for (size_t i = 0; i < 3; i++) {
72 invokeInfo[i].callerBlockedNs = ns[i];
73 }
74 return Void();
75}
76
77IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
78 return new FooCallback();
79}
80
81} // namespace implementation
82} // namespace V1_0
83} // namespace foo
84} // namespace tests
85} // namespace hardware
86} // namespace android