diff options
author | Elliott Hughes <enh@google.com> | 2014-03-11 21:36:02 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-03-11 21:36:02 +0000 |
commit | 55f9710ac4843b4a5d2c8b03ade3d2bddd1fdf46 (patch) | |
tree | 6f9e16f0334ab314da4aaabea677b1c5d47f471f | |
parent | 753e1399060c08072a8fb17eb297889a2ae987d0 (diff) | |
parent | cccfe1e17c47799deee67fa23f48d8c860390ac8 (diff) | |
download | android_bionic-55f9710ac4843b4a5d2c8b03ade3d2bddd1fdf46.tar.gz android_bionic-55f9710ac4843b4a5d2c8b03ade3d2bddd1fdf46.tar.bz2 android_bionic-55f9710ac4843b4a5d2c8b03ade3d2bddd1fdf46.zip |
Merge "Reimplement clock(3) and switch to OpenBSD time(3)."
-rw-r--r-- | libc/Android.mk | 3 | ||||
-rw-r--r-- | libc/bionic/clock.cpp | 38 | ||||
-rw-r--r-- | libc/include/sys/times.h | 3 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/gen/time.c (renamed from libc/unistd/time.c) | 41 |
4 files changed, 48 insertions, 37 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index 35efa5b24..eb9433f74 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -96,7 +96,6 @@ libc_common_src_files := \ stdlib/setenv.c \ stdlib/strtod.c \ unistd/syslog.c \ - unistd/time.c \ # Fortify implementations of libc functions. libc_common_src_files += \ @@ -125,6 +124,7 @@ libc_bionic_src_files := \ bionic/brk.cpp \ bionic/chmod.cpp \ bionic/chown.cpp \ + bionic/clock.cpp \ bionic/clone.cpp \ bionic/dirent.cpp \ bionic/dup2.cpp \ @@ -319,6 +319,7 @@ libc_upstream_openbsd_src_files := \ upstream-openbsd/lib/libc/gen/ftok.c \ upstream-openbsd/lib/libc/gen/getprogname.c \ upstream-openbsd/lib/libc/gen/setprogname.c \ + upstream-openbsd/lib/libc/gen/time.c \ upstream-openbsd/lib/libc/gen/tolower_.c \ upstream-openbsd/lib/libc/gen/toupper_.c \ upstream-openbsd/lib/libc/locale/wcscoll.c \ diff --git a/libc/bionic/clock.cpp b/libc/bionic/clock.cpp new file mode 100644 index 000000000..98f71afc3 --- /dev/null +++ b/libc/bionic/clock.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <time.h> +#include <sys/sysconf.h> +#include <sys/times.h> + +// http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html +clock_t clock() { + tms t; + times(&t); + return (t.tms_utime + t.tms_stime) * (CLOCKS_PER_SEC / sysconf(_SC_CLK_TCK)); +} diff --git a/libc/include/sys/times.h b/libc/include/sys/times.h index 1b9b8b265..6ce5b55e4 100644 --- a/libc/include/sys/times.h +++ b/libc/include/sys/times.h @@ -25,6 +25,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ + #ifndef _SYS_TIMES_H_ #define _SYS_TIMES_H_ @@ -34,7 +35,7 @@ __BEGIN_DECLS -extern clock_t times(struct tms *); +extern clock_t times(struct tms*); __END_DECLS diff --git a/libc/unistd/time.c b/libc/upstream-openbsd/lib/libc/gen/time.c index 18aa62c26..3a57500d4 100644 --- a/libc/unistd/time.c +++ b/libc/upstream-openbsd/lib/libc/gen/time.c @@ -28,46 +28,17 @@ * SUCH DAMAGE. */ -#include <time.h> +#include <sys/types.h> +#include <sys/time.h> time_t time(time_t *t) { struct timeval tt; - time_t ret; if (gettimeofday(&tt, (struct timezone *)0) < 0) - ret = -1; - else - ret = tt.tv_sec; - if (t != NULL) - *t = ret; - return ret; -} - -// return monotonically increasing CPU time in ticks relative to unspecified epoch -static inline clock_t clock_now(void) -{ - struct timespec tm; - clock_gettime( CLOCK_MONOTONIC, &tm); - return tm.tv_sec * CLOCKS_PER_SEC + (tm.tv_nsec * (CLOCKS_PER_SEC/1e9)); -} - -// initialized by the constructor below -static clock_t clock_start; - -// called by dlopen when .so is loaded -__attribute__((constructor)) static void clock_crt0(void) -{ - clock_start = clock_now(); -} - -// return elapsed CPU time in clock ticks, since start of program execution -// (spec says epoch is undefined, but glibc uses crt0 as epoch) -clock_t -clock(void) -{ - // note that if we are executing in a different thread than crt0, then the - // pthread_create that made us had a memory barrier so clock_start is defined - return clock_now() - clock_start; + return (-1); + if (t) + *t = (time_t)tt.tv_sec; + return (tt.tv_sec); } |