summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/thread.cc56
-rw-r--r--winsup/cygwin/thread.h10
3 files changed, 58 insertions, 18 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f1fd014c6..34d90a4d6 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,13 @@
+2002-09-30 Robert Collins <rbtcollins@hotmail.com>
+
+ * thread.cc (pthread_mutex::initMutex): Use the wrapper init call.
+ (pthread_mutex::nativeMutex::init): Implement.
+ (pthread_mutex::nativeMutex::lock): Ditto.
+ (pthread_mutex::nativeMutex::unlock): Ditto.
+ (pthread_mutex::init): Use the wrapper lock and unlockcalls.
+ * thread.h (pthread_mutex): Move mutexInitializationLock into a
+ nativeMutex wrapper class.
+
2002-09-30 Christopher Faylor <cgf@redhat.com>
Remove \n from calls to strace class printfs throughout.
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 4b73eb391..49b8c1b5c 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -1097,7 +1097,7 @@ pthread_mutex::isGoodInitializerOrObject (pthread_mutex_t const *mutex)
return true;
}
-HANDLE pthread_mutex::mutexInitializationLock;
+pthread_mutex::nativeMutex pthread_mutex::mutexInitializationLock;
/* We can only be called once.
TODO: (no rush) use a non copied memory section to
@@ -1105,10 +1105,8 @@ HANDLE pthread_mutex::mutexInitializationLock;
void
pthread_mutex::initMutex ()
{
- mutexInitializationLock = CreateMutex (NULL, FALSE, NULL);
- if (!mutexInitializationLock)
- api_fatal ("Could not create win32 Mutex for pthread mutex static initializer support. The error code was %E");
-
+ if (!mutexInitializationLock.init())
+ api_fatal ("Could not create win32 Mutex for pthread mutex static initializer support.\n");
}
pthread_mutex::pthread_mutex (pthread_mutexattr *attr):verifyable_object (PTHREAD_MUTEX_MAGIC)
@@ -1215,6 +1213,37 @@ pthread_mutex::fixup_after_fork ()
}
bool
+pthread_mutex::nativeMutex::init()
+{
+ theHandle = CreateMutex (NULL, FALSE, NULL);
+ if (!theHandle)
+ {
+ debug_printf ("CreateMutex failed. %E");
+ return false;
+ }
+ return true;
+}
+
+bool
+pthread_mutex::nativeMutex::lock()
+{
+ DWORD waitResult = WaitForSingleObject (theHandle, INFINITE);
+ if (waitResult != WAIT_OBJECT_0)
+ {
+ system_printf ("Received unexpected wait result %d on handle %p, %E", waitResult, theHandle);
+ return false;
+ }
+ return true;
+}
+
+void
+pthread_mutex::nativeMutex::unlock()
+{
+ if (!ReleaseMutex (theHandle))
+ system_printf ("Received a unexpected result releasing mutex. %E");
+}
+
+bool
pthread_mutexattr::isGoodObject (pthread_mutexattr_t const * attr)
{
if (verifyable_object_isvalid (attr, PTHREAD_MUTEXATTR_MAGIC) != VALID_OBJECT)
@@ -2222,18 +2251,13 @@ pthread_mutex::init (pthread_mutex_t *mutex,
{
if (attr && !pthread_mutexattr::isGoodObject (attr) || check_valid_pointer (mutex))
return EINVAL;
- DWORD waitResult = WaitForSingleObject (mutexInitializationLock, INFINITE);
- if (waitResult != WAIT_OBJECT_0)
- {
- system_printf ("Received a unexpected wait result on mutexInitializationLock %d, %E", waitResult);
- return EINVAL;
- }
+ if (!mutexInitializationLock.lock())
+ return EINVAL;
/* FIXME: bugfix: we should check *mutex being a valid address */
if (isGoodObject (mutex))
{
- if (!ReleaseMutex (mutexInitializationLock))
- system_printf ("Received a unexpected result releasing mutexInitializationLock %E");
+ mutexInitializationLock.unlock();
return EBUSY;
}
@@ -2242,12 +2266,10 @@ pthread_mutex::init (pthread_mutex_t *mutex,
{
delete (*mutex);
*mutex = NULL;
- if (!ReleaseMutex (mutexInitializationLock))
- system_printf ("Received a unexpected result releasing mutexInitializationLock %E");
+ mutexInitializationLock.unlock();
return EAGAIN;
}
- if (!ReleaseMutex (mutexInitializationLock))
- system_printf ("Received a unexpected result releasing mutexInitializationLock %E");
+ mutexInitializationLock.unlock();
return 0;
}
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index 9490ee947..c23e5a039 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -309,7 +309,15 @@ public:
pthread_mutex (pthread_mutex_t *, pthread_mutexattr *);
~pthread_mutex ();
private:
- static HANDLE mutexInitializationLock;
+ class nativeMutex {
+ public:
+ bool init();
+ bool lock();
+ void unlock();
+ private:
+ HANDLE theHandle;
+ };
+ static nativeMutex mutexInitializationLock;
};
class pthread:public verifyable_object