diff options
-rw-r--r-- | libs/binder/RpcSession.cpp | 2 | ||||
-rw-r--r-- | libs/binder/RpcState.cpp | 18 | ||||
-rw-r--r-- | libs/binder/RpcState.h | 9 |
3 files changed, 29 insertions, 0 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp index 4f55eef2d1..ee5e8bb5bb 100644 --- a/libs/binder/RpcSession.cpp +++ b/libs/binder/RpcSession.cpp @@ -198,6 +198,8 @@ status_t RpcSession::FdTrigger::interruptableReadFully(base::borrowed_fd fd, voi uint8_t* buffer = reinterpret_cast<uint8_t*>(data); uint8_t* end = buffer + size; + MAYBE_WAIT_IN_FLAKE_MODE; + status_t status; while ((status = triggerablePollRead(fd)) == OK) { ssize_t readSize = TEMP_FAILURE_RETRY(recv(fd.get(), buffer, end - buffer, MSG_NOSIGNAL)); diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 32b4b78675..b5eaaa3413 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -26,12 +26,28 @@ #include "Debug.h" #include "RpcWireFormat.h" +#include <random> + #include <inttypes.h> namespace android { using base::ScopeGuard; +#ifdef RPC_FLAKE_PRONE +void rpcMaybeWaitToFlake() { + static std::random_device r; + static std::mutex m; + + unsigned num; + { + std::lock_guard<std::mutex> lock(m); + num = r(); + } + if (num % 10 == 0) usleep(num % 1000); +} +#endif + RpcState::RpcState() {} RpcState::~RpcState() {} @@ -260,6 +276,8 @@ status_t RpcState::rpcSend(const sp<RpcSession::RpcConnection>& connection, LOG_RPC_DETAIL("Sending %s on fd %d: %s", what, connection->fd.get(), hexString(data, size).c_str()); + MAYBE_WAIT_IN_FLAKE_MODE; + if (size > std::numeric_limits<ssize_t>::max()) { ALOGE("Cannot send %s at size %zu (too big)", what, size); (void)session->shutdownAndWait(false); diff --git a/libs/binder/RpcState.h b/libs/binder/RpcState.h index 529dee534c..8201eba5da 100644 --- a/libs/binder/RpcState.h +++ b/libs/binder/RpcState.h @@ -42,6 +42,15 @@ struct RpcWireHeader; #define LOG_RPC_DETAIL(...) ALOGV(__VA_ARGS__) // for type checking #endif +#define RPC_FLAKE_PRONE false + +#ifdef RPC_FLAKE_PRONE +void rpcMaybeWaitToFlake(); +#define MAYBE_WAIT_IN_FLAKE_MODE rpcMaybeWaitToFlake() +#else +#define MAYBE_WAIT_IN_FLAKE_MODE do {} while (false) +#endif + /** * Abstracts away management of ref counts and the wire format from * RpcSession |