diff -up BUILD/mariadb-5.5.31.bk/mysys/thr_mutex.c BUILD/mariadb-5.5.31/mysys/thr_mutex.c
--- BUILD/mariadb-5.5.31.bk/mysys/thr_mutex.c        2013-05-21 18:09:52.000000000 -0400
+++ BUILD/mariadb-5.5.31/mysys/thr_mutex.c        2013-09-25 15:59:44.554171774 -0400
@@ -886,10 +886,10 @@ int my_pthread_fastmutex_init(my_pthread
   Commun. ACM, October 1988, Volume 31, No 10, pages 1192-1201.
 */
 
-static double park_rng(my_pthread_fastmutex_t *mp)
+static double park_rng(uint *rng_state)
 {
-  mp->rng_state= ((my_ulonglong)mp->rng_state * 279470273U) % 4294967291U;
-  return (mp->rng_state / 2147483647.0);
+  *rng_state= ((my_ulonglong)*rng_state * 279470273U) % 4294967291U;
+  return (*rng_state / 2147483647.0);
 }
 
 int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp)
@@ -897,20 +897,27 @@ int my_pthread_fastmutex_lock(my_pthread
   int   res;
   uint  i;
   uint  maxdelay= MY_PTHREAD_FASTMUTEX_DELAY;
+  const uint spin_cnt = mp->spins;
+  uint rng_state = mp->rng_state;
 
-  for (i= 0; i < mp->spins; i++)
+  for (i= 0; i < spin_cnt; i++)
   {
     res= pthread_mutex_trylock(&mp->mutex);
 
-    if (res == 0)
+    if (res == 0) {
+      mp->rng_state = rng_state;
       return 0;
-
-    if (res != EBUSY)
+    }
+    if (res != EBUSY) {
+      mp->rng_state = rng_state;
       return res;
+    }
 
     mutex_delay(maxdelay);
-    maxdelay += park_rng(mp) * MY_PTHREAD_FASTMUTEX_DELAY + 1;
+    maxdelay += park_rng(&rng_state) * MY_PTHREAD_FASTMUTEX_DELAY + 1;
   }
+
+  mp->rng_state = rng_state;
   return pthread_mutex_lock(&mp->mutex);
 }

