mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Make pgbench use erand48() rather than random().
glibc renders random() thread-safe by wrapping a futex lock around it; testing reveals that this limits the performance of pgbench on machines with many CPU cores. Rather than switching to random_r(), which is only available on GNU systems and crashes unless you use undocumented alchemy to initialize the random state properly, switch to our built-in implementation of erand48(), which is both thread-safe and concurrent. Since the list of reasons not to use the operating system's erand48() is getting rather long, rename ours to pg_erand48() (and similarly for our implementations of lrand48() and srand48()) and just always use those. We were already doing this on Cygwin anyway, and the glibc implementation is not quite thread-safe, so pgbench wouldn't be able to use that either. Per discussion with Tom Lane.
This commit is contained in:
@@ -380,12 +380,9 @@ extern off_t ftello(FILE *stream);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ERAND48
|
||||
/* we assume all of these are present or missing together */
|
||||
extern double erand48(unsigned short xseed[3]);
|
||||
extern long lrand48(void);
|
||||
extern void srand48(long seed);
|
||||
#endif
|
||||
extern double pg_erand48(unsigned short xseed[3]);
|
||||
extern long pg_lrand48(void);
|
||||
extern void pg_srand48(long seed);
|
||||
|
||||
#ifndef HAVE_FSEEKO
|
||||
#define fseeko(a, b, c) fseek(a, b, c)
|
||||
|
Reference in New Issue
Block a user