Changes needed by NeXT (the only platform that seems to use this).
diff --git a/Python/thread_cthread.h b/Python/thread_cthread.h
index 1a1a860..79bcc0f 100644
--- a/Python/thread_cthread.h
+++ b/Python/thread_cthread.h
@@ -22,7 +22,7 @@
 
 ******************************************************************/
 
-#include <cthreads.h>
+#include <mach/cthreads.h>
 
 
 /*
@@ -44,7 +44,10 @@
 	dprintf(("start_new_thread called\n"));
 	if (!initialized)
 		init_thread();
-	(void) cthread_fork(func, arg);
+	/* looks like solaris detaches the thread to never rejoin
+	 * so well do it here
+	 */
+	cthread_detach(cthread_fork((cthread_fn_t) func, arg));
 	return success < 0 ? 0 : 1;
 }
 
@@ -52,6 +55,7 @@
 {
 	if (!initialized)
 		init_thread();
+	return (long) cthread_self();
 }
 
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
@@ -84,6 +88,10 @@
 			_exit(status);
 		else
 			exit(status);
+	if (no_cleanup)
+		_exit(status);
+	else
+		exit(status);
 }
 
 void exit_prog _P1(status, int status)
@@ -102,11 +110,18 @@
  */
 type_lock allocate_lock _P0()
 {
+	mutex_t lock;
 
 	dprintf(("allocate_lock called\n"));
 	if (!initialized)
 		init_thread();
 
+	lock = mutex_alloc();
+	if (mutex_init(lock)) {
+		perror("mutex_init");
+		free((void *) lock);
+		lock = 0;
+	}
 	dprintf(("allocate_lock() -> %lx\n", (long)lock));
 	return (type_lock) lock;
 }
@@ -114,13 +129,20 @@
 void free_lock _P1(lock, type_lock lock)
 {
 	dprintf(("free_lock(%lx) called\n", (long)lock));
+	mutex_free(lock);
 }
 
 int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag)
 {
-	int success;
+	int success = FALSE;
 
 	dprintf(("acquire_lock(%lx, %d) called\n", (long)lock, waitflag));
+	if (waitflag) { 	/* blocking */
+		mutex_lock(lock);
+		success = TRUE;
+	} else {		/* non blocking */
+		success = mutex_try_lock(lock);
+	}
 	dprintf(("acquire_lock(%lx, %d) -> %d\n", (long)lock, waitflag, success));
 	return success;
 }
@@ -128,13 +150,26 @@
 void release_lock _P1(lock, type_lock lock)
 {
 	dprintf(("release_lock(%lx) called\n", (long)lock));
+	mutex_unlock((mutex_t )lock);
 }
 
 /*
  * Semaphore support.
+ *
+ * This implementation is ripped directly from the pthreads implementation.
+ * Which is to say that it is 100% non-functional at this time.
+ *
+ * Assuming the page is still up, documentation can be found at:
+ *
+ * http://www.doc.ic.ac.uk/~mac/manuals/solaris-manual-pages/solaris/usr/man/man2/_lwp_sema_wait.2.html
+ *
+ * Looking at the man page, it seems that one could easily implement a
+ * semaphore using a condition.
+ *
  */
 type_sema allocate_sema _P1(value, int value)
 {
+	char *sema = 0;
 	dprintf(("allocate_sema called\n"));
 	if (!initialized)
 		init_thread();