diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d7266b16f..6aa24f856 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2014-07-14 Yaakov Selkowitz + + * thread.cc (pthread_mutex::pthread_mutex): Change default type + to PTHREAD_MUTEX_NORMAL. + (pthread_mutex::unlock): Return EPERM if the mutex has no owner and + the mutex type is PTHREAD_MUTEX_ERRORCHECK, as on Linux. + (pthread_mutexattr::pthread_mutexattr): Ditto. + (pthread_mutex_unlock): Do not fail if mutex is a normal mutex + initializer. + * include/pthread.h (PTHREAD_MUTEX_INITIALIZER): Redefine as + PTHREAD_NORMAL_MUTEX_INITIALIZER_NP. + 2014-07-09 Corinna Vinschen * thread.cc (pthread::create): Use PTHREAD_DEFAULT_STACKSIZE stacksize diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h index c6798f13a..bfedf1f75 100644 --- a/winsup/cygwin/include/pthread.h +++ b/winsup/cygwin/include/pthread.h @@ -49,7 +49,7 @@ extern "C" #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP (pthread_mutex_t)18 #define PTHREAD_NORMAL_MUTEX_INITIALIZER_NP (pthread_mutex_t)19 #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (pthread_mutex_t)20 -#define PTHREAD_MUTEX_INITIALIZER PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +#define PTHREAD_MUTEX_INITIALIZER PTHREAD_NORMAL_MUTEX_INITIALIZER_NP #define PTHREAD_ONCE_INIT { PTHREAD_MUTEX_INITIALIZER, 0 } #if defined(_POSIX_THREAD_PRIO_INHERIT) && _POSIX_THREAD_PRIO_INHERIT >= 0 #define PTHREAD_PRIO_NONE 0 diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 0a167fa4d..8fdbf3610 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -1709,7 +1709,7 @@ pthread_mutex::pthread_mutex (pthread_mutexattr *attr) : tid (0), #endif recursion_counter (0), condwaits (0), - type (PTHREAD_MUTEX_ERRORCHECK), + type (PTHREAD_MUTEX_NORMAL), pshared (PTHREAD_PROCESS_PRIVATE) { win32_obj_id = ::CreateEvent (&sec_none_nih, false, false, NULL); @@ -1777,7 +1777,7 @@ pthread_mutex::unlock () if (type == PTHREAD_MUTEX_NORMAL) /* no error checking */; else if (no_owner ()) - res = type == PTHREAD_MUTEX_ERRORCHECK ? EINVAL : 0; + res = type == PTHREAD_MUTEX_ERRORCHECK ? EPERM : 0; else if (!pthread::equal (owner, self)) res = EPERM; if (!res && recursion_counter > 0 && --recursion_counter == 0) @@ -1851,7 +1851,7 @@ pthread_mutex::_fixup_after_fork () } pthread_mutexattr::pthread_mutexattr ():verifyable_object (PTHREAD_MUTEXATTR_MAGIC), -pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_ERRORCHECK) +pshared (PTHREAD_PROCESS_PRIVATE), mutextype (PTHREAD_MUTEX_NORMAL) { } @@ -3159,7 +3159,7 @@ extern "C" int pthread_mutex_unlock (pthread_mutex_t *mutex) { if (pthread_mutex::is_initializer (mutex)) - return EPERM; + pthread_mutex::init (mutex, NULL, *mutex); if (!pthread_mutex::is_good_object (mutex)) return EINVAL; return (*mutex)->unlock ();