aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@igalia.com>2015-03-11 13:07:53 +0100
committerAndy Wingo <wingo@igalia.com>2015-03-11 13:07:53 +0100
commit92fab5a61707cd3b487219ea9efa0e410cde3bc4 (patch)
tree809ea0e4bc4e5c49afd066aea5cbf5372b72f055
parente03f96456f2313854efff2377134af6cbda96af8 (diff)
downloadgdb-92fab5a61707cd3b487219ea9efa0e410cde3bc4.zip
gdb-92fab5a61707cd3b487219ea9efa0e410cde3bc4.tar.gz
gdb-92fab5a61707cd3b487219ea9efa0e410cde3bc4.tar.bz2
[guile] Run finalizers from GDB thread
gdb/ChangeLog: * guile/guile.c (_initialize_guile): Disable automatic finalization, if Guile offers us that possibility. * guile/guile.c (call_initialize_gdb_module): * guile/scm-safe-call.c (gdbscm_with_catch): Arrange to run finalizers in appropriate places. * config.in (HAVE_GUILE_MANUAL_FINALIZATION): New definition. * configure.ac (AC_TRY_LIBGUILE): Add a check for scm_set_automatic_finalization_enabled. * configure: Regenerated.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/config.in3
-rwxr-xr-xgdb/configure32
-rw-r--r--gdb/configure.ac5
-rw-r--r--gdb/guile/guile.c11
-rw-r--r--gdb/guile/scm-safe-call.c4
6 files changed, 66 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d247a6a..4a943f9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+2015-03-11 Andy Wingo <wingo@igalia.com>
+
+ * guile/guile.c (_initialize_guile): Disable automatic
+ finalization, if Guile offers us that possibility.
+ * guile/guile.c (call_initialize_gdb_module):
+ * guile/scm-safe-call.c (gdbscm_with_catch): Arrange to run
+ finalizers in appropriate places.
+ * configure.ac (AC_TRY_LIBGUILE): Add a check for
+ scm_set_automatic_finalization_enabled.
+ * configure: Regenerated.
+
2015-03-11 Andreas Arnez <arnez@linux.vnet.ibm.com>
* s390-linux-tdep.c (s390_skip_prologue): Skip the prologue using
diff --git a/gdb/config.in b/gdb/config.in
index 4aaadb5..3ccac37 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -201,6 +201,9 @@
/* Define if Guile interpreter is being linked in. */
#undef HAVE_GUILE
+/* Define if Guile supports manual finalization. */
+#undef HAVE_GUILE_MANUAL_FINALIZATION
+
/* Define if you have the iconv() function. */
#undef HAVE_ICONV
diff --git a/gdb/configure b/gdb/configure
index 1ddcc62..cca0aeb 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -9229,6 +9229,14 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
+ ac_fn_c_check_func "$LINENO" "scm_set_automatic_finalization_enabled" "ac_cv_func_scm_set_automatic_finalization_enabled"
+if test "x$ac_cv_func_scm_set_automatic_finalization_enabled" = x""yes; then :
+
+$as_echo "#define HAVE_GUILE_MANUAL_FINALIZATION 1" >>confdefs.h
+
+
+fi
+
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
if test "${found_usable_guile}" = no; then
@@ -9305,6 +9313,14 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
+ ac_fn_c_check_func "$LINENO" "scm_set_automatic_finalization_enabled" "ac_cv_func_scm_set_automatic_finalization_enabled"
+if test "x$ac_cv_func_scm_set_automatic_finalization_enabled" = x""yes; then :
+
+$as_echo "#define HAVE_GUILE_MANUAL_FINALIZATION 1" >>confdefs.h
+
+
+fi
+
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
if test "${found_usable_guile}" = no; then
@@ -9378,6 +9394,14 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
+ ac_fn_c_check_func "$LINENO" "scm_set_automatic_finalization_enabled" "ac_cv_func_scm_set_automatic_finalization_enabled"
+if test "x$ac_cv_func_scm_set_automatic_finalization_enabled" = x""yes; then :
+
+$as_echo "#define HAVE_GUILE_MANUAL_FINALIZATION 1" >>confdefs.h
+
+
+fi
+
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
if test "${found_usable_guile}" = no; then
@@ -9461,6 +9485,14 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
+ ac_fn_c_check_func "$LINENO" "scm_set_automatic_finalization_enabled" "ac_cv_func_scm_set_automatic_finalization_enabled"
+if test "x$ac_cv_func_scm_set_automatic_finalization_enabled" = x""yes; then :
+
+$as_echo "#define HAVE_GUILE_MANUAL_FINALIZATION 1" >>confdefs.h
+
+
+fi
+
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
if test "${found_usable_guile}" = no; then
diff --git a/gdb/configure.ac b/gdb/configure.ac
index a4886c9..4a0b6a3 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1090,6 +1090,11 @@ AC_DEFUN([AC_TRY_LIBGUILE],
GUILE_CPPFLAGS=$new_CPPFLAGS
GUILE_LIBS=$new_LIBS],
[found_usable_guile=no])
+ dnl scm_set_automatic_finalization_enabled added in Guile 2.2.
+ AC_CHECK_FUNC(scm_set_automatic_finalization_enabled,
+ AC_DEFINE(HAVE_GUILE_MANUAL_FINALIZATION, 1,
+ [Define if Guile supports manual finalization.])
+ )
CPPFLAGS=$save_CPPFLAGS
LIBS=$save_LIBS
if test "${found_usable_guile}" = no; then
diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 16d15b7..4abf5c5 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -704,6 +704,10 @@ call_initialize_gdb_module (void *data)
performed within the desired module. */
scm_c_define_module (gdbscm_module_name, initialize_gdb_module, NULL);
+#if HAVE_GUILE_MANUAL_FINALIZATION
+ scm_run_finalizers ();
+#endif
+
return NULL;
}
@@ -850,6 +854,13 @@ _initialize_guile (void)
side to define module "gdb" which imports "_gdb". There is evidently no
similar convention in Guile so we skip this. */
+#if HAVE_GUILE_MANUAL_FINALIZATION
+ /* Our SMOB free functions are not thread-safe, as GDB itself is not
+ intended to be thread-safe. Disable automatic finalization so that
+ finalizers aren't run in other threads. */
+ scm_set_automatic_finalization_enabled (0);
+#endif
+
#ifdef HAVE_SIGPROCMASK
/* Before we initialize Guile, block SIGCHLD.
This is done so that all threads created during Guile initialization
diff --git a/gdb/guile/scm-safe-call.c b/gdb/guile/scm-safe-call.c
index 9255556..6052214 100644
--- a/gdb/guile/scm-safe-call.c
+++ b/gdb/guile/scm-safe-call.c
@@ -155,6 +155,10 @@ gdbscm_with_catch (void *data)
d->unwind_handler, d,
d->pre_unwind_handler, d);
+#if HAVE_GUILE_MANUAL_FINALIZATION
+ scm_run_finalizers ();
+#endif
+
return NULL;
}