Below is the list of changes that have just been committed into a local
5.0 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-10-03 21:38:32+02:00, msvensson@stripped +2 -0
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@stripped, 2007-10-03 21:38:30+02:00, msvensson@stripped +3 -0
Make windows.h define TryEnterCriticalSection
mysys/my_winthread.c@stripped, 2007-10-03 21:38:30+02:00, msvensson@stripped +10 -12
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.
diff -Nrup a/include/config-win.h b/include/config-win.h
--- a/include/config-win.h 2007-03-28 23:00:25 +02:00
+++ b/include/config-win.h 2007-10-03 21:38:30 +02:00
@@ -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
diff -Nrup a/mysys/my_winthread.c b/mysys/my_winthread.c
--- a/mysys/my_winthread.c 2007-10-01 15:11:12 +02:00
+++ b/mysys/my_winthread.c 2007-10-03 21:38:30 +02:00
@@ -40,30 +40,28 @@ 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