]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tools/rnd: compute the result outside of the CAS loop
authorWilly Tarreau <w@1wt.eu>
Sun, 9 May 2021 08:26:14 +0000 (10:26 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 9 May 2021 08:26:14 +0000 (10:26 +0200)
ha_random64() uses a DWCAS loop to produce the random, but it computes
the resulting value inside the loop while it doesn't change upon success,
so this is a needless overhead inside the critcal path that participates
to making threads fail the race and try again. Let's take the value out
of the loop.

src/tools.c

index de5dfa8a377aa2f28b977a1284fb330e6ac8b327..718bb49b8fa10c4b8b2bb33755b0d4894b25043d 100644 (file)
@@ -5021,7 +5021,6 @@ static uint64_t ha_random_state[2] ALIGNED(2*sizeof(uint64_t));
  */
 uint64_t ha_random64()
 {
-       uint64_t result;
        uint64_t old[2] ALIGNED(2*sizeof(uint64_t));
        uint64_t new[2] ALIGNED(2*sizeof(uint64_t));
 
@@ -5037,7 +5036,6 @@ uint64_t ha_random64()
 #if defined(USE_THREAD) && defined(HA_CAS_IS_8B) && defined(HA_HAVE_CAS_DW)
        do {
 #endif
-               result = rotl64(old[0] * 5, 7) * 9;
                new[1] = old[0] ^ old[1];
                new[0] = rotl64(old[0], 24) ^ new[1] ^ (new[1] << 16); // a, b
                new[1] = rotl64(new[1], 37); // c
@@ -5051,7 +5049,7 @@ uint64_t ha_random64()
        HA_SPIN_UNLOCK(OTHER_LOCK, &rand_lock);
 #endif
 #endif
-       return result;
+       return rotl64(old[0] * 5, 7) * 9;
 }
 
 /* seeds the random state using up to <len> bytes from <seed>, starting with