diff options
author | Steven Moreland <smoreland@google.com> | 2023-03-10 22:10:36 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-03-10 22:10:36 +0000 |
commit | 1d6e877de5acc060d2b41b41207d376c40262be2 (patch) | |
tree | 44e5b1b920a43d1ed0cd2e534b6044de90ba3c67 | |
parent | b3c32f8712f39f815d1428eb2b585b09cc547474 (diff) | |
parent | 9687259327b9373cf79e1dca15fbbe8bd16fbe04 (diff) | |
download | native-1d6e877de5acc060d2b41b41207d376c40262be2.tar.gz |
Merge "binder: optimize OnewayCallQueueing"
-rw-r--r-- | libs/binder/tests/IBinderRpcTest.aidl | 4 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcTest.cpp | 26 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcTestCommon.h | 6 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcTestService.cpp | 12 |
4 files changed, 31 insertions, 17 deletions
diff --git a/libs/binder/tests/IBinderRpcTest.aidl b/libs/binder/tests/IBinderRpcTest.aidl index a3ed571462..116476765a 100644 --- a/libs/binder/tests/IBinderRpcTest.aidl +++ b/libs/binder/tests/IBinderRpcTest.aidl @@ -80,4 +80,8 @@ interface IBinderRpcTest { // get queued. oneway void blockingSendFdOneway(in ParcelFileDescriptor fd); ParcelFileDescriptor blockingRecvFd(); + + // Same as blockingSendFdOneway, but with integers. + oneway void blockingSendIntOneway(int n); + int blockingRecvInt(); } diff --git a/libs/binder/tests/binderRpcTest.cpp b/libs/binder/tests/binderRpcTest.cpp index 5952c4172e..9f54087b8e 100644 --- a/libs/binder/tests/binderRpcTest.cpp +++ b/libs/binder/tests/binderRpcTest.cpp @@ -587,30 +587,22 @@ TEST_P(BinderRpc, OnewayCallQueueing) { GTEST_SKIP() << "This test requires multiple threads"; } - constexpr size_t kNumSleeps = 10; + constexpr size_t kNumQueued = 10; constexpr size_t kNumExtraServerThreads = 4; - constexpr size_t kSleepMs = 50; // make sure calls to the same object happen on the same thread auto proc = createRpcTestSocketServerProcess({.numThreads = 1 + kNumExtraServerThreads}); - EXPECT_OK(proc.rootIface->lock()); - - size_t epochMsBefore = epochMillis(); - - // all these *Async commands should be queued on the server sequentially, + // all these *Oneway commands should be queued on the server sequentially, // even though there are multiple threads. - for (size_t i = 0; i + 1 < kNumSleeps; i++) { - proc.rootIface->sleepMsAsync(kSleepMs); + for (size_t i = 0; i + 1 < kNumQueued; i++) { + proc.rootIface->blockingSendIntOneway(i); + } + for (size_t i = 0; i + 1 < kNumQueued; i++) { + int n; + proc.rootIface->blockingRecvInt(&n); + EXPECT_EQ(n, i); } - EXPECT_OK(proc.rootIface->unlockInMsAsync(kSleepMs)); - - // this can only return once the final async call has unlocked - EXPECT_OK(proc.rootIface->lockUnlock()); - - size_t epochMsAfter = epochMillis(); - - EXPECT_GE(epochMsAfter, epochMsBefore + kSleepMs * kNumSleeps); saturateThreadPool(1 + kNumExtraServerThreads, proc.rootIface); } diff --git a/libs/binder/tests/binderRpcTestCommon.h b/libs/binder/tests/binderRpcTestCommon.h index a467ee389b..d12966142f 100644 --- a/libs/binder/tests/binderRpcTestCommon.h +++ b/libs/binder/tests/binderRpcTestCommon.h @@ -445,6 +445,12 @@ public: Status blockingRecvFd(android::os::ParcelFileDescriptor* /*fd*/) override { return Status::fromStatusT(UNKNOWN_TRANSACTION); } + + Status blockingSendIntOneway(int /*n*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); + } + + Status blockingRecvInt(int* /*n*/) override { return Status::fromStatusT(UNKNOWN_TRANSACTION); } }; } // namespace android diff --git a/libs/binder/tests/binderRpcTestService.cpp b/libs/binder/tests/binderRpcTestService.cpp index a27bd2f2e6..ca5a117f00 100644 --- a/libs/binder/tests/binderRpcTestService.cpp +++ b/libs/binder/tests/binderRpcTestService.cpp @@ -83,6 +83,18 @@ public: fd->reset(mFdChannel.read()); return Status::ok(); } + + HandoffChannel<int> mIntChannel; + + Status blockingSendIntOneway(int n) override { + mIntChannel.write(n); + return Status::ok(); + } + + Status blockingRecvInt(int* n) override { + *n = mIntChannel.read(); + return Status::ok(); + } }; int main(int argc, char* argv[]) { |