OSDN Git Service

hidl_test: Fix failing tests.
authorYifan Hong <elsk@google.com>
Thu, 13 Oct 2016 18:21:56 +0000 (11:21 -0700)
committerYifan Hong <elsk@google.com>
Tue, 18 Oct 2016 18:39:00 +0000 (11:39 -0700)
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

tests/foo/1.0/default/FooCallback.cpp
tests/foo/1.0/default/FooCallback.h

index 08d3ce0..d3eef77 100644 (file)
@@ -1,3 +1,6 @@
+
+#define LOG_TAG "hidl_test"
+
 #include "FooCallback.h"
 #include <android-base/logging.h>
 #include <inttypes.h>
@@ -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();
-    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<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();
-    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<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();
-    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<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) {
-      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<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &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();
 }
 
index 6c284ca..5921972 100644 (file)
@@ -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;