]> granicus.if.org Git - postgresql/commit
Make pgbench use erand48() rather than random().
authorRobert Haas <rhaas@postgresql.org>
Wed, 3 Aug 2011 20:26:40 +0000 (16:26 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 3 Aug 2011 20:26:40 +0000 (16:26 -0400)
commit4af43ee3f165c8e4b332a7e680a44f4b7ba2d3c1
treec75980425aaaae3144a458871139cdec9f5537ab
parentac36e6f71f197540b8ee83c97f338ae5e5163f30
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.
12 files changed:
configure
configure.in
contrib/pgbench/pgbench.c
src/backend/optimizer/geqo/geqo_random.c
src/backend/optimizer/geqo/geqo_selection.c
src/include/optimizer/geqo.h
src/include/pg_config.h.in
src/include/port.h
src/port/Makefile
src/port/erand48.c
src/port/random.c
src/port/srandom.c