Fix another portability bug in recent pgbench commit.
authorThomas Munro <tmunro@postgresql.org>
Wed, 10 Mar 2021 09:22:12 +0000 (22:22 +1300)
committerThomas Munro <tmunro@postgresql.org>
Wed, 10 Mar 2021 10:20:41 +0000 (23:20 +1300)
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 <time.h> 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
src/include/portability/instr_time.h

index e4dfbcf4720c3819732ca65b28d487e5e7d2b40c..f6a214669c1a312227b33891ea0ccd1742dba735 100644 (file)
@@ -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)
index faf806a4410a0eebe50d1d913b42cdf8bb42c2af..39a4f0600e23737c3b35199ef213d8c78bc81140 100644 (file)
@@ -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 */