This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Fri, 25 Oct 2019 09:08:23 -0300 Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > From: Zack Weinberg <zackw@panix.com> > > Changes from previous version: > > - Fixed some indentation and style issues. > > - Use external clock_gettime on memusage.h. > > - Fixed some conformant issues on Hurd. > > -- > > Since gettimeofday will shortly be implemented in terms of > clock_gettime on all platforms, internal code should use clock_gettime > directly; in addition to removing a layer of indirection, this will > allow us to remove the PLT-bypass gunk for gettimeofday. (We can't > quite do that yet, but it'll be coming later in this patch series.) > In many cases, the changed code does fewer conversions. > > The changed code always assumes __clock_gettime (CLOCK_REALTIME) > cannot fail. Most of the call sites were assuming gettimeofday could > not fail, but a few places were checking for errors. POSIX says > clock_gettime can only fail if the clock constant is invalid or > unsupported, and CLOCK_REALTIME is the one and only clock constant > that's required to be supported. For consistency I grepped the entire > source tree for any other places that checked for errors from > __clock_gettime (CLOCK_REALTIME), found one, and changed it too. > > (For the record, POSIX also says gettimeofday can never fail.) > > (It would be nice if we could declare that GNU systems will always > support CLOCK_MONOTONIC as well as CLOCK_REALTIME; there are several > places where we are using CLOCK_REALTIME where _MONOTONIC would be > more appropriate, and/or trying to use _MONOTONIC and then falling > back to _REALTIME. But the Hurd doesn't support CLOCK_MONOTONIC yet, > and it looks like adding it would involve substantial changes to > gnumach's internals and API. Oh well.) > > A few Hurd-specific files were changed to use __host_get_time instead > of __clock_gettime, as this seemed tidier. We also assume this cannot > fail. Skimming the code in gnumach leads me to believe the only way > it could fail is if __mach_host_self also failed, and our > Hurd-specific code consistently assumes that can't happen, so I'm > going with that. > > With the exception of support/support_test_main.c, test cases are not > modified, mainly because I didn't want to have to figure out which > test cases were testing gettimeofday specifically. > > The definition of GETTIME in sysdeps/generic/memusage.h had a typo and > was not reading tv_sec at all. I fixed this. It appears nobody has > been generating malloc traces on a machine that doesn't have a > superseding definition. > > There are a whole bunch of places where the code could be simplified > by factoring out timespec subtraction and/or comparison logic, but I > want to keep this patch as mechanical as possible. > > Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu. > > Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > inet/deadline.c | 8 +------- > login/logout.c | 9 +++++---- > login/logwtmp.c | 7 +++---- > nis/nis_call.c | 4 +++- > nptl/pthread_join_common.c | 7 +++---- > nptl/pthread_mutex_timedlock.c | 7 +++---- > nscd/nscd_helper.c | 24 +++++++++++------------ > resolv/gai_misc.c | 6 +++--- > resolv/gai_suspend.c | 6 +++--- > resolv/res_send.c | 7 +------ > sunrpc/auth_des.c | 19 ++++++++++-------- > sunrpc/auth_unix.c | 9 +++++---- > sunrpc/create_xid.c | 6 +++--- > sunrpc/svcauth_des.c | 7 ++++++- > support/support_test_main.c | 23 +++++++++++----------- > sysdeps/generic/memusage.h | 16 +++++++-------- > sysdeps/mach/hurd/getitimer.c | 11 ++++++++--- > sysdeps/mach/hurd/setitimer.c | 13 ++++++------ > sysdeps/mach/hurd/times.c | 7 +++---- > sysdeps/mach/nanosleep.c | 36 > ++++++++++++++++++++++------------ sysdeps/mach/usleep.c | > 5 ----- sysdeps/posix/tempname.c | 9 ++++----- > sysdeps/posix/timespec_get.c | 14 ++++--------- > sysdeps/pthread/aio_misc.c | 6 +++--- > sysdeps/pthread/aio_suspend.c | 6 +++--- > sysdeps/unix/make-syscalls.sh | 2 +- > 26 files changed, 137 insertions(+), 137 deletions(-) > > diff --git a/inet/deadline.c b/inet/deadline.c > index 6051f1fe0c..541c16bd9a 100644 > --- a/inet/deadline.c > +++ b/inet/deadline.c > @@ -29,13 +29,7 @@ __deadline_current_time (void) > { > struct deadline_current_time result; > if (__clock_gettime (CLOCK_MONOTONIC, &result.current) != 0) > - { > - struct timeval current_tv; > - if (__gettimeofday (¤t_tv, NULL) == 0) > - __libc_fatal ("Fatal error: gettimeofday system call > failed\n"); > - result.current.tv_sec = current_tv.tv_sec; > - result.current.tv_nsec = current_tv.tv_usec * 1000; > - } > + __clock_gettime (CLOCK_REALTIME, &result.current); > assert (result.current.tv_sec >= 0); > return result; > } > diff --git a/login/logout.c b/login/logout.c > index d0d421cbf7..b8b38df19d 100644 > --- a/login/logout.c > +++ b/login/logout.c > @@ -19,6 +19,7 @@ > #include <errno.h> > #include <string.h> > #include <utmp.h> > +#include <time.h> > #include <sys/time.h> > > int > @@ -45,10 +46,10 @@ logout (const char *line) > /* Clear information about who & from where. */ > memset (ut->ut_name, '\0', sizeof ut->ut_name); > memset (ut->ut_host, '\0', sizeof ut->ut_host); > - struct timeval tv; > - __gettimeofday (&tv, NULL); > - ut->ut_tv.tv_sec = tv.tv_sec; > - ut->ut_tv.tv_usec = tv.tv_usec; > + > + struct timespec ts; > + __clock_gettime (CLOCK_REALTIME, &ts); > + TIMESPEC_TO_TIMEVAL (&ut->ut_tv, &ts); > ut->ut_type = DEAD_PROCESS; > > if (pututline (ut) != NULL) > diff --git a/login/logwtmp.c b/login/logwtmp.c > index 654f412ecb..eddba96f35 100644 > --- a/login/logwtmp.c > +++ b/login/logwtmp.c > @@ -36,10 +36,9 @@ logwtmp (const char *line, const char *name, const > char *host) strncpy (ut.ut_name, name, sizeof ut.ut_name); > strncpy (ut.ut_host, host, sizeof ut.ut_host); > > - struct timeval tv; > - __gettimeofday (&tv, NULL); > - ut.ut_tv.tv_sec = tv.tv_sec; > - ut.ut_tv.tv_usec = tv.tv_usec; > + struct timespec ts; > + __clock_gettime (CLOCK_REALTIME, &ts); > + TIMESPEC_TO_TIMEVAL (&ut.ut_tv, &ts); > > updwtmp (_PATH_WTMP, &ut); > } > diff --git a/nis/nis_call.c b/nis/nis_call.c > index 1684de1c6d..5097e614ea 100644 > --- a/nis/nis_call.c > +++ b/nis/nis_call.c > @@ -709,6 +709,7 @@ __nisfind_server (const_nis_name name, int > search_parent, nis_error status; > directory_obj *obj; > struct timeval now; > + struct timespec ts; > unsigned int server_used = ~0; > unsigned int current_ep = ~0; > > @@ -718,7 +719,8 @@ __nisfind_server (const_nis_name name, int > search_parent, if (*dir != NULL) > return NIS_SUCCESS; > > - (void) gettimeofday (&now, NULL); > + __clock_gettime (CLOCK_REALTIME, &ts); > + TIMESPEC_TO_TIMEVAL (&now, &ts); > > if ((flags & NO_CACHE) == 0) > *dir = nis_server_cache_search (name, search_parent, > &server_used, diff --git a/nptl/pthread_join_common.c > b/nptl/pthread_join_common.c index 9545ae4bd3..ad3073e32d 100644 > --- a/nptl/pthread_join_common.c > +++ b/nptl/pthread_join_common.c > @@ -46,15 +46,14 @@ timedwait_tid (pid_t *tidp, const struct timespec > *abstime) /* Repeat until thread terminated. */ > while ((tid = *tidp) != 0) > { > - struct timeval tv; > struct timespec rt; > > /* Get the current time. */ > - __gettimeofday (&tv, NULL); > + __clock_gettime (CLOCK_REALTIME, &rt); > > /* Compute relative timeout. */ > - rt.tv_sec = abstime->tv_sec - tv.tv_sec; > - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; > + rt.tv_sec = abstime->tv_sec - rt.tv_sec; > + rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; > if (rt.tv_nsec < 0) > { > rt.tv_nsec += 1000000000; > diff --git a/nptl/pthread_mutex_timedlock.c > b/nptl/pthread_mutex_timedlock.c index a0ce044dd4..7a5be6b997 100644 > --- a/nptl/pthread_mutex_timedlock.c > +++ b/nptl/pthread_mutex_timedlock.c > @@ -567,15 +567,14 @@ __pthread_mutex_clocklock_common > (pthread_mutex_t *mutex, goto failpp; > } > > - struct timeval tv; > struct timespec rt; > > /* Get the current time. */ > - (void) __gettimeofday (&tv, NULL); > + __clock_gettime (CLOCK_REALTIME, &rt); > > /* Compute relative timeout. */ > - rt.tv_sec = abstime->tv_sec - tv.tv_sec; > - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * > 1000; > + rt.tv_sec = abstime->tv_sec - rt.tv_sec; > + rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; > if (rt.tv_nsec < 0) > { > rt.tv_nsec += 1000000000; > diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c > index d326a380ee..7361fe2e0a 100644 > --- a/nscd/nscd_helper.c > +++ b/nscd/nscd_helper.c > @@ -59,9 +59,10 @@ wait_on_socket (int sock, long int usectmo) > /* Handle the case where the poll() call is interrupted by a > signal. We cannot just use TEMP_FAILURE_RETRY since it > might lead to infinite loops. */ > - struct timeval now; > - (void) __gettimeofday (&now, NULL); > - long int end = now.tv_sec * 1000 + usectmo + (now.tv_usec + > 500) / 1000; > + struct timespec now; > + __clock_gettime (CLOCK_REALTIME, &now); > + long int end = (now.tv_sec * 1000 + usectmo > + + (now.tv_nsec + 500000) / 1000000); > long int timeout = usectmo; > while (1) > { > @@ -70,8 +71,9 @@ wait_on_socket (int sock, long int usectmo) > break; > > /* Recompute the timeout time. */ > - (void) __gettimeofday (&now, NULL); > - timeout = end - (now.tv_sec * 1000 + (now.tv_usec + 500) / > 1000); > + __clock_gettime (CLOCK_REALTIME, &now); > + timeout = end - ((now.tv_sec * 1000 > + + (now.tv_nsec + 500000) / 1000000)); > } > } > > @@ -191,9 +193,7 @@ open_socket (request_type type, const char *key, > size_t keylen) memcpy (reqdata->key, key, keylen); > > bool first_try = true; > - struct timeval tvend; > - /* Fake initializing tvend. */ > - asm ("" : "=m" (tvend)); > + struct timespec tvend = { 0, 0 }; > while (1) > { > #ifndef MSG_NOSIGNAL > @@ -212,18 +212,18 @@ open_socket (request_type type, const char > *key, size_t keylen) > /* The daemon is busy wait for it. */ > int to; > - struct timeval now; > - (void) __gettimeofday (&now, NULL); > + struct timespec now; > + __clock_gettime (CLOCK_REALTIME, &now); > if (first_try) > { > - tvend.tv_usec = now.tv_usec; > + tvend.tv_nsec = now.tv_nsec; > tvend.tv_sec = now.tv_sec + 5; > to = 5 * 1000; > first_try = false; > } > else > to = ((tvend.tv_sec - now.tv_sec) * 1000 > - + (tvend.tv_usec - now.tv_usec) / 1000); > + + (tvend.tv_nsec - now.tv_nsec) / 1000000); > > struct pollfd fds[1]; > fds[0].fd = sock; > diff --git a/resolv/gai_misc.c b/resolv/gai_misc.c > index 8738359d81..760c33ac29 100644 > --- a/resolv/gai_misc.c > +++ b/resolv/gai_misc.c > @@ -357,13 +357,13 @@ handle_requests (void *arg) > something to arrive in it. */ > if (runp == NULL && optim.gai_idle_time >= 0) > { > - struct timeval now; > + struct timespec now; > struct timespec wakeup_time; > > ++idle_thread_count; > - gettimeofday (&now, NULL); > + __clock_gettime (CLOCK_REALTIME, &now); > wakeup_time.tv_sec = now.tv_sec + optim.gai_idle_time; > - wakeup_time.tv_nsec = now.tv_usec * 1000; > + wakeup_time.tv_nsec = now.tv_nsec; > if (wakeup_time.tv_nsec >= 1000000000) > { > wakeup_time.tv_nsec -= 1000000000; > diff --git a/resolv/gai_suspend.c b/resolv/gai_suspend.c > index 16d6998980..b8c642bddc 100644 > --- a/resolv/gai_suspend.c > +++ b/resolv/gai_suspend.c > @@ -91,11 +91,11 @@ gai_suspend (const struct gaicb *const list[], > int ent, { > /* We have to convert the relative timeout value into an > absolute time value with pthread_cond_timedwait > expects. */ > - struct timeval now; > + struct timespec now; > struct timespec abstime; > > - __gettimeofday (&now, NULL); > - abstime.tv_nsec = timeout->tv_nsec + now.tv_usec * 1000; > + __clock_gettime (CLOCK_REALTIME, &now); > + abstime.tv_nsec = timeout->tv_nsec + now.tv_nsec; > abstime.tv_sec = timeout->tv_sec + now.tv_sec; > if (abstime.tv_nsec >= 1000000000) > { > diff --git a/resolv/res_send.c b/resolv/res_send.c > index 6b9c73f820..47bfba6747 100644 > --- a/resolv/res_send.c > +++ b/resolv/res_send.c > @@ -172,12 +172,7 @@ evCmpTime(struct timespec a, struct timespec b) { > > static void > evNowTime(struct timespec *res) { > - struct timeval now; > - > - if (gettimeofday(&now, NULL) < 0) > - evConsTime(res, 0, 0); > - else > - TIMEVAL_TO_TIMESPEC (&now, res); > + __clock_gettime(CLOCK_REALTIME, res); > } > > > diff --git a/sunrpc/auth_des.c b/sunrpc/auth_des.c > index 5b6f985bc2..d26820a701 100644 > --- a/sunrpc/auth_des.c > +++ b/sunrpc/auth_des.c > @@ -41,6 +41,7 @@ > #include <rpc/xdr.h> > #include <netinet/in.h> /* XXX: just to get htonl() > and ntohl() */ #include <sys/socket.h> > +#include <time.h> > #include <shlib-compat.h> > > #define MILLION 1000000L > @@ -246,15 +247,15 @@ authdes_marshal (AUTH *auth, XDR *xdrs) > int status; > int len; > register int32_t *ixdr; > - struct timeval tval; > + struct timespec now; > > /* > * Figure out the "time", accounting for any time difference > * with the server if necessary. > */ > - __gettimeofday (&tval, (struct timezone *) NULL); > - ad->ad_timestamp.tv_sec = tval.tv_sec + ad->ad_timediff.tv_sec; > - ad->ad_timestamp.tv_usec = tval.tv_usec + ad->ad_timediff.tv_usec; > + __clock_gettime (CLOCK_REALTIME, &now); > + ad->ad_timestamp.tv_sec = now.tv_sec + ad->ad_timediff.tv_sec; > + ad->ad_timestamp.tv_usec = (now.tv_nsec / 1000) + > ad->ad_timediff.tv_usec; if (ad->ad_timestamp.tv_usec >= MILLION) > { > ad->ad_timestamp.tv_usec -= MILLION; > @@ -445,21 +446,23 @@ authdes_destroy (AUTH *auth) > static bool_t > synchronize (struct sockaddr *syncaddr, struct rpc_timeval *timep) > { > - struct timeval mytime; > + struct timespec mytime; > struct rpc_timeval timeout; > + long int myusec; > > timeout.tv_sec = RTIME_TIMEOUT; > timeout.tv_usec = 0; > if (rtime ((struct sockaddr_in *) syncaddr, timep, &timeout) < 0) > return FALSE; > > - __gettimeofday (&mytime, (struct timezone *) NULL); > + __clock_gettime (CLOCK_REALTIME, &mytime); > timep->tv_sec -= mytime.tv_sec; > - if (mytime.tv_usec > timep->tv_usec) > + myusec = mytime.tv_nsec / 1000; > + if (myusec > timep->tv_usec) > { > timep->tv_sec -= 1; > timep->tv_usec += MILLION; > } > - timep->tv_usec -= mytime.tv_usec; > + timep->tv_usec -= myusec; > return TRUE; > } > diff --git a/sunrpc/auth_unix.c b/sunrpc/auth_unix.c > index b035fdd870..ff0d2eb933 100644 > --- a/sunrpc/auth_unix.c > +++ b/sunrpc/auth_unix.c > @@ -43,6 +43,7 @@ > #include <stdio.h> > #include <string.h> > #include <unistd.h> > +#include <time.h> > #include <libintl.h> > #include <sys/param.h> > #include <wchar.h> > @@ -96,7 +97,7 @@ authunix_create (char *machname, uid_t uid, gid_t > gid, int len, { > struct authunix_parms aup; > char mymem[MAX_AUTH_BYTES]; > - struct timeval now; > + struct timespec now; > XDR xdrs; > AUTH *auth; > struct audata *au; > @@ -122,7 +123,7 @@ no_memory: > /* > * fill in param struct from the given params > */ > - (void) __gettimeofday (&now, (struct timezone *) 0); > + __clock_gettime (CLOCK_REALTIME, &now); > aup.aup_time = now.tv_sec; > aup.aup_machname = machname; > aup.aup_uid = uid; > @@ -276,7 +277,7 @@ authunix_refresh (AUTH *auth) > { > struct audata *au = AUTH_PRIVATE (auth); > struct authunix_parms aup; > - struct timeval now; > + struct timespec now; > XDR xdrs; > int stat; > > @@ -297,7 +298,7 @@ authunix_refresh (AUTH *auth) > goto done; > > /* update the time and serialize in place */ > - (void) __gettimeofday (&now, (struct timezone *) 0); > + __clock_gettime (CLOCK_REALTIME, &now); > aup.aup_time = now.tv_sec; > xdrs.x_op = XDR_ENCODE; > XDR_SETPOS (&xdrs, 0); > diff --git a/sunrpc/create_xid.c b/sunrpc/create_xid.c > index 1339615a1b..c692c1eb92 100644 > --- a/sunrpc/create_xid.c > +++ b/sunrpc/create_xid.c > @@ -39,10 +39,10 @@ _create_xid (void) > pid_t pid = getpid (); > if (is_initialized != pid) > { > - struct timeval now; > + struct timespec now; > > - __gettimeofday (&now, (struct timezone *) 0); > - __srand48_r (now.tv_sec ^ now.tv_usec ^ pid, > + __clock_gettime (CLOCK_REALTIME, &now); > + __srand48_r (now.tv_sec ^ now.tv_nsec ^ pid, > &__rpc_lrand48_data); > is_initialized = pid; > } > diff --git a/sunrpc/svcauth_des.c b/sunrpc/svcauth_des.c > index c5a512d6f8..7607abc818 100644 > --- a/sunrpc/svcauth_des.c > +++ b/sunrpc/svcauth_des.c > @@ -44,6 +44,7 @@ > #include <limits.h> > #include <string.h> > #include <stdint.h> > +#include <time.h> > #include <sys/param.h> > #include <netinet/in.h> > #include <rpc/rpc.h> > @@ -295,7 +296,11 @@ _svcauth_des (register struct svc_req *rqst, > register struct rpc_msg *msg) debug ("timestamp before last seen"); > return AUTH_REJECTEDVERF; /* replay */ > } > - __gettimeofday (¤t, (struct timezone *) NULL); > + { > + struct timespec now; > + __clock_gettime (CLOCK_REALTIME, &now); > + TIMESPEC_TO_TIMEVAL (¤t, &now); > + } > current.tv_sec -= window; /* allow for expiration */ > if (!BEFORE (¤t, ×tamp)) > { > diff --git a/support/support_test_main.c b/support/support_test_main.c > index 05ad92e688..d6b3a8d45f 100644 > --- a/support/support_test_main.c > +++ b/support/support_test_main.c > @@ -88,16 +88,18 @@ static pid_t test_pid; > static void (*cleanup_function) (void); > > static void > -print_timestamp (const char *what, struct timeval tv) > +print_timestamp (const char *what, struct timespec tv) > { > struct tm tm; > + /* Casts of tv.tv_nsec below are necessary because the type of > + tv_nsec is not literally long int on all supported platforms. > */ if (gmtime_r (&tv.tv_sec, &tm) == NULL) > - printf ("%s: %lld.%06d\n", > - what, (long long int) tv.tv_sec, (int) tv.tv_usec); > + printf ("%s: %lld.%09ld\n", > + what, (long long int) tv.tv_sec, (long int) tv.tv_nsec); > else > - printf ("%s: %04d-%02d-%02dT%02d:%02d:%02d.%06d\n", > + printf ("%s: %04d-%02d-%02dT%02d:%02d:%02d.%09ld\n", > what, 1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday, > - tm.tm_hour, tm.tm_min, tm.tm_sec, (int) tv.tv_usec); > + tm.tm_hour, tm.tm_min, tm.tm_sec, (long int) tv.tv_nsec); > } > > /* Timeout handler. We kill the child and exit with an error. */ > @@ -110,8 +112,8 @@ signal_handler (int sig) > > /* Do this first to avoid further interference from the > subprocess. */ > - struct timeval now; > - bool now_available = gettimeofday (&now, NULL) == 0; > + struct timespec now; > + clock_gettime (CLOCK_REALTIME, &now); > struct stat64 st; > bool st_available = fstat64 (STDOUT_FILENO, &st) == 0 && > st.st_mtime != 0; > @@ -165,12 +167,9 @@ signal_handler (int sig) > printf ("Timed out: killed the child process but it exited %d\n", > WEXITSTATUS (status)); > > - if (now_available) > - print_timestamp ("Termination time", now); > + print_timestamp ("Termination time", now); > if (st_available) > - print_timestamp ("Last write to standard output", > - (struct timeval) { st.st_mtim.tv_sec, > - st.st_mtim.tv_nsec / 1000 }); > + print_timestamp ("Last write to standard output", st.st_mtim); > > /* Exit with an error. */ > exit (1); > diff --git a/sysdeps/generic/memusage.h b/sysdeps/generic/memusage.h > index 400fe23f29..88b291e3fa 100644 > --- a/sysdeps/generic/memusage.h > +++ b/sysdeps/generic/memusage.h > @@ -26,14 +26,14 @@ > #endif > > #ifndef GETTIME > -# define GETTIME(low,high) \ > - { > \ > - struct timeval tval; > \ > - uint64_t usecs; > \ > - gettimeofday (&tval, NULL); > \ > - usecs = (uint64_t) tval.tv_usec + (uint64_t) tval.tv_usec * > 1000000; \ > - low = usecs & 0xffffffff; > \ > - high = usecs >> 32; > \ +# define GETTIME(low,high) > \ > + { > \ > + struct timespec now; > \ > + uint64_t usecs; > \ > + clock_gettime (CLOCK_REALTIME, &now); > \ > + usecs = (uint64_t)now.tv_nsec / 1000 + (uint64_t)now.tv_sec * > 1000000; \ > + low = usecs & 0xffffffff; > \ > + high = usecs >> 32; > \ } > #endif > > diff --git a/sysdeps/mach/hurd/getitimer.c > b/sysdeps/mach/hurd/getitimer.c index f332f0e681..0982357815 100644 > --- a/sysdeps/mach/hurd/getitimer.c > +++ b/sysdeps/mach/hurd/getitimer.c > @@ -19,8 +19,9 @@ > #include <errno.h> > #include <sys/time.h> > #include <hurd.h> > +#include <mach.h> > > -/* XXX Temporary cheezoid implementation; see __setitmr.c. */ > +/* XXX Temporary cheezoid implementation; see setitimer.c. */ > > /* These are defined in __setitmr.c. */ > extern spin_lock_t _hurd_itimer_lock; > @@ -61,8 +62,12 @@ __getitimer (enum __itimer_which which, struct > itimerval *value) } > > /* Get the time now. */ > - if (__gettimeofday (&elapsed, NULL) < 0) > - return -1; > + { > + time_value_t tv; > + __host_get_time (__mach_host_self (), &tv); > + elapsed.tv_sec = tv.seconds; > + elapsed.tv_usec = tv.microseconds; > + } > > /* Extract the current timer setting; and the time it was set, so > we can calculate the time elapsed so far. */ > diff --git a/sysdeps/mach/hurd/setitimer.c > b/sysdeps/mach/hurd/setitimer.c index 34b433914c..2aab365c31 100644 > --- a/sysdeps/mach/hurd/setitimer.c > +++ b/sysdeps/mach/hurd/setitimer.c > @@ -23,6 +23,7 @@ > #include <hurd/signal.h> > #include <hurd/sigpreempt.h> > #include <hurd/msg_request.h> > +#include <mach.h> > #include <mach/message.h> > > /* XXX Temporary cheezoid implementation of ITIMER_REAL/SIGALRM. */ > @@ -243,12 +244,12 @@ setitimer_locked (const struct itimerval *new, > struct itimerval *old, if ((newval.it_value.tv_sec | > newval.it_value.tv_usec) != 0 || old != NULL) { > /* Calculate how much time is remaining for the pending alarm. > */ > - if (__gettimeofday (&now, NULL) < 0) > - { > - __spin_unlock (&_hurd_itimer_lock); > - _hurd_critical_section_unlock (crit); > - return -1; > - } > + { > + time_value_t tv; > + __host_get_time (__mach_host_self (), &tv); > + now.tv_sec = tv.seconds; > + now.tv_usec = tv.microseconds; > + } > elapsed = now; > subtract_timeval (&elapsed, &_hurd_itimer_started); > remaining = _hurd_itimerval.it_value; > diff --git a/sysdeps/mach/hurd/times.c b/sysdeps/mach/hurd/times.c > index 3aac803c51..56a0062cd5 100644 > --- a/sysdeps/mach/hurd/times.c > +++ b/sysdeps/mach/hurd/times.c > @@ -42,7 +42,7 @@ __times (struct tms *tms) > struct task_basic_info bi; > struct task_thread_times_info tti; > mach_msg_type_number_t count; > - union { time_value_t tvt; struct timeval tv; } now; > + time_value_t now; > error_t err; > > count = TASK_BASIC_INFO_COUNT; > @@ -65,10 +65,9 @@ __times (struct tms *tms) > /* XXX This can't be implemented until getrusage(RUSAGE_CHILDREN) > can be. */ tms->tms_cutime = tms->tms_cstime = 0; > > - if (__gettimeofday (&now.tv, NULL) < 0) > - return -1; > + __host_get_time (__mach_host_self (), &now); > > - return (clock_from_time_value (&now.tvt) > + return (clock_from_time_value (&now) > - clock_from_time_value (&bi.creation_time)); > } > weak_alias (__times, times) > diff --git a/sysdeps/mach/nanosleep.c b/sysdeps/mach/nanosleep.c > index 67caa3ea8a..36fb14598e 100644 > --- a/sysdeps/mach/nanosleep.c > +++ b/sysdeps/mach/nanosleep.c > @@ -18,16 +18,26 @@ > > #include <errno.h> > #include <mach.h> > -#include <sys/time.h> > #include <time.h> > #include <unistd.h> > > +# define timespec_sub(a, b, result) > \ > + do { > \ > + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; > \ > + (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; > \ > + if ((result)->tv_nsec < 0) { > \ > + --(result)->tv_sec; > \ > + (result)->tv_nsec += 1000000000; > \ > + } > \ > + } while (0) > + > int > __libc_nanosleep (const struct timespec *requested_time, > - struct timespec *remaining) > + struct timespec *remaining) > { > mach_port_t recv; > - struct timeval before, after; > + struct timespec before; > + error_t err; > > if (requested_time->tv_sec < 0 > || requested_time->tv_nsec < 0 > @@ -43,20 +53,20 @@ __libc_nanosleep (const struct timespec > *requested_time, > recv = __mach_reply_port (); > > - if (remaining && __gettimeofday (&before, NULL) < 0) > - return -1; > - error_t err = __mach_msg (NULL, > MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT, > - 0, 0, recv, ms, MACH_PORT_NULL); > + if (remaining != 0) > + __clock_gettime (CLOCK_REALTIME, &before); > + > + err = __mach_msg (NULL, > MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT, > + 0, 0, recv, ms, MACH_PORT_NULL); > __mach_port_destroy (mach_task_self (), recv); > if (err == EMACH_RCV_INTERRUPTED) > { > - if (remaining && __gettimeofday (&after, NULL) >= 0) > + if (remaining != 0) > { > - struct timeval req_time, elapsed, rem; > - TIMESPEC_TO_TIMEVAL (&req_time, requested_time); > - timersub (&after, &before, &elapsed); > - timersub (&req_time, &elapsed, &rem); > - TIMEVAL_TO_TIMESPEC (&rem, remaining); > + struct timespec after, elapsed; > + __clock_gettime (CLOCK_REALTIME, &after); > + timespec_sub (&after, &before, &elapsed); > + timespec_sub (requested_time, &elapsed, remaining); > } > > errno = EINTR; > diff --git a/sysdeps/mach/usleep.c b/sysdeps/mach/usleep.c > index 3b79857c5d..578540d065 100644 > --- a/sysdeps/mach/usleep.c > +++ b/sysdeps/mach/usleep.c > @@ -25,17 +25,12 @@ int > usleep (useconds_t useconds) > { > mach_port_t recv; > - struct timeval before, after; > > recv = __mach_reply_port (); > > - if (__gettimeofday (&before, NULL) < 0) > - return -1; > (void) __mach_msg (NULL, > MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT, 0, 0, recv, > (useconds + 999) / 1000, MACH_PORT_NULL); __mach_port_destroy > (mach_task_self (), recv); > - if (__gettimeofday (&after, NULL) < 0) > - return -1; > > return 0; > } > diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c > index a248472540..692c336452 100644 > --- a/sysdeps/posix/tempname.c > +++ b/sysdeps/posix/tempname.c > @@ -50,7 +50,7 @@ > #include <string.h> > > #include <fcntl.h> > -#include <sys/time.h> > +#include <time.h> > #include <stdint.h> > #include <unistd.h> > > @@ -63,7 +63,6 @@ > # define struct_stat64 struct stat > # define __gen_tempname gen_tempname > # define __getpid getpid > -# define __gettimeofday gettimeofday > # define __mkdir mkdir > # define __open open > # define __lxstat64(version, file, buf) lstat (file, buf) > @@ -76,9 +75,9 @@ > # else > # define RANDOM_BITS(Var) \ > { > \ > - struct timeval tv; > \ > - __gettimeofday (&tv, NULL); > \ > - (Var) = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; > \ > + struct timespec ts; > \ > + clock_gettime (CLOCK_REALTIME, &ts); > \ > + (Var) = ((uint64_t) tv.tv_nsec << 16) ^ tv.tv_sec; > \ } > #endif > > diff --git a/sysdeps/posix/timespec_get.c > b/sysdeps/posix/timespec_get.c index 1fc18ac648..e3146da2d3 100644 > --- a/sysdeps/posix/timespec_get.c > +++ b/sysdeps/posix/timespec_get.c > @@ -23,16 +23,10 @@ > int > timespec_get (struct timespec *ts, int base) > { > - switch (base) > + if (base == TIME_UTC) > { > - case TIME_UTC: > - if (__clock_gettime (CLOCK_REALTIME, ts) < 0) > - return 0; > - break; > - > - default: > - return 0; > + __clock_gettime (CLOCK_REALTIME, ts); > + return base; > } > - > - return base; > + return 0; > } > diff --git a/sysdeps/pthread/aio_misc.c b/sysdeps/pthread/aio_misc.c > index 6ff0132ecb..65b4b1ade8 100644 > --- a/sysdeps/pthread/aio_misc.c > +++ b/sysdeps/pthread/aio_misc.c > @@ -614,13 +614,13 @@ handle_fildes_io (void *arg) > something to arrive in it. */ > if (runp == NULL && optim.aio_idle_time >= 0) > { > - struct timeval now; > + struct timespec now; > struct timespec wakeup_time; > > ++idle_thread_count; > - __gettimeofday (&now, NULL); > + __clock_gettime (CLOCK_REALTIME, &now); > wakeup_time.tv_sec = now.tv_sec + optim.aio_idle_time; > - wakeup_time.tv_nsec = now.tv_usec * 1000; > + wakeup_time.tv_nsec = now.tv_nsec; > if (wakeup_time.tv_nsec >= 1000000000) > { > wakeup_time.tv_nsec -= 1000000000; > diff --git a/sysdeps/pthread/aio_suspend.c > b/sysdeps/pthread/aio_suspend.c index ad654e1d08..bb324a5fe6 100644 > --- a/sysdeps/pthread/aio_suspend.c > +++ b/sysdeps/pthread/aio_suspend.c > @@ -183,11 +183,11 @@ aio_suspend (const struct aiocb *const list[], > int nent, { > /* We have to convert the relative timeout value into an > absolute time value with pthread_cond_timedwait > expects. */ > - struct timeval now; > + struct timespec now; > struct timespec abstime; > > - __gettimeofday (&now, NULL); > - abstime.tv_nsec = timeout->tv_nsec + now.tv_usec * 1000; > + __clock_gettime (CLOCK_REALTIME, &now); > + abstime.tv_nsec = timeout->tv_nsec + now.tv_nsec; > abstime.tv_sec = timeout->tv_sec + now.tv_sec; > if (abstime.tv_nsec >= 1000000000) > { > diff --git a/sysdeps/unix/make-syscalls.sh > b/sysdeps/unix/make-syscalls.sh index b49e6b6305..fe24bbc78f 100644 > --- a/sysdeps/unix/make-syscalls.sh > +++ b/sysdeps/unix/make-syscalls.sh > @@ -27,7 +27,7 @@ > # n: scalar buffer length (e.g., 3rd arg to read) > # N: pointer to value/return scalar buffer length (e.g., 6th arg to > recvfrom) # p: non-NULL pointer to typed object (e.g., any non-void* > arg) -# P: optionally-NULL pointer to typed object (e.g., 2nd > argument to gettimeofday) +# P: optionally-NULL pointer to typed > object (e.g., 3rd argument to sigaction) # s: non-NULL string (e.g., > 1st arg to open) # S: optionally-NULL string (e.g., 1st arg to acct) > # v: vararg scalar (e.g., optional 3rd arg to open) Reviewed-by: Lukasz Majewski <lukma@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Attachment:
pgpM_w5esa8I3.pgp
Description: OpenPGP digital signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |