X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fsession.c;h=0780a27ab3d2476e80df9e5af32ad184eb3bd9b4;hp=276c5d17a997dc8cc93b2321b71c4259373043ab;hb=bb5f61105bac2d7826416472e2168d8f59300aea;hpb=4ed5d21d048c8feed085530b7fda6ed265a5913f diff --git a/src/session.c b/src/session.c index 276c5d17..0780a27a 100644 --- a/src/session.c +++ b/src/session.c @@ -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 + + 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, - block ? session->source_timeout : 0); + 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)) {