X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=inline;f=hardware%2Fcommon%2Fusb.c;fp=hardware%2Fcommon%2Fusb.c;h=c4d78f90a236acd036c4ad7e60a1ea902f225fa1;hb=6640324f7f2730dc5a120af90a849b8d8fee52fa;hp=64f887de91458c7a0ac75ff6c89168dba5170ff8;hpb=b5328e1dfaf8a03ce503ab89abed0d83c58a7bb2;p=libsigrok.git 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; }