+ int ret, timeout;
+ gboolean stop_checked;
+ gboolean stopped;
+#ifdef HAVE_LIBUSB_1_0
+ int usb_timeout;
+ struct timeval tv;
+#endif
+
+ timeout = block ? session->source_timeout : 0;
+
+#ifdef HAVE_LIBUSB_1_0
+ if (session->ctx->usb_source_present) {
+ 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);
+ if (ret < 0 && errno != EINTR) {
+ sr_err("Error in poll: %s", g_strerror(errno));
+ return SR_ERR;
+ }
+ stop_checked = FALSE;
+ stopped = FALSE;