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().
This commit is contained in:
Dan Egnor
2010-04-08 23:04:16 -07:00
committed by Android Git Automerger

View File

@@ -165,14 +165,32 @@ static void android_util_EventLog_readEvents(JNIEnv* env, jobject clazz,
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");