Message ID | 20130402154214.GJ26146@rox.home.comstyle.com |
---|---|
State | New |
Headers | show |
Il 02/04/2013 17:42, Brad Smith ha scritto: > Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic > time with a configure test. This is to fix the use of monotonic time on > OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also > utilize clock_gettime(). I thought the list of OSes was supposed to filter out those that somehow had a broken CLOCK_MONOTONIC. Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the configure test completely. Paolo > > Signed-off-by: Brad Smith <brad@comstyle.com> > > diff --git a/configure b/configure > index fbea75e..352d6a6 100755 > --- a/configure > +++ b/configure > @@ -2896,6 +2896,21 @@ if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \ > fi > > ########################################## > +# clock_gettime() probe, used for monotonic time > +clock_monotonic="no" > +cat > $TMPC << EOF > +#include <time.h> > +int main(void) > +{ > + clock_gettime(CLOCK_MONOTONIC, NULL); > + return 0; > +} > +EOF > +if compile_prog "" "" ; then > + clock_monotonic="yes" > +fi > + > +########################################## > # spice probe > if test "$spice" != "no" ; then > cat > $TMPC << EOF > @@ -3671,6 +3686,9 @@ fi > if test "$bswap_h" = "yes" ; then > echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak > fi > +if test "$clock_monotonic" = "yes" ; then > + echo "CONFIG_CLOCK_MONOTONIC=y" >> $config_host_mak > +fi > if test "$curl" = "yes" ; then > echo "CONFIG_CURL=y" >> $config_host_mak > echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak > diff --git a/include/qemu/timer.h b/include/qemu/timer.h > index 1766b2d..d87dfa4 100644 > --- a/include/qemu/timer.h > +++ b/include/qemu/timer.h > @@ -117,8 +117,7 @@ extern int use_rt_clock; > > static inline int64_t get_clock(void) > { > -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ > - || defined(__DragonFly__) || defined(__FreeBSD_kernel__) > +#ifdef CONFIG_CLOCK_MONOTONIC > if (use_rt_clock) { > struct timespec ts; > clock_gettime(CLOCK_MONOTONIC, &ts); > diff --git a/util/qemu-timer-common.c b/util/qemu-timer-common.c > index 16f5e75..1506942 100644 > --- a/util/qemu-timer-common.c > +++ b/util/qemu-timer-common.c > @@ -49,9 +49,7 @@ int use_rt_clock; > static void __attribute__((constructor)) init_get_clock(void) > { > use_rt_clock = 0; > -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ > - || defined(__DragonFly__) || defined(__FreeBSD_kernel__) \ > - || defined(__OpenBSD__) > +#ifdef CONFIG_CLOCK_MONOTONIC > { > struct timespec ts; > if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { >
On Tue, Apr 02, 2013 at 06:45:17PM +0200, Paolo Bonzini wrote: > Il 02/04/2013 17:42, Brad Smith ha scritto: > > Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic > > time with a configure test. This is to fix the use of monotonic time on > > OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also > > utilize clock_gettime(). > > I thought the list of OSes was supposed to filter out those that somehow > had a broken CLOCK_MONOTONIC. > > Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the > configure test completely. I only wrote the test as that was what was suggested and even if there are OS's that have broken monotonic support it is better to put any exclusion logic in the configure script over having more hardcoded lists of OS's directly in the code. What OS's have broken monotonic support? I would have no problem going in that direction if no one can actually come up with an OS (or more) that have monotonic support but it is somehow broken; as in having clock_gettime() and the CLOCK_MONOTONIC define but not functioning properly.
On 2 April 2013 17:45, Paolo Bonzini <pbonzini@redhat.com> wrote: > Il 02/04/2013 17:42, Brad Smith ha scritto: >> Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic >> time with a configure test. This is to fix the use of monotonic time on >> OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also >> utilize clock_gettime(). > > I thought the list of OSes was supposed to filter out those that somehow > had a broken CLOCK_MONOTONIC. Judging from wading through git history, it's mostly just historic accretion from an initial #ifdef __linux__ which was put in by Fabrice way back when configure was barely doing compile-this-code checks at all. Google does suggest that some OSes do provide a CLOCK_MONOTONIC but clock_gettime(CLOCK_MONOTONIC) always fails, eg Centos 3. > Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the > configure test completely. Tempting. -- PMM
Il 03/04/2013 00:52, Peter Maydell ha scritto: > On 2 April 2013 17:45, Paolo Bonzini <pbonzini@redhat.com> wrote: >> Il 02/04/2013 17:42, Brad Smith ha scritto: >>> Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic >>> time with a configure test. This is to fix the use of monotonic time on >>> OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also >>> utilize clock_gettime(). >> >> I thought the list of OSes was supposed to filter out those that somehow >> had a broken CLOCK_MONOTONIC. > > Judging from wading through git history, it's mostly just > historic accretion from an initial #ifdef __linux__ which was > put in by Fabrice way back when configure was barely doing > compile-this-code checks at all. > > Google does suggest that some OSes do provide a CLOCK_MONOTONIC > but clock_gettime(CLOCK_MONOTONIC) always fails, eg Centos 3. It would already fail, and no one reported it. CentOS 3 has a 2.4 kernel. I doubt anyone is using it with a recent QEMU. Paolo >> Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the >> configure test completely. > > Tempting. > > -- PMM > >
diff --git a/configure b/configure index fbea75e..352d6a6 100755 --- a/configure +++ b/configure @@ -2896,6 +2896,21 @@ if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \ fi ########################################## +# clock_gettime() probe, used for monotonic time +clock_monotonic="no" +cat > $TMPC << EOF +#include <time.h> +int main(void) +{ + clock_gettime(CLOCK_MONOTONIC, NULL); + return 0; +} +EOF +if compile_prog "" "" ; then + clock_monotonic="yes" +fi + +########################################## # spice probe if test "$spice" != "no" ; then cat > $TMPC << EOF @@ -3671,6 +3686,9 @@ fi if test "$bswap_h" = "yes" ; then echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak fi +if test "$clock_monotonic" = "yes" ; then + echo "CONFIG_CLOCK_MONOTONIC=y" >> $config_host_mak +fi if test "$curl" = "yes" ; then echo "CONFIG_CURL=y" >> $config_host_mak echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak diff --git a/include/qemu/timer.h b/include/qemu/timer.h index 1766b2d..d87dfa4 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -117,8 +117,7 @@ extern int use_rt_clock; static inline int64_t get_clock(void) { -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ - || defined(__DragonFly__) || defined(__FreeBSD_kernel__) +#ifdef CONFIG_CLOCK_MONOTONIC if (use_rt_clock) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); diff --git a/util/qemu-timer-common.c b/util/qemu-timer-common.c index 16f5e75..1506942 100644 --- a/util/qemu-timer-common.c +++ b/util/qemu-timer-common.c @@ -49,9 +49,7 @@ int use_rt_clock; static void __attribute__((constructor)) init_get_clock(void) { use_rt_clock = 0; -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ - || defined(__DragonFly__) || defined(__FreeBSD_kernel__) \ - || defined(__OpenBSD__) +#ifdef CONFIG_CLOCK_MONOTONIC { struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic time with a configure test. This is to fix the use of monotonic time on OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also utilize clock_gettime(). Signed-off-by: Brad Smith <brad@comstyle.com>