[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Trouble joining with threads from C
From: |
Ludovic Courtès |
Subject: |
Re: Trouble joining with threads from C |
Date: |
Wed, 13 Apr 2011 23:25:51 +0200 |
User-agent: |
Gnus/5.110015 (No Gnus v0.15) Emacs/23.3 (gnu/linux) |
address@hidden (Ludovic Courtès) writes:
> Hi!
Howdy!
> Andy Wingo <address@hidden> writes:
>
>> No, the issue is elsewhere, that the thread-exit handlers were not being
>> called
>
> I just tried with 60582b7c2a495957012f9a20cd8691dc6307a850 and
> ‘on_thread_exit’ /is/ called after something like
> ‘(call-with-new-thread (lambda () #t))’.
The thread-exit handlers were not being called *for threads launched by
scm_spawn_thread*.
The patch below (against 60582b7c2a495957012f9a20cd8691dc6307a850) fixes it.
Now to see what's happened since then...
Ludo'.
diff --git a/libguile/threads.c b/libguile/threads.c
index e7347ad..1c90517 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -980,7 +980,11 @@ spawn_thread (void *d)
{
spawn_data *data = (spawn_data *)d;
scm_i_pthread_detach (scm_i_pthread_self ());
+
+ scm_i_pthread_cleanup_push (scm_leave_guile_cleanup, NULL);
scm_i_with_guile_and_parent (really_spawn, d, data->parent);
+ scm_i_pthread_cleanup_pop (1);
+
return NULL;
}
diff --git a/test-suite/standalone/Makefile.am
b/test-suite/standalone/Makefile.am
index b21edd2..b1f16f3 100644
--- a/test-suite/standalone/Makefile.am
+++ b/test-suite/standalone/Makefile.am
@@ -198,6 +198,11 @@ test_scm_with_guile_LDADD = $(LIBGUILE_LDADD)
check_PROGRAMS += test-scm-with-guile
TESTS += test-scm-with-guile
+test_scm_spawn_thread_CFLAGS = ${test_cflags}
+test_scm_spawn_thread_LDADD = $(LIBGUILE_LDADD)
+check_PROGRAMS += test-scm-spawn-thread
+TESTS += test-scm-spawn-thread
+
else
EXTRA_DIST += test-with-guile-module.c test-scm-with-guile.c
diff --git a/test-suite/standalone/test-scm-spawn-thread.c
b/test-suite/standalone/test-scm-spawn-thread.c
new file mode 100644
index 0000000..b632ab0
--- /dev/null
+++ b/test-suite/standalone/test-scm-spawn-thread.c
@@ -0,0 +1,62 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+/* Test whether a thread created with `scm_spawn_thread' can be joined.
+ See <http://thread.gmane.org/gmane.lisp.guile.devel/11804> for the
+ original report. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libguile.h>
+
+#include <time.h>
+#include <stdlib.h>
+
+static SCM
+thread_main (void *data)
+{
+ return SCM_BOOL_T;
+}
+
+static SCM
+thread_handler (void *data, SCM key, SCM args)
+{
+ return SCM_BOOL_T;
+}
+
+static void *
+inner_main (void *data)
+{
+ SCM thread, timeout;
+
+ thread = scm_spawn_thread (thread_main, 0, thread_handler, 0);
+ timeout = scm_from_unsigned_integer (time (NULL) + 10);
+ return (void *) scm_join_thread_timed (thread, timeout, SCM_BOOL_F);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ SCM result;
+
+ result = PTR2SCM (scm_with_guile (inner_main, 0));
+ return scm_is_true (result) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
- Re: Trouble joining with threads from C,
Ludovic Courtès <=