summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--create.c54
-rw-r--r--exit.c31
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);
}