Loading tests/foo/1.0/default/FooCallback.cpp +81 −35 Original line number Diff line number Diff line #define LOG_TAG "hidl_test" #include "FooCallback.h" #include <android-base/logging.h> #include <inttypes.h> Loading @@ -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<void> FooCallback::heyItsYou( const sp<IFooCallback> &_cb) { nsecs_t start = systemTime(); ALOGI("SERVER(FooCallback) heyItsYou cb = %p", _cb.get()); mLock.lock(); ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get()); nsecs_t end = systemTime(); { Mutex::Autolock lock(mLock); invokeInfo[0].invoked = true; invokeInfo[0].timeNs = systemTime() - start; invokeInfo[0].timeNs = end - start; mCond.signal(); mLock.unlock(); } ALOGI("SERVER(FooCallback) 2: heyItsYou returned"); return Void(); } Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_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(); 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 = systemTime() - start; invokeInfo[1].timeNs = end - start; mCond.signal(); mLock.unlock(); } 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) 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(); 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 = systemTime() - start; invokeInfo[2].timeNs = end - start; mCond.signal(); mLock.unlock(); } ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned"); return Void(); } Return<void> 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) { 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) { ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc); 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<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(); } Loading tests/foo/1.0/default/FooCallback.h +1 −1 Original line number Diff line number Diff line Loading @@ -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<void> heyItsYou(const sp<IFooCallback>& cb) override; Return<bool> heyItsYouIsntIt(const sp<IFooCallback>& cb) override; Loading Loading
tests/foo/1.0/default/FooCallback.cpp +81 −35 Original line number Diff line number Diff line #define LOG_TAG "hidl_test" #include "FooCallback.h" #include <android-base/logging.h> #include <inttypes.h> Loading @@ -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<void> FooCallback::heyItsYou( const sp<IFooCallback> &_cb) { nsecs_t start = systemTime(); ALOGI("SERVER(FooCallback) heyItsYou cb = %p", _cb.get()); mLock.lock(); ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get()); nsecs_t end = systemTime(); { Mutex::Autolock lock(mLock); invokeInfo[0].invoked = true; invokeInfo[0].timeNs = systemTime() - start; invokeInfo[0].timeNs = end - start; mCond.signal(); mLock.unlock(); } ALOGI("SERVER(FooCallback) 2: heyItsYou returned"); return Void(); } Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_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(); 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 = systemTime() - start; invokeInfo[1].timeNs = end - start; mCond.signal(); mLock.unlock(); } 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) 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(); 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 = systemTime() - start; invokeInfo[2].timeNs = end - start; mCond.signal(); mLock.unlock(); } ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned"); return Void(); } Return<void> 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) { 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) { ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc); 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<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(); } Loading
tests/foo/1.0/default/FooCallback.h +1 −1 Original line number Diff line number Diff line Loading @@ -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<void> heyItsYou(const sp<IFooCallback>& cb) override; Return<bool> heyItsYouIsntIt(const sp<IFooCallback>& cb) override; Loading