From e9350b6575f296f1e46a867480112300498b467b Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Thu, 17 Oct 2002 08:44:18 +0000 Subject: [PATCH] 2002-10-17 Robert Collins * thread.h (pthread_mutex::isGoodInitializerOrBadObject): Declare. * thread.cc (pthread_mutex::isGoodInitializerOrBadObject): Implement. (pthread_mutex::init): Use isGoodInitializerOrBadObject to avoid unneeded SEGV's during debugging. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/thread.cc | 12 ++++++++++-- winsup/cygwin/thread.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 2143aecba..4c170f239 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2002-10-17 Robert Collins + + * thread.h (pthread_mutex::isGoodInitializerOrBadObject): Declare. + * thread.cc (pthread_mutex::isGoodInitializerOrBadObject): Implement. + (pthread_mutex::init): Use isGoodInitializerOrBadObject to avoid + unneeded SEGV's during debugging. + 2002-10-17 Thomas Pfaff * thread.cc (verifyable_object_isvalid): Test for static object first. diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 75dd7d384..bf44faa34 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -1098,6 +1098,15 @@ pthread_mutex::isGoodInitializerOrObject (pthread_mutex_t const *mutex) return true; } +bool +pthread_mutex::isGoodInitializerOrBadObject (pthread_mutex_t const *mutex) +{ + verifyable_object_state objectState = verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC, PTHREAD_MUTEX_INITIALIZER); + if (objectState == VALID_OBJECT) + return false; + return true; +} + /* This is used for mutex creation protection within a single process only */ pthread_mutex::nativeMutex pthread_mutex::mutexInitializationLock NO_COPY; @@ -2256,8 +2265,7 @@ pthread_mutex::init (pthread_mutex_t *mutex, if (!mutexInitializationLock.lock ()) return EINVAL; - /* FIXME: bugfix: we should check *mutex being a valid address */ - if (isGoodObject (mutex)) + if (!isGoodInitializerOrBadObject (mutex)) { mutexInitializationLock.unlock (); return EBUSY; diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index c23e5a039..73e57edfa 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -291,6 +291,7 @@ public: static bool isGoodObject(pthread_mutex_t const *); static bool isGoodInitializer(pthread_mutex_t const *); static bool isGoodInitializerOrObject(pthread_mutex_t const *); + static bool isGoodInitializerOrBadObject (pthread_mutex_t const *mutex); static void initMutex (); static int init (pthread_mutex_t *, const pthread_mutexattr_t *);