Commit 662fb20f authored by unknown's avatar unknown

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


include/config-win.h:
  Make windows.h define TryEnterCriticalSection
mysys/my_winthread.c:
  Use the TryEnterCriticalSection function to implement pthread_mutex_trylock
  Prevent recursive behaviour by looking at the RecursionCount variable
  in the CRITICAL_SECTION struct and return EBUSY from function if
  the mutex was already locked once.
parent 6a5c7fc3
......@@ -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
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment