summaryrefslogtreecommitdiff
path: root/libguile/dynl.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2017-11-22 16:46:11 +0100
committerLudovic Courtès <ludo@gnu.org>2017-11-22 16:46:11 +0100
commit48d42553ef5a9c2240bc2296d1b38dbfd5fca1ac (patch)
tree02051a15a168d56c887c92dc454d11b48ba970bb /libguile/dynl.c
parentbb5d316b161add31612e6afe41e5a6ea5851c277 (diff)
downloadguile-48d42553ef5a9c2240bc2296d1b38dbfd5fca1ac.tar.gz
ltdl wrappers now use a recursive mutex.
Fixes <https://bugs.gnu.org/29275>. Reported by noxdafox <noxdafox@gmail.com>. * libguile/dynl.c (scm_init_dynamic_linking): Add call to 'scm_i_pthread_mutex_init'.
Diffstat (limited to 'libguile/dynl.c')
-rw-r--r--libguile/dynl.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/libguile/dynl.c b/libguile/dynl.c
index b9497b1b3..2a25e5d2e 100644
--- a/libguile/dynl.c
+++ b/libguile/dynl.c
@@ -1,7 +1,7 @@
/* dynl.c - dynamic linking
*
* Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002,
- * 2003, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ * 2003, 2008, 2009, 2010, 2011, 2017 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
@@ -66,10 +66,9 @@ maybe_drag_in_eprintf ()
#include <ltdl.h>
-/*
- From the libtool manual: "Note that libltdl is not threadsafe,
- i.e. a multithreaded application has to use a mutex for libltdl.".
-*/
+/* From the libtool manual: "Note that libltdl is not threadsafe,
+ i.e. a multithreaded application has to use a mutex for libltdl.".
+ Note: We initialize it as a recursive mutex below. */
static scm_i_pthread_mutex_t ltdl_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
/* LT_PATH_SEP-separated extension library search path, searched last */
@@ -401,6 +400,13 @@ scm_init_dynamic_linking ()
{
scm_tc16_dynamic_obj = scm_make_smob_type ("dynamic-object", 0);
scm_set_smob_print (scm_tc16_dynamic_obj, dynl_obj_print);
+
+ /* Make LTDL_LOCK recursive so that a pre-unwind handler can still use
+ 'dynamic-link', as is the case at the REPL. See
+ <https://bugs.gnu.org/29275>. */
+ scm_i_pthread_mutex_init (&ltdl_lock,
+ scm_i_pthread_mutexattr_recursive);
+
sysdep_dynl_init ();
#include "libguile/dynl.x"
}