diff options
author | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-11-30 10:26:44 +0000 |
---|---|---|
committer | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-11-30 10:26:44 +0000 |
commit | 21e8f468cf4a1ebad24b286249ae1983b672af47 (patch) | |
tree | 6aaac0ef37a5997b2d2c23e25d785a9586d0cf2a | |
parent | 818febc097198ab0b01cc87e485d2b1a36e70ee1 (diff) | |
download | guile-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-- | THANKS | 9 | ||||
-rw-r--r-- | libguile/ChangeLog | 10 | ||||
-rw-r--r-- | libguile/coop-threads.c | 19 | ||||
-rw-r--r-- | libguile/coop.c | 11 |
4 files changed, 32 insertions, 17 deletions
@@ -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) { |