summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2000-11-30 10:26:44 +0000
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2000-11-30 10:26:44 +0000
commit21e8f468cf4a1ebad24b286249ae1983b672af47 (patch)
tree6aaac0ef37a5997b2d2c23e25d785a9586d0cf2a
parent818febc097198ab0b01cc87e485d2b1a36e70ee1 (diff)
downloadguile-21e8f468cf4a1ebad24b286249ae1983b672af47.tar.gz
* coop-threads.c: Don't join finished threads. Thanks to Julian Satchell.
* coop.c: Removed old non-working code.
-rw-r--r--THANKS9
-rw-r--r--libguile/ChangeLog10
-rw-r--r--libguile/coop-threads.c19
-rw-r--r--libguile/coop.c11
4 files changed, 32 insertions, 17 deletions
diff --git a/THANKS b/THANKS
index 6f00ba104..62c8b1030 100644
--- a/THANKS
+++ b/THANKS
@@ -1,14 +1,14 @@
The Guile maintainer committee consists of
Jim Blandy
+ Mikael Djurfeldt
Maciej Stachowiak
Marius Vollmer
- Mikael Djurfeldt
Contributors since the last release:
- Greg Harvey
Jost Boekemeier
+ Greg Harvey
For fixes or providing information which led to a fix:
@@ -19,11 +19,12 @@ For fixes or providing information which led to a fix:
Brad Knotwell
Matthias Köppe
Bruce Korb
+ Ralf Mattes
Shuji Narazaki
Nicolas Neuss
Han-Wen Nienhuys
David Pirotte
- William Webber
+ Julian Satchell
Dale P. Smith
- Ralf Mattes
Jacques A. Vidrine.
+ William Webber
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index 34c76e823..22c712fa4 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,3 +1,13 @@
+2000-11-30 Dirk Herrmann <D.Herrmann@tu-bs.de>
+
+ Thanks to Julian Satchell for the bug report:
+
+ * coop-threads.c (scm_join_thread): Check whether a thread is
+ finished before trying to join it.
+
+ * coop.c (coop_aborthelp, coop_join): When a thread finishes, its
+ stack base is not set to NULL any more.
+
2000-11-28 Dirk Herrmann <D.Herrmann@tu-bs.de>
* strop.c (scm_i_index): Removed outdated comment.
diff --git a/libguile/coop-threads.c b/libguile/coop-threads.c
index 8214584e8..60f07f64e 100644
--- a/libguile/coop-threads.c
+++ b/libguile/coop-threads.c
@@ -377,11 +377,24 @@ scm_spawn_thread (scm_catch_body_t body, void *body_data,
}
SCM
-scm_join_thread (SCM t)
+scm_join_thread (SCM thread)
#define FUNC_NAME s_join_thread
{
- SCM_VALIDATE_THREAD (1,t);
- coop_join (SCM_THREAD_DATA (t));
+ coop_t *thread_data;
+ SCM_VALIDATE_THREAD (1, thread);
+ /* Dirk:FIXME:: SCM_THREAD_DATA is a handle for a thread. It may be that a
+ * certain thread implementation uses a value of 0 as a valid thread handle.
+ * With the following code, this thread would always be considered finished.
+ */
+ /* Dirk:FIXME:: With preemptive threading, a thread may finish immediately
+ * after SCM_THREAD_DATA is read. Thus, it must be guaranteed that the
+ * handle remains valid until the thread-object is garbage collected, or
+ * a mutex has to be used for reading and modifying SCM_THREAD_DATA.
+ */
+ thread_data = SCM_THREAD_DATA (thread);
+ if (thread_data)
+ /* The thread is still alive */
+ coop_join (thread_data);
return SCM_BOOL_T;
}
#undef FUNC_NAME
diff --git a/libguile/coop.c b/libguile/coop.c
index a79c416f0..339acc95e 100644
--- a/libguile/coop.c
+++ b/libguile/coop.c
@@ -40,7 +40,7 @@
* If you do not wish that, delete this exception notice. */
-/* $Id: coop.c,v 1.25 2000-04-21 14:16:30 mdj Exp $ */
+/* $Id: coop.c,v 1.26 2000-11-30 10:26:44 dirk Exp $ */
/* Cooperative thread library, based on QuickThreads */
@@ -698,11 +698,6 @@ coop_aborthelp (qt_t *sp, void *old, void *null)
{
coop_t *oldthread = (coop_t *) old;
-#if 0
- /* Marking old->base NULL indicates that this thread is dead */
- oldthread->base = NULL;
-#endif
-
if (oldthread->specific)
free (oldthread->specific);
#ifndef GUILE_PTHREAD_COMPAT
@@ -721,10 +716,6 @@ coop_join(coop_t *t)
{
coop_t *old, *newthread;
- /* Check if t is already finished */
- if (t->base == NULL)
- return;
-
/* Create a join list if necessary */
if (t->joining == NULL)
{