diff options
author | Andy Wingo <wingo@pobox.com> | 2010-08-28 12:15:53 -0700 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-08-28 12:15:53 -0700 |
commit | 877514dab09db6b012e68a17301315586e8f27b6 (patch) | |
tree | da165a6e81145c66a2b743ee9d7ba9076b0a3d84 | |
parent | fb61f4b8269b269e86e12ac2f9ead1faeb350436 (diff) | |
download | guile-877514dab09db6b012e68a17301315586e8f27b6.tar.gz |
threadsafety in deprecation, extensions
* libguile/deprecation.c (scm_c_issue_deprecation_warning):
* libguile/extensions.c (scm_c_register_extension, load_extension): Add
locks around global data structures.
-rw-r--r-- | libguile/deprecation.c | 12 | ||||
-rw-r--r-- | libguile/extensions.c | 15 |
2 files changed, 21 insertions, 6 deletions
diff --git a/libguile/deprecation.c b/libguile/deprecation.c index af8b93610..d3f0fd023 100644 --- a/libguile/deprecation.c +++ b/libguile/deprecation.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006, 2010 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 @@ -47,6 +47,7 @@ struct issued_warning { const char *message; }; +static scm_i_pthread_mutex_t warn_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; static struct issued_warning *issued_warnings; static int print_summary = 0; @@ -58,9 +59,11 @@ scm_c_issue_deprecation_warning (const char *msg) else { struct issued_warning *iw; + + scm_i_pthread_mutex_lock (&warn_lock); for (iw = issued_warnings; iw; iw = iw->prev) if (!strcmp (iw->message, msg)) - return; + goto done; if (scm_gc_running_p) fprintf (stderr, "%s\n", msg); else @@ -71,10 +74,13 @@ scm_c_issue_deprecation_warning (const char *msg) msg = strdup (msg); iw = malloc (sizeof (struct issued_warning)); if (msg == NULL || iw == NULL) - return; + goto done; iw->message = msg; iw->prev = issued_warnings; issued_warnings = iw; + + done: + scm_i_pthread_mutex_unlock (&warn_lock); } } diff --git a/libguile/extensions.c b/libguile/extensions.c index d01e9c656..d830acb59 100644 --- a/libguile/extensions.c +++ b/libguile/extensions.c @@ -1,6 +1,6 @@ /* extensions.c - registering and loading extensions. * - * Copyright (C) 2001, 2006, 2009 Free Software Foundation, Inc. + * Copyright (C) 2001, 2006, 2009, 2010 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 @@ -42,6 +42,7 @@ typedef struct extension_t } extension_t; static extension_t *registered_extensions = NULL; +static scm_i_pthread_mutex_t ext_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; /* Register a LIB/INIT pair for use by `scm_load_extension'. LIB is allowed to be NULL and then only INIT is used to identify the @@ -65,15 +66,23 @@ scm_c_register_extension (const char *lib, const char *init, ext->func = func; ext->data = data; + scm_i_pthread_mutex_lock (&ext_lock); ext->next = registered_extensions; registered_extensions = ext; + scm_i_pthread_mutex_unlock (&ext_lock); } static void load_extension (SCM lib, SCM init) { + extension_t *head; + + scm_i_pthread_mutex_lock (&ext_lock); + head = registered_extensions; + scm_i_pthread_mutex_unlock (&ext_lock); + /* Search the registry. */ - if (registered_extensions != NULL) + if (head != NULL) { extension_t *ext; char *clib, *cinit; @@ -86,7 +95,7 @@ load_extension (SCM lib, SCM init) cinit = scm_to_locale_string (init); scm_dynwind_free (cinit); - for (ext = registered_extensions; ext; ext = ext->next) + for (ext = head; ext; ext = ext->next) if ((ext->lib == NULL || !strcmp (ext->lib, clib)) && !strcmp (ext->init, cinit)) { |