mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
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.
This commit is contained in:
parent
6a5c7fc3b8
commit
662fb20f1e
2 changed files with 13 additions and 12 deletions
|
@ -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:
|
||||
return EBUSY;
|
||||
|
||||
default:
|
||||
case WAIT_FAILURE:
|
||||
return EINVAL;
|
||||
|
||||
case WAIT_OBJECT_0:
|
||||
case WAIT_ABANDONED: /* The mutex was acquired because it was
|
||||
* abandoned */
|
||||
if (TryEnterCriticalSection(mutex))
|
||||
{
|
||||
/* Don't allow recursive lock */
|
||||
if (mutex->RecursionCount > 1){
|
||||
LeaveCriticalSection(mutex);
|
||||
return EBUSY;
|
||||
}
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue