aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-10-24 16:55:22 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-10-24 17:00:18 +0300
commit98c50656cac2e6b873419fd09569a9119c02148c (patch)
tree4312787ab93fc11ec916254904da1bd0a5ed97a4
parent75fdcec14543b60cc0c67483d8cc47d5c7adf1a8 (diff)
downloadpostgresql-98c50656cac2e6b873419fd09569a9119c02148c.tar.gz
postgresql-98c50656cac2e6b873419fd09569a9119c02148c.zip
Increase the number of different values used when seeding random().
When a backend process is forked, we initialize the system's random number generator with srandom(). The seed used is derived from the backend's pid and the timestamp. However, we only used the microseconds part of the timestamp, and it was XORed with the pid, so the total range of different seed values chosen was 0-999999. That's quite limited. Change the code to also use the seconds part of the timestamp in the seed, and shift the microseconds so that all 32 bits of the seed are used. Honza Horak
-rw-r--r--src/backend/postmaster/postmaster.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 351887b1333..d294a5a47f8 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -4033,9 +4033,9 @@ BackendRun(Port *port)
*/
random_seed = 0;
random_start_time.tv_usec = 0;
- /* slightly hacky way to get integer microseconds part of timestamptz */
+ /* slightly hacky way to convert timestamptz into integers */
TimestampDifference(0, port->SessionStartTime, &secs, &usecs);
- srandom((unsigned int) (MyProcPid ^ usecs));
+ srandom((unsigned int) (MyProcPid ^ (usecs << 12) ^ secs));
/*
* Now, build the argv vector that will be given to PostgresMain.