From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: ludo@gnu.org (Ludovic =?iso-8859-1?Q?Court=E8s?=) Newsgroups: gmane.lisp.guile.devel Subject: Re: Trouble joining with threads from C Date: Wed, 13 Apr 2011 23:25:51 +0200 Message-ID: <87ipuhzvvk.fsf@gnu.org> References: <87y64rzd5p.fsf@netris.org> <8762rswzzf.fsf@netris.org> <87vczdqtdx.fsf@gnu.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: dough.gmane.org 1302729978 23733 80.91.229.12 (13 Apr 2011 21:26:18 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 13 Apr 2011 21:26:18 +0000 (UTC) To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Wed Apr 13 23:26:14 2011 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1QA7Zl-0007A2-OE for guile-devel@m.gmane.org; Wed, 13 Apr 2011 23:26:14 +0200 Original-Received: from localhost ([::1]:33688 helo=lists2.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QA7Zl-0005lD-91 for guile-devel@m.gmane.org; Wed, 13 Apr 2011 17:26:13 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:51778) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QA7Zi-0005ku-JC for guile-devel@gnu.org; Wed, 13 Apr 2011 17:26:11 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QA7Zh-0004V5-Aa for guile-devel@gnu.org; Wed, 13 Apr 2011 17:26:10 -0400 Original-Received: from lo.gmane.org ([80.91.229.12]:60266) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QA7Zh-0004Ug-0n for guile-devel@gnu.org; Wed, 13 Apr 2011 17:26:09 -0400 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1QA7Zf-00074F-Fs for guile-devel@gnu.org; Wed, 13 Apr 2011 23:26:07 +0200 Original-Received: from reverse-83.fdn.fr ([80.67.176.83]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 13 Apr 2011 23:26:07 +0200 Original-Received: from ludo by reverse-83.fdn.fr with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 13 Apr 2011 23:26:07 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 136 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: reverse-83.fdn.fr X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 24 Germinal an 219 de la =?iso-8859-1?Q?R=E9volution?= X-PGP-Key-ID: 0xEA52ECF4 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 83C4 F8E5 10A3 3B4C 5BEA D15D 77DD 95E2 EA52 ECF4 X-OS: x86_64-unknown-linux-gnu User-Agent: Gnus/5.110015 (No Gnus v0.15) Emacs/23.3 (gnu/linux) Cancel-Lock: sha1:sSKMscvWsR+UrS5fstNSIrL6T3Y= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 80.91.229.12 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:12252 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ludo@gnu.org (Ludovic Courtès) writes: > Hi! Howdy! > Andy Wingo 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'. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=spawn-thread-fix.patch Content-Description: the patch 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 for the + original report. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include +#include + +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; +} --=-=-=--