From b5dfacef244130aa25373c13989ffc357624a0bd Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 11 Oct 2013 10:15:06 +1100 Subject: [PATCH] We are always dependent on libusb handling events so use the blocking libusb_handle_events in the polling thread and use a bool to know if we should continue polling. --- cgminer.c | 13 +++++++------ usbutils.c | 1 - usbutils.h | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/cgminer.c b/cgminer.c index 79fd2ec0..275f0dc1 100644 --- a/cgminer.c +++ b/cgminer.c @@ -175,6 +175,8 @@ char *opt_usb_select = NULL; int opt_usbdump = -1; bool opt_usb_list_all; cgsem_t usb_resource_sem; +static pthread_t usb_poll_thread; +static bool usb_polling; #endif char *opt_kernel_path; @@ -3216,6 +3218,8 @@ static void __kill_work(void) /* Release USB resources in case it's a restart * and not a QUIT */ if (!opt_scrypt) { + usb_polling = false; + applog(LOG_DEBUG, "Releasing all USB devices"); usb_cleanup(); @@ -7742,19 +7746,15 @@ static void probe_pools(void) #ifdef USE_USBUTILS static void *libusb_poll_thread(void __maybe_unused *arg) { - struct timeval tv = { 0, USB_ASYNC_POLL * 1000 }; - RenameThread("usbpoll"); pthread_detach(pthread_self()); - while (42) - libusb_handle_events_timeout(NULL, &tv); + while (usb_polling) + libusb_handle_events(NULL); return NULL; } -static pthread_t usb_poll_thread; - static void initialise_usb(void) { int err = libusb_init(NULL); if (err) { @@ -7765,6 +7765,7 @@ static void initialise_usb(void) { mutex_init(&cgusb_lock); mutex_init(&cgusbres_lock); cglock_init(&cgusb_fd_lock); + usb_polling = true; pthread_create(&usb_poll_thread, NULL, libusb_poll_thread, NULL); } #else diff --git a/usbutils.c b/usbutils.c index 163906de..95068465 100644 --- a/usbutils.c +++ b/usbutils.c @@ -2227,7 +2227,6 @@ static int callback_wait(struct cgpu_info *cgpu, struct usb_transfer *ut, int *t int ret; cgtime(&tv_now); - timeout = timeout + USB_ASYNC_POLL; ms_to_timespec(&ts_end, timeout); timeval_to_spec(&ts_now, &tv_now); timeraddspec(&ts_end, &ts_now); diff --git a/usbutils.h b/usbutils.h index 426f29e3..19e64c52 100644 --- a/usbutils.h +++ b/usbutils.h @@ -15,10 +15,6 @@ #include "util.h" -/* Asynchronous transfers require libusb to be polled at regular intervals. - * Set the number of milliseconds to poll for incomplete work. */ -#define USB_ASYNC_POLL 10 - #define EPI(x) (LIBUSB_ENDPOINT_IN | (unsigned char)(x)) #define EPO(x) (LIBUSB_ENDPOINT_OUT | (unsigned char)(x))