summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2009-07-24 15:03:07 +0000
committerTom Lane2009-07-24 15:03:07 +0000
commit6668c08372e253f1bf4ff9a4e1994f49a701556f (patch)
tree110e27ee674c91ce8664765db8b1fb98d114e885
parentbef37884b1efb878cf7559e8387da266ee6b3030 (diff)
Add commentary about Cygwin's broken erand48, per report from Andrew Dunstan.
-rwxr-xr-xconfigure3
-rw-r--r--configure.in3
-rw-r--r--src/backend/optimizer/geqo/geqo_selection.c20
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;