From: Elliott Hughes Date: Tue, 11 Mar 2014 20:37:11 +0000 (-0700) Subject: Reimplement clock(3) and switch to OpenBSD time(3). X-Git-Tag: android-x86-7.1-r1~757^2~1320^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=cccfe1e17c47799deee67fa23f48d8c860390ac8;p=android-x86%2Fbionic.git Reimplement clock(3) and switch to OpenBSD time(3). The new implementation is a better approximation to the processor time used by the process because it's actually based on resource usage rather than just elapsed wall clock time. Change-Id: I9e13b69c1d3048cadf0eb9dec1e3ebc78225596a --- 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 +#include +#include + +// 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 similarity index 65% rename from libc/unistd/time.c rename to 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 +#include +#include 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); }