Commit 6b2d7326 authored by unknown's avatar unknown
Browse files

Bug#16333 Assertion failure in lock.cc in the sysbench test

 - Set the value of mp->thread before mp->count to avoid race condition.


mysys/thr_mutex.c:
  Set mp->thread before mp->count is changed. 
  Since mp->count is used in the macros 'safe_mutex_assert_not_owner' and 
  'safe_mutex_assert_owner' as an inidicator wheter to look at the mp->thread
  variable or not. This means that when mp->count is changed, the mp->thread
  should akready be set to the owning thread.
  Also set mp->thread to 0 when unlocking the mutex.
parent 4e8f2a12
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -121,6 +121,7 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line)
    fflush(stderr);
    abort();
  }
  mp->thread= pthread_self();
  if (mp->count++)
  {
    fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex at %s, \
@@ -128,7 +129,6 @@ line %d more than 1 time\n", file,line);
    fflush(stderr);
    abort();
  }
  mp->thread=pthread_self();
  mp->file= file;
  mp->line=line;
  pthread_mutex_unlock(&mp->global);
@@ -154,6 +154,7 @@ int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line)
    fflush(stderr);
    abort();
  }
  mp->thread= 0;
  mp->count--;
#ifdef __WIN__
  pthread_mutex_unlock(&mp->mutex);
@@ -207,6 +208,7 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file,
    fflush(stderr);
    abort();
  }
  mp->thread=pthread_self();
  if (mp->count++)
  {
    fprintf(stderr,
@@ -215,7 +217,6 @@ int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp, const char *file,
    fflush(stderr);
    abort();
  }
  mp->thread=pthread_self();
  mp->file= file;
  mp->line=line;
  pthread_mutex_unlock(&mp->global);
@@ -245,6 +246,7 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
  }
#endif
  pthread_mutex_lock(&mp->global);
  mp->thread=pthread_self();
  if (mp->count++)
  {
    fprintf(stderr,
@@ -253,7 +255,6 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
    fflush(stderr);
    abort();
  }
  mp->thread=pthread_self();
  mp->file= file;
  mp->line=line;
  pthread_mutex_unlock(&mp->global);