From: Yifan Hong Date: Thu, 13 Oct 2016 18:21:56 +0000 (-0700) Subject: hidl_test: Fix failing tests. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9517f9c8712cf7c23817b2a9e8b45b2f368c4a61;p=android-x86%2Fhardware-interfaces.git hidl_test: Fix failing tests. Test: The following succeeds. croot && cd hardware/interfaces mma croot && cd system/tools/hidl mma adb shell /data/nativetest64/hidl_test/hidl_test Bug: 31819198 Change-Id: I40c2338d09d5e80b9bad2d918b7b8c3f2709f434 --- diff --git a/tests/foo/1.0/default/FooCallback.cpp b/tests/foo/1.0/default/FooCallback.cpp index 08d3ce08..d3eef77b 100644 --- a/tests/foo/1.0/default/FooCallback.cpp +++ b/tests/foo/1.0/default/FooCallback.cpp @@ -1,3 +1,6 @@ + +#define LOG_TAG "hidl_test" + #include "FooCallback.h" #include #include @@ -9,68 +12,111 @@ 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 FooCallback::heyItsYou( const sp &_cb) { nsecs_t start = systemTime(); - ALOGI("SERVER(FooCallback) heyItsYou cb = %p", _cb.get()); - mLock.lock(); - invokeInfo[0].invoked = true; - invokeInfo[0].timeNs = systemTime() - start; - mCond.signal(); - mLock.unlock(); + 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 FooCallback::heyItsYouIsntIt(const sp &_cb) { nsecs_t start = systemTime(); - ALOGI("SERVER(FooCallback) heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S); + ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S); sleep(DELAY_S); - ALOGI("SERVER(FooCallback) heyItsYouIsntIt cb = %p responding", _cb.get()); - mLock.lock(); - invokeInfo[1].invoked = true; - invokeInfo[1].timeNs = systemTime() - start; - mCond.signal(); - mLock.unlock(); + 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 FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) { nsecs_t start = systemTime(); - ALOGI("SERVER(FooCallback) heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S); + ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S); sleep(DELAY_S); - ALOGI("SERVER(FooCallback) heyItsTheMeaningOfLife = %d done sleeping", tmol); - mLock.lock(); - invokeInfo[2].invoked = true; - invokeInfo[2].timeNs = systemTime() - start; - mCond.signal(); - mLock.unlock(); + 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 FooCallback::reportResults(int64_t ns, reportResults_cb cb) { - ALOGI("SERVER(FooCallback) reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns)); + ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns)); nsecs_t leftToWaitNs = ns; - mLock.lock(); - while (!(invokeInfo[0].invoked && invokeInfo[1].invoked && invokeInfo[2].invoked) && - leftToWaitNs > 0) { - nsecs_t start = systemTime(); - ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs); - if (rc != ::android::OK) { - ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc); - break; - } - ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns); - leftToWaitNs -= systemTime() - start; + 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 = -1; + } + break; + } + ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns); + leftToWaitNs -= systemTime() - start; + } } - mLock.unlock(); + 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 FooCallback::youBlockedMeFor(const hidl_array &ns) { - for (size_t i = 0; i < 3; i++) { - invokeInfo[i].callerBlockedNs = ns[i]; + 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(); } diff --git a/tests/foo/1.0/default/FooCallback.h b/tests/foo/1.0/default/FooCallback.h index 6c284ca6..59219724 100644 --- a/tests/foo/1.0/default/FooCallback.h +++ b/tests/foo/1.0/default/FooCallback.h @@ -22,7 +22,7 @@ using ::android::hardware::hidl_string; using ::android::sp; struct FooCallback : public IFooCallback { - FooCallback() : mLock{}, mCond{} {} + FooCallback(); // Methods from ::android::hardware::tests::foo::V1_0::IFooCallback follow. Return heyItsYou(const sp& cb) override; Return heyItsYouIsntIt(const sp& cb) override;