Index: thread.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/thread.cc,v
retrieving revision 1.50
diff -u -p -r1.50 thread.cc
--- thread.cc	2001/09/25 11:45:25	1.50
+++ thread.cc	2001/09/27 13:47:58
@@ -462,7 +462,7 @@ pthread_cond::BroadCast ()
   if (pthread_mutex_lock (&cond_access))
     system_printf ("Failed to lock condition variable access mutex, this %0p\n", this);
   int count = waiting;
-  if (!verifyable_object_isvalid (&mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (&mutex, PTHREAD_MUTEX_MAGIC) != -1)
     {
       if (pthread_mutex_unlock (&cond_access))
 	system_printf ("Failed to unlock condition variable access mutex, this %0p\n", this);
@@ -483,7 +483,7 @@ pthread_cond::Signal ()
 {
   if (pthread_mutex_lock (&cond_access))
     system_printf ("Failed to lock condition variable access mutex, this %0p\n", this);
-  if (!verifyable_object_isvalid (&mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (&mutex, PTHREAD_MUTEX_MAGIC) != -1)
     {
       if (pthread_mutex_unlock (&cond_access))
 	system_printf ("Failed to unlock condition variable access mutex, this %0p\n",
@@ -817,8 +817,10 @@ verifyable_object_isvalid (void const * 
   verifyable_object **object = (verifyable_object **)objectptr;
   if (check_valid_pointer (object))
     return 0;
-  if (!*object || *object == PTHREAD_MUTEX_INITIALIZER)
+  if (!*object)
     return 0;
+  if (*object == PTHREAD_MUTEX_INITIALIZER)
+    return 1;
   if (check_valid_pointer (*object))
     return 0;
   if ((*object)->magic != magic)
@@ -1710,7 +1712,7 @@ __pthread_cond_timedwait (pthread_cond_t
     __pthread_mutex_init (mutex, NULL);
   themutex = mutex;
 
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   if (!verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC))
     return EINVAL;
@@ -1756,11 +1758,11 @@ __pthread_cond_wait (pthread_cond_t *con
 {
 // see cond_timedwait for notes
   int rv;
-  pthread_mutex_t *themutex = mutex;
+  pthread_mutex_t *themutex;
   if (*mutex == PTHREAD_MUTEX_INITIALIZER)
     __pthread_mutex_init (mutex, NULL);
   themutex = mutex;
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   if (!verifyable_object_isvalid (cond, PTHREAD_COND_MAGIC))
     return EINVAL;
@@ -1907,11 +1909,11 @@ __pthread_mutex_init (pthread_mutex_t *m
   if (attr && !verifyable_object_isvalid (attr, PTHREAD_MUTEXATTR_MAGIC))
     return EINVAL;
 
-  if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) == -1)
     return EBUSY;
 
   *mutex = new pthread_mutex (attr ? (*attr) : NULL);
-  if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != -1)
     {
       delete (*mutex);
       *mutex = NULL;
@@ -1927,7 +1929,7 @@ __pthread_mutex_getprioceiling (const pt
   pthread_mutex_t *themutex=(pthread_mutex_t *) mutex;
   if (*mutex == PTHREAD_MUTEX_INITIALIZER)
     __pthread_mutex_init ((pthread_mutex_t *) mutex, NULL);
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   /*We don't define _POSIX_THREAD_PRIO_PROTECT because we do't currently support
    *mutex priorities.
@@ -1944,13 +1946,19 @@ int
 __pthread_mutex_lock (pthread_mutex_t *mutex)
 {
   pthread_mutex_t *themutex = mutex;
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
-    return EINVAL;
-  if (*mutex == PTHREAD_MUTEX_INITIALIZER)
+  switch (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
     {
-      int rv = __pthread_mutex_init (mutex, NULL);
-      if (rv)
-	return rv;
+    case 0:
+      return EINVAL;
+      break;
+    case 1:
+      if (*mutex == PTHREAD_MUTEX_INITIALIZER)
+        {
+          int rv = __pthread_mutex_init (mutex, NULL);
+          if (rv)
+	    return rv;
+        }
+      break;
     }
   (*themutex)->Lock ();
   return 0;
@@ -1962,7 +1970,7 @@ __pthread_mutex_trylock (pthread_mutex_t
   pthread_mutex_t *themutex = mutex;
   if (*mutex == PTHREAD_MUTEX_INITIALIZER)
     __pthread_mutex_init (mutex, NULL);
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   if ((*themutex)->TryLock ())
     return EBUSY;
@@ -1974,7 +1982,7 @@ __pthread_mutex_unlock (pthread_mutex_t 
 {
   if (*mutex == PTHREAD_MUTEX_INITIALIZER)
     __pthread_mutex_init (mutex, NULL);
-  if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   (*mutex)->UnLock ();
   return 0;
@@ -1985,7 +1993,7 @@ __pthread_mutex_destroy (pthread_mutex_t
 {
   if (check_valid_pointer (mutex) && (*mutex == PTHREAD_MUTEX_INITIALIZER))
     return 0;
-  if (!verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (mutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
 
   /*reading a word is atomic */
@@ -2004,7 +2012,7 @@ __pthread_mutex_setprioceiling (pthread_
   pthread_mutex_t *themutex = mutex;
   if (*mutex == PTHREAD_MUTEX_INITIALIZER)
     __pthread_mutex_init (mutex, NULL);
-  if (!verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC))
+  if (verifyable_object_isvalid (themutex, PTHREAD_MUTEX_MAGIC) != -1)
     return EINVAL;
   return ENOSYS;
 }
