Commit 18c61189 authored by msvensson@pilot.mysql.com's avatar msvensson@pilot.mysql.com
Browse files

Bug#30992 Wrong implementation of pthread_mutex_trylock()

It's not possible to use WaitForSingleObject to wait
on a CRITICAL_SECTION, instead use the TryEnterCriticalSection function.
 - if "mutex" was already taken => return EBUSY
 - if "mutex" was aquired => return 0
parent 23622616
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@
/* We have to do this define before including windows.h to get the AWE API
functions */
#define _WIN32_WINNT     0x0500
#else
/* Get NT 4.0 functions */
#define _WIN32_WINNT     0x0400
#endif

#if defined(_MSC_VER) && _MSC_VER >= 1400
+10 −12
Original line number Diff line number Diff line
@@ -40,31 +40,29 @@ void win_pthread_init(void)
  pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST);
}


/**
   Adapter to @c pthread_mutex_trylock()

   @retval 0      Mutex was acquired
   @retval EBUSY  Mutex was already locked by a thread
   @retval EINVAL Mutex could not be acquired due to other error
 */
int
win_pthread_mutex_trylock(pthread_mutex_t *mutex)
{
  switch (WaitForSingleObject(mutex, 0)) {
  case WAIT_TIMEOUT:
  if (TryEnterCriticalSection(mutex))
  {
    /* Don't allow recursive lock */
    if (mutex->RecursionCount > 1){
      LeaveCriticalSection(mutex);
      return EBUSY;

  default:
  case WAIT_FAILURE:
    return EINVAL;

  case WAIT_OBJECT_0:
  case WAIT_ABANDONED: /* The mutex was acquired because it was
                        * abandoned */
    }
    return 0;
  }
  return EBUSY;
}


/*
** We have tried to use '_beginthreadex' instead of '_beginthread' here
** but in this case the program leaks about 512 characters for each