Tim's changes; removed some remaining non-functional ifdefs
diff --git a/Python/thread_cthread.h b/Python/thread_cthread.h
index 7710bdf..c56bf0d 100644
--- a/Python/thread_cthread.h
+++ b/Python/thread_cthread.h
@@ -38,10 +38,6 @@
  */
 int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
 {
-#if defined(SGI_THREADS) && defined(USE_DL)
-	long addr, size;
-	static int local_initialized = 0;
-#endif /* SGI_THREADS and USE_DL */
 	int success = 0;	/* init not needed when SOLARIS_THREADS and */
 				/* C_THREADS implemented properly */
 
diff --git a/Python/thread_lwp.h b/Python/thread_lwp.h
index 0462cbf..b28e602 100644
--- a/Python/thread_lwp.h
+++ b/Python/thread_lwp.h
@@ -52,10 +52,6 @@
 int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
 {
 	thread_t tid;
-#if defined(SGI_THREADS) && defined(USE_DL)
-	long addr, size;
-	static int local_initialized = 0;
-#endif /* SGI_THREADS and USE_DL */
 	int success = 0;	/* init not needed when SOLARIS_THREADS and */
 				/* C_THREADS implemented properly */
 
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index b98c12f..1d539ee 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -29,7 +29,7 @@
 #ifdef FLORIDA_HACKS
 /* Hacks for Florida State Posix threads implementation */
 #undef _POSIX_THREADS
-#include "/ufs/guido/src/python/Contrib/pthreads/pthreads/pthread.h"
+#include "/ufs/guido/src/python/Contrib/pthreads/src/pthread.h"
 #define pthread_attr_default ((pthread_attr_t *)0)
 #define pthread_mutexattr_default ((pthread_mutexattr_t *)0)
 #define pthread_condattr_default ((pthread_condattr_t *)0)
@@ -40,26 +40,30 @@
 #endif /* FLORIDA_HACKS */
 #include <stdlib.h>
 
-/* A pthread mutex isn't sufficient to model the Python lock type (at
- * least not the way KSR did 'em -- haven't dug thru the docs to verify),
- * because a thread that locks a mutex can't then do a pthread_mutex_lock
- * on it (to wait for another thread to unlock it).
- * In any case, pthread mutexes are designed for serializing threads over
- * short pieces of code, so wouldn't be an appropriate implementation of
+/* A pthread mutex isn't sufficient to model the Python lock type
+ * because, according to Draft 5 of the docs (P1003.4a/D5), both of the
+ * following are undefined:
+ *  -> a thread tries to lock a mutex it already has locked
+ *  -> a thread tries to unlock a mutex locked by a different thread
+ * pthread mutexes are designed for serializing threads over short pieces
+ * of code anyway, so wouldn't be an appropriate implementation of
  * Python's locks regardless.
- * The pthread_lock struct below implements a Python lock as a pthread
- * mutex and a <condition, mutex> pair.  In general, if the mutex can be
- * be acquired instantly, it is, else the pair is used to block the
- * thread until the mutex is released.  7 May 1994  tim@ksr.com
+ *
+ * The pthread_lock struct implements a Python lock as a "locked?" bit
+ * and a <condition, mutex> pair.  In general, if the bit can be acquired
+ * instantly, it is, else the pair is used to block the thread until the
+ * bit is cleared.     9 May 1994 tim@ksr.com
  */
+
 typedef struct {
-	/* the lock */
-	pthread_mutex_t  mutex;
-	/* a <cond, mutex> pair to handle an acquire of a locked mutex */
-	pthread_cond_t   cond;
-	pthread_mutex_t  cmutex;
+	char             locked; /* 0=unlocked, 1=locked */
+	/* a <cond, mutex> pair to handle an acquire of a locked lock */
+	pthread_cond_t   lock_released;
+	pthread_mutex_t  mut;
 } pthread_lock;
 
+#define CHECK_STATUS(name)  if (status < 0) { perror(name); error=1; }
+
 /*
  * Initialization.
  */
@@ -70,6 +74,8 @@
 /*
  * Thread support.
  */
+
+
 int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
 {
 #if defined(SGI_THREADS) && defined(USE_DL)
@@ -135,30 +141,25 @@
 type_lock allocate_lock _P0()
 {
 	pthread_lock *lock;
+	int status, error = 0;
 
 	dprintf(("allocate_lock called\n"));
 	if (!initialized)
 		init_thread();
 
 	lock = (pthread_lock *) malloc(sizeof(pthread_lock));
-	{
-		int err = 0;
-		if ( pthread_mutex_init(&lock->mutex,
-				       pthread_mutexattr_default) ) {
-			perror("pthread_mutex_init");
-			err = 1;
-		}
-		if ( pthread_cond_init(&lock->cond,
-				      pthread_condattr_default) ) {
-			perror("pthread_cond_init");
-			err = 1;
-		} 
-		if ( pthread_mutex_init(&lock->cmutex,
-					pthread_mutexattr_default)) {
-			perror("pthread_mutex_init");
-			err = 1;
-		}
-		if (err) {
+	if (lock) {
+		lock->locked = 0;
+
+		status = pthread_mutex_init(&lock->mut,
+					    pthread_mutexattr_default);
+		CHECK_STATUS("pthread_mutex_init");
+
+		status = pthread_cond_init(&lock->lock_released,
+					   pthread_condattr_default);
+		CHECK_STATUS("pthread_cond_init");
+
+		if (error) {
 			free((void *)lock);
 			lock = 0;
 		}
@@ -170,80 +171,82 @@
 
 void free_lock _P1(lock, type_lock lock)
 {
+	pthread_lock *thelock = (pthread_lock *)lock;
+	int status, error = 0;
+
 	dprintf(("free_lock(%lx) called\n", (long)lock));
-	if ( pthread_mutex_destroy(&((pthread_lock *)lock)->mutex) )
-		perror("pthread_mutex_destroy");
-	if ( pthread_cond_destroy(&((pthread_lock *)lock)->cond) )
-		perror("pthread_cond_destroy");
-	if ( pthread_mutex_destroy(&((pthread_lock *)lock)->cmutex) )
-		perror("pthread_mutex_destroy");
-	free((void *)lock);
+
+	status = pthread_mutex_destroy( &thelock->mut );
+	CHECK_STATUS("pthread_mutex_destroy");
+
+	status = pthread_cond_destroy( &thelock->lock_released );
+	CHECK_STATUS("pthread_cond_destroy");
+
+	free((void *)thelock);
 }
 
 int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag)
 {
 	int success;
+	pthread_lock *thelock = (pthread_lock *)lock;
+	int status, error = 0;
 
 	dprintf(("acquire_lock(%lx, %d) called\n", (long)lock, waitflag));
-	{
-		pthread_lock *thelock = (pthread_lock *)lock;
-		success = TRYLOCK_OFFSET +
-			pthread_mutex_trylock( &thelock->mutex );
-		if (success < 0) {
-			perror("pthread_mutex_trylock [1]");
-			success = 0;
-		} else if ( success == 0 && waitflag ) {
-			/* continue trying until we get the lock */
 
-			/* cmutex must be locked by me -- part of the condition
-			 * protocol */
-			if ( pthread_mutex_lock( &thelock->cmutex ) )
-				perror("pthread_mutex_lock");
-			while ( 0 == (success = TRYLOCK_OFFSET +
-				      pthread_mutex_trylock(&thelock->mutex)) ) {
-				if ( pthread_cond_wait(&thelock->cond,
-						       &thelock->cmutex) )
-					perror("pthread_cond_wait");
-			}
-			if (success < 0)
-				perror("pthread_mutex_trylock [2]");
-			/* now ->mutex & ->cmutex are both locked by me */
-			if ( pthread_mutex_unlock( &thelock->cmutex ) )
-				perror("pthread_mutex_unlock");
+	status = pthread_mutex_lock( &thelock->mut );
+	CHECK_STATUS("pthread_mutex_lock[1]");
+	success = thelock->locked == 0;
+	if (success) thelock->locked = 1;
+	status = pthread_mutex_unlock( &thelock->mut );
+	CHECK_STATUS("pthread_mutex_unlock[1]");
+
+	if ( !success && waitflag ) {
+		/* continue trying until we get the lock */
+
+		/* mut must be locked by me -- part of the condition
+		 * protocol */
+		status = pthread_mutex_lock( &thelock->mut );
+		CHECK_STATUS("pthread_mutex_lock[2]");
+		while ( thelock->locked ) {
+			status = pthread_cond_wait(&thelock->lock_released,
+						   &thelock->mut);
+			CHECK_STATUS("pthread_cond_wait");
 		}
+		thelock->locked = 1;
+		status = pthread_mutex_unlock( &thelock->mut );
+		CHECK_STATUS("pthread_mutex_unlock[2]");
+		success = 1;
 	}
+	if (error) success = 0;
 	dprintf(("acquire_lock(%lx, %d) -> %d\n", (long)lock, waitflag, success));
 	return success;
 }
 
 void release_lock _P1(lock, type_lock lock)
 {
+	pthread_lock *thelock = (pthread_lock *)lock;
+	int status, error = 0;
+
 	dprintf(("release_lock(%lx) called\n", (long)lock));
-	{
-		pthread_lock *thelock = (pthread_lock *)lock;
 
-		/* tricky:  if the release & signal occur between the
-		 *    pthread_mutex_trylock(&thelock->mutex))
-		 * and pthread_cond_wait during the acquire, the acquire
-		 * will miss the signal it's waiting for; locking cmutex
-		 * around the release prevents that
-		 */
-		if (pthread_mutex_lock( &thelock->cmutex ))
-			perror("pthread_mutex_lock");
-		if (pthread_mutex_unlock( &thelock->mutex ))
-			perror("pthread_mutex_unlock");
-		if (pthread_mutex_unlock( &thelock->cmutex ))
-			perror("pthread_mutex_unlock");
+	status = pthread_mutex_lock( &thelock->mut );
+	CHECK_STATUS("pthread_mutex_lock[3]");
 
-		/* wake up someone (anyone, if any) waiting on the lock */
-		if (pthread_cond_signal( &thelock->cond ))
-			perror("pthread_cond_signal");
-	}
+	thelock->locked = 0;
+
+	status = pthread_mutex_unlock( &thelock->mut );
+	CHECK_STATUS("pthread_mutex_unlock[3]");
+
+	/* wake up someone (anyone, if any) waiting on the lock */
+	status = pthread_cond_signal( &thelock->lock_released );
+	CHECK_STATUS("pthread_cond_signal");
 }
 
 /*
  * Semaphore support.
  */
+/* NOTE: 100% non-functional at this time - tim */
+
 type_sema allocate_sema _P1(value, int value)
 {
 	char *sema = 0;