From a0db022419319d0b2933ff63e7ca6c59b3ed21df Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Thu, 15 Mar 2012 09:45:30 -0700 Subject: [PATCH] Add support for EINTR in BT During normal operation, it's common on a multi-core device to get EINTR. This is especially noticable during a bugreport where several services get EINTR even though it's not fatal. This change adds TEMP_FAILURE_RETRY around the system calls that can receive EINTR where a retry should happen. Change-Id: If13d24f57c587392f57961fe2caf46e2a6fa843e --- core/jni/android_bluetooth_BluetoothAudioGateway.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/jni/android_bluetooth_BluetoothAudioGateway.cpp b/core/jni/android_bluetooth_BluetoothAudioGateway.cpp index 3b8fb7974140d..294c626be4707 100644 --- a/core/jni/android_bluetooth_BluetoothAudioGateway.cpp +++ b/core/jni/android_bluetooth_BluetoothAudioGateway.cpp @@ -196,7 +196,7 @@ static int do_accept(JNIEnv* env, jobject object, int ag_fd, struct sockaddr_rc raddr; int alen = sizeof(raddr); - int nsk = accept(ag_fd, (struct sockaddr *) &raddr, &alen); + int nsk = TEMP_FAILURE_RETRY(accept(ag_fd, (struct sockaddr *) &raddr, &alen)); if (nsk < 0) { ALOGE("Error on accept from socket fd %d: %s (%d).", ag_fd, @@ -331,12 +331,12 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object, to.tv_sec = timeout_ms / 1000; to.tv_usec = 1000 * (timeout_ms % 1000); } - n = select(MAX(nat->hf_ag_rfcomm_sock, - nat->hs_ag_rfcomm_sock) + 1, + n = TEMP_FAILURE_RETRY(select( + MAX(nat->hf_ag_rfcomm_sock, nat->hs_ag_rfcomm_sock) + 1, &rset, NULL, NULL, - (timeout_ms < 0 ? NULL : &to)); + (timeout_ms < 0 ? NULL : &to))); if (timeout_ms > 0) { jint remaining = to.tv_sec*1000 + to.tv_usec/1000; ALOGI("Remaining time %ldms", (long)remaining); @@ -391,7 +391,7 @@ static jboolean waitForHandsfreeConnectNative(JNIEnv* env, jobject object, ALOGE("Neither HF nor HS listening sockets are open!"); return JNI_FALSE; } - n = poll(fds, cnt, timeout_ms); + n = TEMP_FAILURE_RETRY(poll(fds, cnt, timeout_ms)); if (n <= 0) { if (n < 0) { ALOGE("listening poll() on RFCOMM sockets: %s (%d)",