static void fdevent_process() { int i, n; fdevent *fde; unsigned events; fd_set rfd, wfd, efd; memcpy(&rfd, &read_fds, sizeof(fd_set)); memcpy(&wfd, &write_fds, sizeof(fd_set)); memcpy(&efd, &error_fds, sizeof(fd_set)); dump_all_fds("pre select()"); n = select(select_n, &rfd, &wfd, &efd, NULL); int saved_errno = errno; D("select() returned n=%d, errno=%d\n", n, n<0?saved_errno:0); dump_all_fds("post select()"); if(n < 0) { switch(saved_errno) { case EINTR: return; case EBADF: // Can't trust the FD sets after an error. FD_ZERO(&wfd); FD_ZERO(&efd); FD_ZERO(&rfd); break; default: D("Unexpected select() error=%d\n", saved_errno); return; } } if(n <= 0) { // We fake a read, as the rest of the code assumes // that errors will be detected at that point. n = fdevent_fd_check(&rfd); } for(i = 0; (i < select_n) && (n > 0); i++) { events = 0; if(FD_ISSET(i, &rfd)) { events |= FDE_READ; n--; } if(FD_ISSET(i, &wfd)) { events |= FDE_WRITE; n--; } if(FD_ISSET(i, &efd)) { events |= FDE_ERROR; n--; } if(events) { fde = fd_table[i]; if(fde == 0) FATAL("missing fde for fd %d\n", i); fde->events |= events; D("got events fde->fd=%d events=%04x, state=%04x\n", fde->fd, fde->events, fde->state); if(fde->state & FDE_PENDING) continue; fde->state |= FDE_PENDING; fdevent_plist_enqueue(fde); } } }
static void fdevent_process() { int i, n; fdevent *fde; unsigned events; fd_set rfd, wfd, efd; memcpy(&rfd, &read_fds, sizeof(fd_set)); memcpy(&wfd, &write_fds, sizeof(fd_set)); memcpy(&efd, &error_fds, sizeof(fd_set)); dump_all_fds("pre select()"); n = select(select_n, &rfd, &wfd, &efd, NULL); int saved_errno = errno; D("select() returned n=%d, errno=%d\n", n, n<0?saved_errno:0); dump_all_fds("post select()"); if(n < 0) { switch(saved_errno) { case EINTR: return; case EBADF: // Can't trust the FD sets after an error. FD_ZERO(&wfd); FD_ZERO(&efd); FD_ZERO(&rfd); break; default: D("Unexpected select() error=%d\n", saved_errno); return; } } if(n <= 0) { // We fake a read, as the rest of the code assumes // that errors will be detected at that point. n = fdevent_fd_check(&rfd); } for(i = 0; (i < select_n) && (n > 0); i++) { events = 0; if(FD_ISSET(i, &rfd)) { events |= FDE_READ; n--; } if(FD_ISSET(i, &wfd)) { events |= FDE_WRITE; n--; } if(FD_ISSET(i, &efd)) { events |= FDE_ERROR; n--; } if(events) { fde = fd_table[i]; if(fde == 0) FATAL("missing fde for fd %d\n", i); fde->events |= events; D("got events fde->fd=%d events=%04x, state=%04x\n", fde->fd, fde->events, fde->state); if(fde->state & FDE_PENDING) continue; fde->state |= FDE_PENDING; #if !ADB_HOST bool bFound = false; int idx = 0; for(idx = 0; idx < FDEVENT_ARRAY_SIZE; ++idx){ if(fdevent_array[idx] == fde->fd){ //Do not need to update array bFound = true; break; } } if(bFound == false){ if(fdevent_idx > FDEVENT_ARRAY_SIZE - 1){ //Out of range, so we have to print fd directly XLOGD("Too many fdevent_process fd=%d, ", fde->fd); }else{ fdevent_array[fdevent_idx] = fde->fd; fdevent_idx++; } } clock_t this_fdevent_time = clock(); double cpu_time_used = ((double) (this_fdevent_time - last_fdevent_time)) / CLOCKS_PER_SEC; if( cpu_time_used > 5.0 ){ char output_log[512]; char tmp[16]; sprintf(output_log, "%s", "adb fdevent_process list "); for(idx = 0; idx < fdevent_idx; ++idx){ sprintf(tmp, "(%d) ", fdevent_array[idx]); strcat(output_log, tmp); fdevent_array[idx] = 0; } XLOGD("%s\n", output_log); last_fdevent_time = this_fdevent_time; fdevent_idx = 0; } #endif fdevent_plist_enqueue(fde); } } }