usb: Enforce that there can only be one USB event source for now.
This commit is contained in:
parent
b5328e1dfa
commit
6640324f7f
|
@ -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_PRIV int usb_source_add(struct sr_context *ctx, int timeout,
|
||||||
sr_receive_data_callback_t cb, void *cb_data)
|
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
|
#ifdef _WIN32
|
||||||
ctx->usb_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
ctx->usb_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
g_mutex_init(&ctx->usb_mutex);
|
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);
|
sr_source_add(lupfd[i]->fd, lupfd[i]->events, timeout, cb, cb_data);
|
||||||
free(lupfd);
|
free(lupfd);
|
||||||
#endif
|
#endif
|
||||||
|
ctx->usb_source_present = TRUE;
|
||||||
|
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
SR_PRIV int usb_source_remove(struct sr_context *ctx)
|
SR_PRIV int usb_source_remove(struct sr_context *ctx)
|
||||||
{
|
{
|
||||||
|
if (!ctx->usb_source_present)
|
||||||
|
return SR_OK;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ctx->usb_thread_running = FALSE;
|
ctx->usb_thread_running = FALSE;
|
||||||
g_mutex_unlock(&ctx->usb_mutex);
|
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);
|
sr_source_remove(lupfd[i]->fd);
|
||||||
free(lupfd);
|
free(lupfd);
|
||||||
#endif
|
#endif
|
||||||
|
ctx->usb_source_present = FALSE;
|
||||||
|
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@
|
||||||
struct sr_context {
|
struct sr_context {
|
||||||
#ifdef HAVE_LIBUSB_1_0
|
#ifdef HAVE_LIBUSB_1_0
|
||||||
libusb_context *libusb_ctx;
|
libusb_context *libusb_ctx;
|
||||||
|
gboolean usb_source_present;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
GThread *usb_thread;
|
GThread *usb_thread;
|
||||||
gboolean usb_thread_running;
|
gboolean usb_thread_running;
|
||||||
|
|
Loading…
Reference in New Issue