Use a timeout with usb handle events set to a nominal 200ms and wait for the polling thread to shut down before deinitialising libusb.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
diff --git a/cgminer.c b/cgminer.c
index 8e1c9a9..40cb2af 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -3218,8 +3218,6 @@ 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();
@@ -7221,6 +7219,8 @@ static void clean_up(void)
clear_adl(nDevs);
#endif
#ifdef USE_USBUTILS
+ usb_polling = false;
+ pthread_join(usb_poll_thread, NULL);
libusb_exit(NULL);
#endif
@@ -7792,11 +7792,12 @@ static void probe_pools(void)
#ifdef USE_USBUTILS
static void *libusb_poll_thread(void __maybe_unused *arg)
{
+ struct timeval tv_end = {0, 200000};
+
RenameThread("usbpoll");
- pthread_detach(pthread_self());
while (usb_polling)
- libusb_handle_events(NULL);
+ libusb_handle_events_timeout_completed(NULL, &tv_end, NULL);
return NULL;
}