os::timeout(int fd, long timeout)
-
//Linux版(jdk7/hotspot/src/os/linux/vm/os_linux.inline.hpp) inline int os::timeout(int fd, long timeout) { julong prevtime,newtime; struct timeval t; gettimeofday(&t, NULL); prevtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; for(;;) { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLIN | POLLERR; int res = ::poll(&pfd, 1, timeout); if (res == OS_ERR && errno == EINTR) { // On Linux any value < 0 means "forever" if(timeout >= 0) { gettimeofday(&t, NULL); newtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; timeout -= newtime - prevtime; if(timeout <= 0) return OS_OK; prevtime = newtime; } } else return res; } }