s3: use monotonic time in timeout of sys_select_intr()
authorBjörn Jacke <bj@sernet.de>
Mon, 30 Aug 2010 16:02:19 +0000 (18:02 +0200)
committerBjörn Jacke <bj@sernet.de>
Tue, 31 Aug 2010 08:26:28 +0000 (10:26 +0200)
source3/lib/select.c

index b5443ff20ca3c7ebdb201d77616ca52fb0d1bca2..846e6af1de69d0ee1b8e66fb9274e311257d9f38 100644 (file)
@@ -148,17 +148,18 @@ int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorf
 {
        int ret;
        fd_set *readfds2, readfds_buf, *writefds2, writefds_buf, *errorfds2, errorfds_buf;
-       struct timeval tval2, *ptval, end_time;
+       struct timeval tval2, *ptval;
+       struct timespec end_time;
 
        readfds2 = (readfds ? &readfds_buf : NULL);
        writefds2 = (writefds ? &writefds_buf : NULL);
        errorfds2 = (errorfds ? &errorfds_buf : NULL);
        if (tval) {
-               GetTimeOfDay(&end_time);
+               clock_gettime_mono(&end_time);
                end_time.tv_sec += tval->tv_sec;
-               end_time.tv_usec += tval->tv_usec;
-               end_time.tv_sec += end_time.tv_usec / 1000000;
-               end_time.tv_usec %= 1000000;
+               end_time.tv_nsec += tval->tv_usec *1000;
+               end_time.tv_sec += end_time.tv_nsec / 1000000000;
+               end_time.tv_nsec %= 1000000000;
                errno = 0;
                tval2 = *tval;
                ptval = &tval2;
@@ -174,17 +175,17 @@ int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorf
                if (errorfds)
                        errorfds_buf = *errorfds;
                if (ptval && (errno == EINTR)) {
-                       struct timeval now_time;
+                       struct timespec now_time;
                        int64_t tdif;
 
-                       GetTimeOfDay(&now_time);
-                       tdif = usec_time_diff(&end_time, &now_time);
+                       clock_gettime_mono(&now_time);
+                       tdif = nsec_time_diff(&end_time,&now_time);
                        if (tdif <= 0) {
                                ret = 0; /* time expired. */
                                break;
                        }
-                       ptval->tv_sec = tdif / 1000000;
-                       ptval->tv_usec = tdif % 1000000;
+                       ptval->tv_sec = tdif / 1000000000;
+                       ptval->tv_usec = (tdif % 1000000000) / 1000;
                }
 
                /* We must use select and not sys_select here. If we use