1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 14:50:19 +02:00

* coop-threads.c: Don't join finished threads. Thanks to Julian Satchell.

* coop.c: Removed old non-working code.
This commit is contained in:
Dirk Herrmann 2000-11-30 10:26:44 +00:00
parent 818febc097
commit 21e8f468cf
4 changed files with 32 additions and 17 deletions

9
THANKS
View file

@ -1,14 +1,14 @@
The Guile maintainer committee consists of The Guile maintainer committee consists of
Jim Blandy Jim Blandy
Mikael Djurfeldt
Maciej Stachowiak Maciej Stachowiak
Marius Vollmer Marius Vollmer
Mikael Djurfeldt
Contributors since the last release: Contributors since the last release:
Greg Harvey
Jost Boekemeier Jost Boekemeier
Greg Harvey
For fixes or providing information which led to a fix: 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 Brad Knotwell
Matthias Köppe Matthias Köppe
Bruce Korb Bruce Korb
Ralf Mattes
Shuji Narazaki Shuji Narazaki
Nicolas Neuss Nicolas Neuss
Han-Wen Nienhuys Han-Wen Nienhuys
David Pirotte David Pirotte
William Webber Julian Satchell
Dale P. Smith Dale P. Smith
Ralf Mattes
Jacques A. Vidrine. Jacques A. Vidrine.
William Webber

View file

@ -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> 2000-11-28 Dirk Herrmann <D.Herrmann@tu-bs.de>
* strop.c (scm_i_index): Removed outdated comment. * strop.c (scm_i_index): Removed outdated comment.

View file

@ -377,11 +377,24 @@ scm_spawn_thread (scm_catch_body_t body, void *body_data,
} }
SCM SCM
scm_join_thread (SCM t) scm_join_thread (SCM thread)
#define FUNC_NAME s_join_thread #define FUNC_NAME s_join_thread
{ {
SCM_VALIDATE_THREAD (1,t); coop_t *thread_data;
coop_join (SCM_THREAD_DATA (t)); 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; return SCM_BOOL_T;
} }
#undef FUNC_NAME #undef FUNC_NAME

View file

@ -40,7 +40,7 @@
* If you do not wish that, delete this exception notice. */ * 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 */ /* 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; 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) if (oldthread->specific)
free (oldthread->specific); free (oldthread->specific);
#ifndef GUILE_PTHREAD_COMPAT #ifndef GUILE_PTHREAD_COMPAT
@ -721,10 +716,6 @@ coop_join(coop_t *t)
{ {
coop_t *old, *newthread; coop_t *old, *newthread;
/* Check if t is already finished */
if (t->base == NULL)
return;
/* Create a join list if necessary */ /* Create a join list if necessary */
if (t->joining == NULL) if (t->joining == NULL)
{ {