Call libusb_get_next_timeout() to get minimum timeout for g_poll().
We should have been doing this all along, but we get away with it on Linux where libusb can do everything with fds, and we get away with it for many drivers that have a short timeout on their events. On Windows though, handling this correctly is essential. Fixes bug #343.
This commit is contained in:
parent
4ed5d21d04
commit
bb5f61105b
|
@ -379,10 +379,27 @@ SR_API int sr_session_trigger_set(struct sr_session *session, struct sr_trigger
|
|||
static int sr_session_iteration(struct sr_session *session, gboolean block)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
int ret, timeout;
|
||||
#ifdef HAVE_LIBUSB_1_0
|
||||
int usb_timeout;
|
||||
struct timeval tv;
|
||||
#endif
|
||||
|
||||
ret = g_poll(session->pollfds, session->num_sources,
|
||||
block ? session->source_timeout : 0);
|
||||
timeout = block ? 0 : session->source_timeout;
|
||||
|
||||
#ifdef HAVE_LIBUSB_1_0
|
||||
ret = libusb_get_next_timeout(session->ctx->libusb_ctx, &tv);
|
||||
if (ret < 0) {
|
||||
sr_err("Error getting libusb timeout: %s",
|
||||
libusb_error_name(ret));
|
||||
return SR_ERR;
|
||||
} else if (ret == 1) {
|
||||
usb_timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
||||
timeout = MIN(timeout, usb_timeout);
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = g_poll(session->pollfds, session->num_sources, timeout);
|
||||
for (i = 0; i < session->num_sources; i++) {
|
||||
if (session->pollfds[i].revents > 0 || (ret == 0
|
||||
&& session->source_timeout == session->sources[i].timeout)) {
|
||||
|
|
Loading…
Reference in New Issue