mirror of
https://github.com/GOSTSec/sgminer
synced 2025-08-26 13:52:02 +00:00
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.
This commit is contained in:
parent
853aa28ffc
commit
b5dfacef24
13
cgminer.c
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
|
||||||
|
@ -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);
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user