From 6640324f7f2730dc5a120af90a849b8d8fee52fa Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Sun, 22 Dec 2013 17:27:13 +0000 Subject: [PATCH] usb: Enforce that there can only be one USB event source for now. --- hardware/common/usb.c | 10 ++++++++++ libsigrok-internal.h | 1 + 2 files changed, 11 insertions(+) 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;