1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#define LOG_TAG "hidl_test"
#include "FooCallback.h"
#include <hidl-test/FooHelper.h>
#include <inttypes.h>
#include <log/log.h>
#include <utils/Timers.h>
namespace android {
namespace hardware {
namespace tests {
namespace foo {
namespace V1_0 {
namespace implementation {
enum {
NOT_REPORTED = -1LL
};
FooCallback::FooCallback()
: mLock{}, mCond{} {
for (size_t i = 0; i < invokeInfo.size(); i++) {
invokeInfo[i].invoked = false;
invokeInfo[i].timeNs = NOT_REPORTED;
invokeInfo[i].callerBlockedNs = NOT_REPORTED;
}
}
Return<void> FooCallback::heyItsYou(
const sp<IFooCallback> &_cb) {
nsecs_t start = systemTime();
ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get());
nsecs_t end = systemTime();
{
Mutex::Autolock lock(mLock);
invokeInfo[0].invoked = true;
invokeInfo[0].timeNs = end - start;
mCond.signal();
}
ALOGI("SERVER(FooCallback) 2: heyItsYou returned");
return Void();
}
Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
nsecs_t start = systemTime();
ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
sleep(DELAY_S);
ALOGI("SERVER(FooCallback) 4: heyItsYouIsntIt cb = %p responding", _cb.get());
nsecs_t end = systemTime();
{
Mutex::Autolock lock(mLock);
invokeInfo[1].invoked = true;
invokeInfo[1].timeNs = end - start;
mCond.signal();
}
ALOGI("SERVER(FooCallback) 5: heyItsYouIsntIt cb = %p responding", _cb.get());
return true;
}
Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
nsecs_t start = systemTime();
ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
sleep(DELAY_S);
ALOGI("SERVER(FooCallback) 6.2: heyItsTheMeaningOfLife = %d done sleeping", tmol);
nsecs_t end = systemTime();
{
Mutex::Autolock lock(mLock);
invokeInfo[2].invoked = true;
invokeInfo[2].timeNs = end - start;
mCond.signal();
}
ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned");
return Void();
}
Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
nsecs_t leftToWaitNs = ns;
bool cond;
{
Mutex::Autolock lock(mLock);
while ((cond = ((!invokeInfo[0].invoked ||
!invokeInfo[1].invoked ||
!invokeInfo[2].invoked ||
invokeInfo[0].callerBlockedNs == NOT_REPORTED ||
invokeInfo[1].callerBlockedNs == NOT_REPORTED ||
invokeInfo[2].callerBlockedNs == NOT_REPORTED) &&
leftToWaitNs > 0))) {
nsecs_t start = systemTime();
::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
if (rc != ::android::OK) {
ALOGW("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
if (rc == -ETIMEDOUT) {
// time's up
leftToWaitNs = -INT32_MAX;
}
break;
}
ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
leftToWaitNs -= systemTime() - start;
}
}
ALOGI("SERVER(FooCallback) 8.2: reportResults returned;"
"invoked? %d, %d, %d; leftToWaitNs = %" PRId64 "; cond = %d",
invokeInfo[0].invoked, invokeInfo[1].invoked, invokeInfo[2].invoked,
leftToWaitNs, cond);
cb(leftToWaitNs, invokeInfo);
return Void();
}
Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
ALOGI("SERVER(FooCallback) 7.1: youBlockedMeFor");
{
Mutex::Autolock lock(mLock);
for (size_t i = 0; i < 3; i++) {
invokeInfo[i].callerBlockedNs = ns[i];
}
mCond.signal();
}
ALOGI("SERVER(FooCallback) 7.2: returned");
return Void();
}
IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
return new FooCallback();
}
} // namespace implementation
} // namespace V1_0
} // namespace foo
} // namespace tests
} // namespace hardware
} // namespace android
|