Make pgbench use erand48() rather than random().

Robert Haas <rhaas@postgresql.org>

Commit: 4af43ee3f165c8e4b332a7e680a44f4b7ba2d3c1
Author: Robert Haas <rhaas@postgresql.org>
Date: 2011-08-03T20:26:40Z
Releases: 9.2.0
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.

Files

PathChange+/−
configure modified +1 −13
configure.in modified +1 −7
contrib/pgbench/pgbench.c modified +15 −17
src/backend/optimizer/geqo/geqo_random.c modified +1 −1
src/backend/optimizer/geqo/geqo_selection.c modified +3 −3
src/include/optimizer/geqo.h modified +1 −1
src/include/pg_config.h.in modified +0 −3
src/include/port.h modified +3 −6
src/port/erand48.c modified +11 −7
src/port/Makefile modified +2 −2
src/port/random.c modified +1 −1
src/port/srandom.c modified +1 −1