From c9d01733e79f70581d2e6616332ac47677a6a2bd Mon Sep 17 00:00:00 2001
From: rpj <rpj>
Date: Sun, 26 Jul 1998 03:32:18 +0000
Subject: Sun Jul 26 13:06:12 1998  Ross Johnson 
 <rpj@ixobrychus.canberra.edu.au>

	* exit.c (_pthread_vacuum): Add thread entry deletion code
	moved from _pthread_start_call(). See next item.
	(pthread_exit): Remove longjmp(). Add mutex lock around thread table
	manipulation code. This routine now calls _enthreadex().

	* create.c (_pthread_start_call): Remove setjmp() call and move
	cleanup code out. Call pthread_exit(NULL) to terminate the thread.
---
 ChangeLog | 10 ++++++++++
 create.c  | 54 +++---------------------------------------------------
 exit.c    | 31 +++++++++++++++++++++++++------
 3 files changed, 38 insertions(+), 57 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6857a62..2e9a57c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sun Jul 26 13:06:12 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
+
+	* exit.c (_pthread_vacuum): Add thread entry deletion code
+	moved from _pthread_start_call(). See next item.
+	(pthread_exit): Remove longjmp(). Add mutex lock around thread table
+	manipulation code. This routine now calls _enthreadex().
+
+	* create.c (_pthread_start_call): Remove setjmp() call and move
+	cleanup code out. Call pthread_exit(NULL) to terminate the thread.
+
 1998-07-26  Ben Elliston  <bje@cygnus.com>
 
 	* tsd.c (pthread_getspecific): Update comments.
diff --git a/create.c b/create.c
index 4639b21..91b81a4 100644
--- a/create.c
+++ b/create.c
@@ -38,58 +38,10 @@ _pthread_start_call(void * us_arg)
   func = us->call.routine;
   arg = us->call.arg;
 
-  /* FIXME: Should we be using sigsetjmp() here instead. */
-  from = setjmp(us->call.env);
+  ret = (*func)(arg);
 
-  if (from == 0)
-    {
-      /* Normal return from setjmp(). */
-      ret = (*func)(arg);
-
-      _pthread_vacuum();
-
-      /* Remove the thread entry on exit only if pthread_detach()
-	 was called and there are no waiting joins. */
-
-      /* CRITICAL SECTION */
-      pthread_mutex_lock(&_pthread_table_mutex);
-
-      if (us->detach == TRUE
-	  && us->join_count == 0)
-	{
-	  _pthread_delete_thread_entry(us);
-	}
-
-      pthread_mutex_lock(&_pthread_table_mutex);
-      /* END CRITICAL SECTION */
-    }
-  else
-    {
-      /* longjmp() teleported us here.
-	 func() called pthread_exit() which called longjmp(). */
-      _pthread_vacuum();
-
-      /* Remove the thread entry on exit only if pthread_detach()
-	 was called and there are no waiting joins. */
-
-      /* CRITICAL SECTION */
-      pthread_mutex_lock(&_pthread_table_mutex);
-
-      if (us->detach == TRUE
-	  && us->join_count == 0)
-	{
-	  _pthread_delete_thread_entry(us);
-	}
-
-      pthread_mutex_lock(&_pthread_table_mutex);
-      /* END CRITICAL SECTION */
-
-      ret = 0;
-    }
-
-  /* From Win32's point of view we always return naturally from our
-     start routine and so it should clean up it's own thread residue. */
-  return ret;
+  pthread_exit(NULL);
+  /* Never Reached */
 }
 
 int
diff --git a/exit.c b/exit.c
index b9d5a2d..25fc678 100644
--- a/exit.c
+++ b/exit.c
@@ -28,6 +28,21 @@ _pthread_vacuum(void)
 
   _pthread_handler_pop_all(_PTHREAD_FORKCHILD_STACK,
 			   _PTHREAD_HANDLER_NOEXECUTE);
+
+  /* CRITICAL SECTION */
+  pthread_mutex_lock(&_pthread_table_mutex);
+
+  /* Remove the thread entry on exit only if pthread_detach()
+     was called and there are no waiting joins. */
+
+  if (us->detach == TRUE
+      && us->join_count == 0)
+    {
+      _pthread_delete_thread_entry(us);
+    }
+
+  pthread_mutex_lock(&_pthread_table_mutex);
+  /* END CRITICAL SECTION */
 }
 
 void
@@ -35,13 +50,17 @@ pthread_exit(void * value)
 {
   _pthread_threads_thread_t * us = _PTHREAD_THIS;
 
+  /* CRITICAL SECTION */
+  pthread_mutex_lock(&_pthread_table_mutex);
+
   /* Copy value into the thread entry so it can be given
      to any joining threads. */
-  if (us->joinvalueptr != NULL)
-    {
-      us->joinvalueptr = value;
-    }
+  us->joinvalueptr = value;
+
+  pthread_mutex_lock(&_pthread_table_mutex);
+  /* END CRITICAL SECTION */
+
+  _pthread_vacuum();
 
-  /* Teleport back to _pthread_start_call() to cleanup and exit. */
-  longjmp(us->call.env, 1);
+  _endthreadex(0);
 }
-- 
cgit v1.2.3