From c427de427ac411039d5efd5d0dcc8a4e0c6da68d Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 10 Mar 2021 22:22:12 +1300 Subject: [PATCH] Fix another portability bug in recent pgbench commit. Commit 547f04e7 produced errors on AIX/xlc while building plpython. The new code appears to be incompatible with the hack installed by commit a11cf433. Without access to an AIX system to check, my guess is that _POSIX_C_SOURCE may be required for to declare the things the header needs to see, but plpython.h undefines it. For now, to unbreak build farm animal hoverfly, just move the new pg_time_usec_t support into pgbench.c. Perhaps later we could figure out what to rearrange to put it back into a header for wider use. Discussion: https://postgr.es/m/CA%2BhUKG%2BP%2BjcD%3Dx9%2BagyTdWtjpOT64MYiGic%2Bcbu_TD8CV%3D6A3w%40mail.gmail.com --- src/bin/pgbench/pgbench.c | 25 +++++++++++++++++++++++++ src/include/portability/instr_time.h | 28 ---------------------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index e4dfbcf472..f6a214669c 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -320,6 +320,13 @@ typedef struct SimpleStats double sum2; /* sum of squared values */ } SimpleStats; +/* + * The instr_time type is expensive when dealing with time arithmetic. Define + * a type to hold microseconds instead. Type int64 is good enough for about + * 584500 years. + */ +typedef int64 pg_time_usec_t; + /* * Data structure to hold various statistics: per-thread and per-script stats * are maintained and merged together. @@ -658,6 +665,24 @@ static const PsqlScanCallbacks pgbench_callbacks = { NULL, /* don't need get_variable functionality */ }; +static inline pg_time_usec_t +pg_time_now(void) +{ + instr_time now; + + INSTR_TIME_SET_CURRENT(now); + + return (pg_time_usec_t) INSTR_TIME_GET_MICROSEC(now); +} + +static inline void +pg_time_now_lazy(pg_time_usec_t *now) +{ + if ((*now) == 0) + (*now) = pg_time_now(); +} + +#define PG_TIME_GET_DOUBLE(t) (0.000001 * (t)) static void usage(void) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index faf806a441..39a4f0600e 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -253,32 +253,4 @@ GetTimerFrequency(void) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) -/* - * Simpler convenient interface - * - * The instr_time type is expensive when dealing with time arithmetic. - * Define a type to hold microseconds on top of this, suitable for - * benchmarking performance measures, eg in "pgbench". - * - * Type int64 is good enough for about 584500 years. - */ -typedef int64 pg_time_usec_t; - -static inline pg_time_usec_t -pg_time_now(void) -{ - instr_time now; - - INSTR_TIME_SET_CURRENT(now); - return (pg_time_usec_t) INSTR_TIME_GET_MICROSEC(now); -} - -static inline void -pg_time_now_lazy(pg_time_usec_t *now) -{ - if ((*now) == 0) - (*now) = pg_time_now(); -} - -#define PG_TIME_GET_DOUBLE(t) (0.000001 * (t)) #endif /* INSTR_TIME_H */ -- 2.39.5