[binutils-gdb] [guile] Run finalizers from GDB thread

Andy Wingo wingo@sourceware.org
Wed Mar 11 12:44:00 GMT 2015


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=92fab5a61707cd3b487219ea9efa0e410cde3bc4

commit 92fab5a61707cd3b487219ea9efa0e410cde3bc4
Author: Andy Wingo <wingo@igalia.com>
Date:   Wed Mar 11 13:07:53 2015 +0100

    [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:
---
 gdb/ChangeLog             | 11 +++++++++++
 gdb/config.in             |  3 +++
 gdb/configure             | 32 ++++++++++++++++++++++++++++++++
 gdb/configure.ac          |  5 +++++
 gdb/guile/guile.c         | 11 +++++++++++
 gdb/guile/scm-safe-call.c |  4 ++++
 6 files changed, 66 insertions(+)

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;
 }



More information about the Gdb-cvs mailing list