am 78158db5: Hail-Mary attempt to avoid apparent blocking problems in readEvents().
Merge commit '78158db51029e7dbe160e60af0deb7594bec051d' into froyo-plus-aosp
* commit '78158db51029e7dbe160e60af0deb7594bec051d':
Hail-Mary attempt to avoid apparent blocking problems in readEvents().
diff --git a/core/jni/android_util_EventLog.cpp b/core/jni/android_util_EventLog.cpp
index 75f6cb2..e43478c 100644
--- a/core/jni/android_util_EventLog.cpp
+++ b/core/jni/android_util_EventLog.cpp
@@ -165,14 +165,32 @@
jint *tagValues = env->GetIntArrayElements(tags, NULL);
uint8_t buf[LOGGER_ENTRY_MAX_LEN];
+ struct timeval timeout = {0, 0};
+ fd_set readset;
+ FD_ZERO(&readset);
+
for (;;) {
+ // Use a short select() to try to avoid problems hanging on read().
+ // This means we block for 5ms at the end of the log -- oh well.
+ timeout.tv_usec = 5000;
+ FD_SET(fd, &readset);
+ int r = select(fd + 1, &readset, NULL, NULL, &timeout);
+ if (r == 0) {
+ break; // no more events
+ } else if (r < 0 && errno == EINTR) {
+ continue; // interrupted by signal, try again
+ } else if (r < 0) {
+ jniThrowIOException(env, errno); // Will throw on return
+ break;
+ }
+
int len = read(fd, buf, sizeof(buf));
if (len == 0 || (len < 0 && errno == EAGAIN)) {
- break;
+ break; // no more events
+ } else if (len < 0 && errno == EINTR) {
+ continue; // interrupted by signal, try again
} else if (len < 0) {
- // This calls env->ThrowNew(), which doesn't throw an exception
- // now, but sets a flag to trigger an exception after we return.
- jniThrowIOException(env, errno);
+ jniThrowIOException(env, errno); // Will throw on return
break;
} else if ((size_t) len < sizeof(logger_entry) + sizeof(int32_t)) {
jniThrowException(env, "java/io/IOException", "Event too short");