X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fusb.c;h=6e678fdb401d1d681000fc3a6e273c7374656957;hb=e22aa87808624c86ec52ea8d57d0a6f35c9e018e;hp=64f887de91458c7a0ac75ff6c89168dba5170ff8;hpb=b5328e1dfaf8a03ce503ab89abed0d83c58a7bb2;p=libsigrok.git diff --git a/hardware/common/usb.c b/hardware/common/usb.c index 64f887de..6e678fdb 100644 --- a/hardware/common/usb.c +++ b/hardware/common/usb.c @@ -33,14 +33,7 @@ #define SUBCLASS_USBTMC 0x03 #define USBTMC_USB488 0x01 -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "usb: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) +#define LOG_PREFIX "usb" /** * Find USB devices according to a connection string. @@ -267,8 +260,11 @@ SR_PRIV int usb_callback(int fd, int revents, void *cb_data) g_mutex_lock(&ctx->usb_mutex); ret = ctx->usb_cb(fd, revents, ctx->usb_cb_data); - ResetEvent(ctx->usb_event); - g_mutex_unlock(&ctx->usb_mutex); + + if (ctx->usb_thread_running) { + ResetEvent(ctx->usb_event); + g_mutex_unlock(&ctx->usb_mutex); + } return ret; } @@ -277,6 +273,11 @@ SR_PRIV int usb_callback(int fd, int revents, void *cb_data) SR_PRIV int usb_source_add(struct sr_context *ctx, int timeout, sr_receive_data_callback_t cb, void *cb_data) { + if (ctx->usb_source_present) { + sr_err("A USB event source is already present."); + return SR_ERR; + } + #ifdef _WIN32 ctx->usb_event = CreateEvent(NULL, TRUE, FALSE, NULL); g_mutex_init(&ctx->usb_mutex); @@ -296,12 +297,16 @@ SR_PRIV int usb_source_add(struct sr_context *ctx, int timeout, sr_source_add(lupfd[i]->fd, lupfd[i]->events, timeout, cb, cb_data); free(lupfd); #endif + ctx->usb_source_present = TRUE; return SR_OK; } SR_PRIV int usb_source_remove(struct sr_context *ctx) { + if (!ctx->usb_source_present) + return SR_OK; + #ifdef _WIN32 ctx->usb_thread_running = FALSE; g_mutex_unlock(&ctx->usb_mutex); @@ -319,6 +324,7 @@ SR_PRIV int usb_source_remove(struct sr_context *ctx) sr_source_remove(lupfd[i]->fd); free(lupfd); #endif + ctx->usb_source_present = FALSE; return SR_OK; }