+ int ret, timeout;
+ int revents;
+ gboolean stop_checked;
+ gboolean stopped;
+ struct source *source;
+ GPollFD *pollfd;
+#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);
+#ifdef G_OS_UNIX
+ if (ret < 0 && errno != EINTR) {
+ sr_err("Error in poll: %s", g_strerror(errno));
+ return SR_ERR;
+ }
+#else
+ if (ret < 0) {
+ sr_err("Error in poll: %d", ret);
+ return SR_ERR;
+ }
+#endif
+ stop_checked = FALSE;
+ stopped = FALSE;