Pārlūkot izejas kodu

Clock component removed from 'luaL_makeseed'

'clock' can be quite slow on some machines.
Roberto Ierusalimschy 2 gadi atpakaļ
vecāks
revīzija
86e8039a72
4 mainītis faili ar 9 papildinājumiem un 11 dzēšanām
  1. 4 6
      lauxlib.c
  2. 2 2
      lmathlib.c
  3. 1 1
      ltablib.c
  4. 2 2
      manual/manual.of

+ 4 - 6
lauxlib.c

@@ -1094,8 +1094,8 @@ static void warnfon (void *ud, const char *message, int tocont) {
 
 /*
 ** A function to compute an unsigned int with some level of
-** randomness. Rely on Address Space Layout Randomization (if present),
-** current time, and clock.
+** randomness. Rely on Address Space Layout Randomization (if present)
+** and the current time.
 */
 #if !defined(luai_makeseed)
 
@@ -1115,18 +1115,16 @@ static void warnfon (void *ud, const char *message, int tocont) {
 
 
 static unsigned int luai_makeseed (void) {
-  unsigned int buff[sof(void*) + sof(clock_t) + sof(time_t)];
+  unsigned int buff[sof(void*) + sof(time_t)];
   unsigned int res;
   unsigned int *b = buff;
-  clock_t c = clock();
   time_t t = time(NULL);
   void *h = buff;
   addbuff(b, h);  /* local variable's address */
-  addbuff(b, c);  /* clock */
   addbuff(b, t);  /* time */
   res = buff[0];
   for (b = buff + 1; b < buff + sof(buff); b++)
-    res += *b;
+    res ^= (res >> 3) + (res << 7) + *b;
   return res;
 }
 

+ 2 - 2
lmathlib.c

@@ -607,8 +607,8 @@ static int math_randomseed (lua_State *L) {
   RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1));
   lua_Unsigned n1, n2;
   if (lua_isnone(L, 1)) {
-    n1 = luaL_makeseed(L);
-    n2 = I2UInt(state->s[0]);
+    n1 = luaL_makeseed(L);  /* "random" seed */
+    n2 = I2UInt(nextrand(state->s));  /* in case seed is not that random... */
   }
   else {
     n1 = luaL_checkinteger(L, 1);

+ 1 - 1
ltablib.c

@@ -310,7 +310,7 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) {
 */
 static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) {
   IdxT r4 = (up - lo) / 4;  /* range/4 */
-  IdxT p = rnd % (r4 * 2) + (lo + r4);
+  IdxT p = (rnd ^ lo ^ up) % (r4 * 2) + (lo + r4);
   lua_assert(lo + r4 <= p && p <= up - r4);
   return p;
 }

+ 2 - 2
manual/manual.of

@@ -5728,8 +5728,8 @@ it does not run it.
 @apii{0,0,-}
 
 Returns a value with a weak attempt for randomness.
-(It produces that value based on the current date and time,
-the current processor time, and the address of an internal variable,
+(It produces that value based on the current date and time
+and the address of an internal variable,
 in case the machine has Address Space Layout Randomization.)
 
 }