From: Martin Ling Date: Sun, 22 Dec 2013 17:27:13 +0000 (+0000) Subject: usb: Enforce that there can only be one USB event source for now. X-Git-Tag: libsigrok-0.3.0~417 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=6640324f7f2730dc5a120af90a849b8d8fee52fa;p=libsigrok.git usb: Enforce that there can only be one USB event source for now. --- diff --git a/hardware/common/usb.c b/hardware/common/usb.c index 64f887de..c4d78f90 100644 --- a/hardware/common/usb.c +++ b/hardware/common/usb.c @@ -277,6 +277,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 +301,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 +328,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; } diff --git a/libsigrok-internal.h b/libsigrok-internal.h index a3fe2afe..c76f5983 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -60,6 +60,7 @@ struct sr_context { #ifdef HAVE_LIBUSB_1_0 libusb_context *libusb_ctx; + gboolean usb_source_present; #ifdef _WIN32 GThread *usb_thread; gboolean usb_thread_running;