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 @@ ...@@ -19,6 +19,9 @@
/* We have to do this define before including windows.h to get the AWE API /* We have to do this define before including windows.h to get the AWE API
functions */ functions */
#define _WIN32_WINNT 0x0500 #define _WIN32_WINNT 0x0500
#else
/* Get NT 4.0 functions */
#define _WIN32_WINNT 0x0400
#endif #endif
#if defined(_MSC_VER) && _MSC_VER >= 1400 #if defined(_MSC_VER) && _MSC_VER >= 1400
......
...@@ -40,31 +40,29 @@ void win_pthread_init(void) ...@@ -40,31 +40,29 @@ void win_pthread_init(void)
pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST); pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST);
} }
/** /**
Adapter to @c pthread_mutex_trylock() Adapter to @c pthread_mutex_trylock()
@retval 0 Mutex was acquired @retval 0 Mutex was acquired
@retval EBUSY Mutex was already locked by a thread @retval EBUSY Mutex was already locked by a thread
@retval EINVAL Mutex could not be acquired due to other error
*/ */
int int
win_pthread_mutex_trylock(pthread_mutex_t *mutex) win_pthread_mutex_trylock(pthread_mutex_t *mutex)
{ {
switch (WaitForSingleObject(mutex, 0)) { if (TryEnterCriticalSection(mutex))
case WAIT_TIMEOUT: {
/* Don't allow recursive lock */
if (mutex->RecursionCount > 1){
LeaveCriticalSection(mutex);
return EBUSY; 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 0;
} }
return EBUSY;
} }
/* /*
** We have tried to use '_beginthreadex' instead of '_beginthread' here ** We have tried to use '_beginthreadex' instead of '_beginthread' here
** but in this case the program leaks about 512 characters for each ** 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