mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-09-25 00:43:39 +08:00
fixed recursive mutexs compilation
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9689 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
+55
-1
@@ -2698,12 +2698,66 @@ if test "$wxUSE_THREADS" = "yes" ; then
|
||||
pthread_cleanup_pop(0);
|
||||
], [
|
||||
wx_cv_func_pthread_cleanup_push=yes
|
||||
AC_DEFINE(HAVE_THREAD_CLEANUP_FUNCTIONS)
|
||||
], [
|
||||
wx_cv_func_pthread_cleanup_push=no
|
||||
])
|
||||
])
|
||||
|
||||
if test "$wx_cv_func_pthread_cleanup_push" = "yes"; then
|
||||
AC_DEFINE(HAVE_THREAD_CLEANUP_FUNCTIONS)
|
||||
fi
|
||||
|
||||
dnl mutexattr_t initialization is done in quite different ways on different
|
||||
dnl platforms, so check for a few things:
|
||||
dnl
|
||||
dnl HAVE_MUTEX_RECURSIVE means that we can create recursive mutexes
|
||||
dnl HAVE_MUTEXATTR_SETTYPE means that we do it using
|
||||
dnl pthread_mutexattr_settype(PTHREAD_MUTEX_RECURSIVE) and if it is not
|
||||
dnl defined, we do it by directly assigned
|
||||
dnl PTHREAD_MUTEX_RECURSIVE_MUTEX_INITIALIZER_NP to attr
|
||||
|
||||
#ifdef HAVE_PTHREAD_MUTEXATTR_T
|
||||
#elif defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
|
||||
|
||||
AC_CACHE_CHECK([for pthread_mutexattr_t], wx_cv_type_pthread_mutexattr_t,
|
||||
[
|
||||
AC_TRY_COMPILE([#include <pthread.h>],
|
||||
[
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
], [
|
||||
wx_cv_type_pthread_mutexattr_t=yes
|
||||
], [
|
||||
wx_cv_type_pthread_mutexattr_t=no
|
||||
]
|
||||
)
|
||||
])
|
||||
|
||||
if test "$wx_cv_type_pthread_mutexattr_t" = "yes"; then
|
||||
AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_T)
|
||||
else
|
||||
dnl don't despair, there may be another way to do it
|
||||
AC_CACHE_CHECK([for PTHREAD_RECURSIVE_MUTEX_INITIALIZER],
|
||||
wx_cv_type_pthread_rec_mutex_init,
|
||||
[
|
||||
AC_TRY_COMPILE([#include <pthread.h>],
|
||||
[
|
||||
pthread_mutex_t attr = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
|
||||
], [
|
||||
wx_cv_type_pthread_rec_mutex_init=yes
|
||||
], [
|
||||
wx_cv_type_pthread_rec_mutex_init=no
|
||||
]
|
||||
)
|
||||
])
|
||||
if test "$wx_cv_type_pthread_rec_mutex_init"="yes"; then
|
||||
AC_DEFINE(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
|
||||
else
|
||||
dnl this may break code working elsewhere, so at least warn about it
|
||||
AC_MSG_WARN([wxMutex won't be recursive on this platform])
|
||||
fi
|
||||
fi
|
||||
|
||||
THREADS_LINK="-l$THREADS_LINK"
|
||||
|
||||
dnl building MT programs under Solaris with the native compiler requires -mt
|
||||
|
||||
@@ -676,6 +676,12 @@
|
||||
/* Define if you have sched_yield */
|
||||
#undef HAVE_SCHED_YIELD
|
||||
|
||||
/* Define if you have pthread_mutexattr_t and functions to work with it */
|
||||
#undef HAVE_PTHREAD_MUTEXATTR_T
|
||||
|
||||
/* Define if you have PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP */
|
||||
#undef HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER
|
||||
|
||||
/* Define if you have pthread_cancel */
|
||||
#undef HAVE_PTHREAD_CANCEL
|
||||
|
||||
|
||||
@@ -166,10 +166,23 @@ wxMutex::wxMutex()
|
||||
|
||||
// support recursive locks like Win32, i.e. a thread can lock a mutex which
|
||||
// it had itself already locked
|
||||
//
|
||||
// but initialization of recursive mutexes is non portable <sigh>, so try
|
||||
// several methods
|
||||
#ifdef HAVE_PTHREAD_MUTEXATTR_T
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
|
||||
pthread_mutex_init(&(m_internal->m_mutex), &attr);
|
||||
#elif defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
|
||||
// we can use this only as initializer so we have to assign it first to a
|
||||
// temp var - assigning directly to m_mutex wouldn't even compile
|
||||
pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
|
||||
m_internal->m_mutex = mutex;
|
||||
#else // no recursive mutexes
|
||||
pthread_mutex_init(&(m_internal->m_mutex), NULL);
|
||||
#endif // HAVE_PTHREAD_MUTEXATTR_T/...
|
||||
|
||||
m_locked = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user