From: Andy Wingo Date: Wed, 11 Mar 2015 12:07:53 +0000 (+0100) Subject: [guile] Run finalizers from GDB thread X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=92fab5a61707cd3b487219ea9efa0e410cde3bc4;p=binutils-gdb.git [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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d247a6a31a5..4a943f9758b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2015-03-11 Andy Wingo + + * 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 * s390-linux-tdep.c (s390_skip_prologue): Skip the prologue using diff --git a/gdb/config.in b/gdb/config.in index 4aaadb58744..3ccac37e238 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 1ddcc62ab8f..cca0aebd5cc 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 a4886c93ed1..4a0b6a3413c 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 16d15b7d6c2..4abf5c5bb14 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 925555681fe..6052214f15f 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; }