Browse Source

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.

nfactor-troky
Con Kolivas 11 years ago
parent
commit
b5dfacef24
  1. 13
      cgminer.c
  2. 1
      usbutils.c
  3. 4
      usbutils.h

13
cgminer.c

@ -175,6 +175,8 @@ char *opt_usb_select = NULL;
int opt_usbdump = -1; int opt_usbdump = -1;
bool opt_usb_list_all; bool opt_usb_list_all;
cgsem_t usb_resource_sem; cgsem_t usb_resource_sem;
static pthread_t usb_poll_thread;
static bool usb_polling;
#endif #endif
char *opt_kernel_path; char *opt_kernel_path;
@ -3216,6 +3218,8 @@ static void __kill_work(void)
/* Release USB resources in case it's a restart /* Release USB resources in case it's a restart
* and not a QUIT */ * and not a QUIT */
if (!opt_scrypt) { if (!opt_scrypt) {
usb_polling = false;
applog(LOG_DEBUG, "Releasing all USB devices"); applog(LOG_DEBUG, "Releasing all USB devices");
usb_cleanup(); usb_cleanup();
@ -7742,19 +7746,15 @@ static void probe_pools(void)
#ifdef USE_USBUTILS #ifdef USE_USBUTILS
static void *libusb_poll_thread(void __maybe_unused *arg) static void *libusb_poll_thread(void __maybe_unused *arg)
{ {
struct timeval tv = { 0, USB_ASYNC_POLL * 1000 };
RenameThread("usbpoll"); RenameThread("usbpoll");
pthread_detach(pthread_self()); pthread_detach(pthread_self());
while (42) while (usb_polling)
libusb_handle_events_timeout(NULL, &tv); libusb_handle_events(NULL);
return NULL; return NULL;
} }
static pthread_t usb_poll_thread;
static void initialise_usb(void) { static void initialise_usb(void) {
int err = libusb_init(NULL); int err = libusb_init(NULL);
if (err) { if (err) {
@ -7765,6 +7765,7 @@ static void initialise_usb(void) {
mutex_init(&cgusb_lock); mutex_init(&cgusb_lock);
mutex_init(&cgusbres_lock); mutex_init(&cgusbres_lock);
cglock_init(&cgusb_fd_lock); cglock_init(&cgusb_fd_lock);
usb_polling = true;
pthread_create(&usb_poll_thread, NULL, libusb_poll_thread, NULL); pthread_create(&usb_poll_thread, NULL, libusb_poll_thread, NULL);
} }
#else #else

1
usbutils.c

@ -2227,7 +2227,6 @@ static int callback_wait(struct cgpu_info *cgpu, struct usb_transfer *ut, int *t
int ret; int ret;
cgtime(&tv_now); cgtime(&tv_now);
timeout = timeout + USB_ASYNC_POLL;
ms_to_timespec(&ts_end, timeout); ms_to_timespec(&ts_end, timeout);
timeval_to_spec(&ts_now, &tv_now); timeval_to_spec(&ts_now, &tv_now);
timeraddspec(&ts_end, &ts_now); timeraddspec(&ts_end, &ts_now);

4
usbutils.h

@ -15,10 +15,6 @@
#include "util.h" #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 EPI(x) (LIBUSB_ENDPOINT_IN | (unsigned char)(x))
#define EPO(x) (LIBUSB_ENDPOINT_OUT | (unsigned char)(x)) #define EPO(x) (LIBUSB_ENDPOINT_OUT | (unsigned char)(x))

Loading…
Cancel
Save