mariadb/ut/ut0rnd.c
marko 1d1dc31a06 branches/zip: Introduce UNIV_INTERN, a linkage specifier for InnoDB-global
symbols.  Use it for all definitions of non-static variables and functions.

lexyy.c, make_flex.sh: Declare yylex as UNIV_INTERN, not static.  It is
referenced from pars0grm.c.

Actually, according to
	nm .libs/ha_innodb.so|grep -w '[ABCE-TVXYZ]'
the following symbols are still global:

* The vtable for class ha_innodb
* pars0grm.c: The function yyparse() and the variables yychar, yylval, yynerrs

The required changes to the Bison-generated file pars0grm.c will be addressed
in a separate commit, which will add a script similar to make_flex.sh.

The class ha_innodb is renamed from class ha_innobase by a #define.  Thus,
there will be no clash with the builtin InnoDB.  However, there will be some
overhead for invoking virtual methods of class ha_innodb.  Ideas for making
the vtable hidden are welcome.  -fvisibility=hidden is not available in GCC 3.
2008-02-06 14:17:36 +00:00

78 lines
1.4 KiB
C

/*******************************************************************
Random numbers and hashing
(c) 1994, 1995 Innobase Oy
Created 5/11/1994 Heikki Tuuri
********************************************************************/
#include "ut0rnd.h"
#ifdef UNIV_NONINL
#include "ut0rnd.ic"
#endif
/* These random numbers are used in ut_find_prime */
#define UT_RANDOM_1 1.0412321
#define UT_RANDOM_2 1.1131347
#define UT_RANDOM_3 1.0132677
ulint ut_rnd_ulint_counter = 65654363;
/***************************************************************
Looks for a prime number slightly greater than the given argument.
The prime is chosen so that it is not near any power of 2. */
UNIV_INTERN
ulint
ut_find_prime(
/*==========*/
/* out: prime */
ulint n) /* in: positive number > 100 */
{
ulint pow2;
ulint i;
n += 100;
pow2 = 1;
while (pow2 * 2 < n) {
pow2 = 2 * pow2;
}
if ((double)n < 1.05 * (double)pow2) {
n = (ulint) ((double)n * UT_RANDOM_1);
}
pow2 = 2 * pow2;
if ((double)n > 0.95 * (double)pow2) {
n = (ulint) ((double)n * UT_RANDOM_2);
}
if (n > pow2 - 20) {
n += 30;
}
/* Now we have n far enough from powers of 2. To make
n more random (especially, if it was not near
a power of 2), we then multiply it by a random number. */
n = (ulint) ((double)n * UT_RANDOM_3);
for (;; n++) {
i = 2;
while (i * i <= n) {
if (n % i == 0) {
goto next_n;
}
i++;
}
/* Found a prime */
break;
next_n: ;
}
return(n);
}