From 6668c08372e253f1bf4ff9a4e1994f49a701556f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 24 Jul 2009 15:03:07 +0000 Subject: [PATCH] Add commentary about Cygwin's broken erand48, per report from Andrew Dunstan. --- configure | 3 ++- configure.in | 3 ++- src/backend/optimizer/geqo/geqo_selection.c | 20 ++++++++++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/configure b/configure index 2ba6050bce..fb41c024e2 100755 --- a/configure +++ b/configure @@ -19085,7 +19085,8 @@ esac fi -# Cygwin's erand48 sometimes hangs, so force use of ours +# Cygwin's erand48() is broken (always returns zero) in some releases, +# so force use of ours. if test "$PORTNAME" = "cygwin"; then case " $LIBOBJS " in *" erand48.$ac_objext "* ) ;; diff --git a/configure.in b/configure.in index ed6d524038..f1ee796d0f 100644 --- a/configure.in +++ b/configure.in @@ -1289,7 +1289,8 @@ if test "$PORTNAME" = "solaris"; then AC_LIBOBJ(getopt) fi -# Cygwin's erand48 sometimes hangs, so force use of ours +# Cygwin's erand48() is broken (always returns zero) in some releases, +# so force use of ours. if test "$PORTNAME" = "cygwin"; then AC_LIBOBJ(erand48) fi diff --git a/src/backend/optimizer/geqo/geqo_selection.c b/src/backend/optimizer/geqo/geqo_selection.c index 8a7e7dcda7..f82487560c 100644 --- a/src/backend/optimizer/geqo/geqo_selection.c +++ b/src/backend/optimizer/geqo/geqo_selection.c @@ -42,7 +42,7 @@ #include "optimizer/geqo_random.h" #include "optimizer/geqo_selection.h" -static int linear(PlannerInfo *root, int max, double bias); +static int linear_rand(PlannerInfo *root, int max, double bias); /* @@ -57,13 +57,21 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, int first, second; - first = linear(root, pool->size, bias); - second = linear(root, pool->size, bias); + first = linear_rand(root, pool->size, bias); + second = linear_rand(root, pool->size, bias); + /* + * Ensure we have selected different genes, except if pool size is only + * one, when we can't. + * + * This code has been observed to hang up in an infinite loop when the + * platform's implementation of erand48() is broken. We consider that a + * feature: it lets you know you'd better fix the random-number generator. + */ if (pool->size > 1) { while (first == second) - second = linear(root, pool->size, bias); + second = linear_rand(root, pool->size, bias); } geqo_copy(root, momma, &pool->data[first], pool->string_length); @@ -71,7 +79,7 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, } /* - * linear + * linear_rand * generates random integer between 0 and input max number * using input linear bias * @@ -81,7 +89,7 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, * bias = (prob of first rule) / (prob of middle rule) */ static int -linear(PlannerInfo *root, int pool_size, double bias) +linear_rand(PlannerInfo *root, int pool_size, double bias) { double index; /* index between 0 and pop_size */ double max = (double) pool_size; -- 2.30.2