diff options
author | mac Wang <6045490+liangyunwang@users.noreply.github.com> | 2019-04-08 13:45:14 -0700 |
---|---|---|
committer | Nathan Hjelm <hjelmn@me.com> | 2019-04-09 18:31:43 -0600 |
commit | f1e385390213aab96d2a40e4858ff0d019a1b0b7 (patch) | |
tree | e68dad1392c5b32a912035c186511fbe42bae220 /libusb/core.c | |
parent | 93dcb8ed205a4e4cea105c2141fbbbdeac84bb66 (diff) | |
download | libusb-f1e385390213aab96d2a40e4858ff0d019a1b0b7.tar.gz |
Address issue 554: Default context is erase before backend exits in libusb_exit
Closes #554
Closes #556
Signed-off-by: Nathan Hjelm <hjelmn@me.com>
Diffstat (limited to 'libusb/core.c')
-rw-r--r-- | libusb/core.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/libusb/core.c b/libusb/core.c index 6206b85..741bf99 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -2365,6 +2365,7 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx) { struct libusb_device *dev, *next; struct timeval tv = { 0, 0 }; + int destroying_default_context = 0; usbi_dbg(""); USBI_GET_CONTEXT(ctx); @@ -2379,9 +2380,18 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx) return; } usbi_dbg("destroying default context"); - usbi_default_context = NULL; - } - usbi_mutex_static_unlock(&default_context_lock); + + /* + * Setting this flag without unlocking the default context, as + * we are actually destroying the default context. + * usbi_default_context is not set to NULL yet, as all activities + * would only stop after usbi_backend->exit() returns. + */ + destroying_default_context = 1; + } else { + // Unlock default context, as we're not modifying it. + usbi_mutex_static_unlock(&default_context_lock); + } usbi_mutex_static_lock(&active_contexts_lock); list_del (&ctx->list); @@ -2425,6 +2435,11 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx) usbi_mutex_destroy(&ctx->usb_devs_lock); usbi_mutex_destroy(&ctx->hotplug_cbs_lock); free(ctx); + + if (destroying_default_context) { + usbi_default_context = NULL; + usbi_mutex_static_unlock(&default_context_lock); + } } /** \ingroup libusb_misc |