]> sigrok.org Git - libsigrok.git/blobdiff - src/session.c
Build: Fix typo that broke the driver enable options
[libsigrok.git] / src / session.c
index 4ef3bd4358939cc38c1f1a8de818ba935f0276ce..2ab3f7eb83c0c68f48d6a36314864082f32062e5 100644 (file)
@@ -22,7 +22,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <glib.h>
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
 /** @cond PRIVATE */
@@ -62,6 +62,7 @@ struct datafeed_callback {
 /**
  * Create a new session.
  *
+ * @param ctx         The context in which to create the new session.
  * @param new_session This will contain a pointer to the newly created
  *                    session if the return value is SR_OK, otherwise the value
  *                    is undefined and should not be used. Must not be NULL.
@@ -71,7 +72,8 @@ struct datafeed_callback {
  *
  * @since 0.4.0
  */
-SR_API int sr_session_new(struct sr_session **new_session)
+SR_API int sr_session_new(struct sr_context *ctx,
+               struct sr_session **new_session)
 {
        struct sr_session *session;
 
@@ -80,6 +82,7 @@ SR_API int sr_session_new(struct sr_session **new_session)
 
        session = g_malloc0(sizeof(struct sr_session));
 
+       session->ctx = ctx;
        session->source_timeout = -1;
        session->running = FALSE;
        session->abort_session = FALSE;
@@ -371,15 +374,35 @@ SR_API int sr_session_trigger_set(struct sr_session *session, struct sr_trigger
  *              of file descriptor or timeout status.
  *
  * @retval SR_OK Success.
- * @retval SR_ERR Error occured.
+ * @retval SR_ERR Error occurred.
  */
 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 ? session->source_timeout : 0;
+
+#ifdef HAVE_LIBUSB_1_0
+       if (session->ctx->usb_source_present) {
+               timeout = block ? 0 : session->source_timeout;
+               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)) {
@@ -447,6 +470,7 @@ static int verify_trigger(struct sr_trigger *trigger)
 
        return SR_OK;
 }
+
 /**
  * Start a session.
  *
@@ -983,15 +1007,11 @@ SR_API int sr_session_source_remove_channel(struct sr_session *session,
        return _sr_session_source_remove(session, (gintptr)channel);
 }
 
-static void *copy_src(struct sr_config *src)
+static void copy_src(struct sr_config *src, struct sr_datafeed_meta *meta_copy)
 {
-       struct sr_config *new_src;
-
-       new_src = g_malloc(sizeof(struct sr_config));
-       memcpy(new_src, src, sizeof(struct sr_config));
        g_variant_ref(src->data);
-
-       return new_src;
+       meta_copy->config = g_slist_append(meta_copy->config,
+                                          g_memdup(src, sizeof(struct sr_config)));
 }
 
 SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
@@ -1020,9 +1040,8 @@ SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
                break;
        case SR_DF_META:
                meta = packet->payload;
-               meta_copy = g_malloc(sizeof(struct sr_datafeed_meta));
-               meta_copy->config = g_slist_copy(meta->config);
-               g_slist_foreach(meta_copy->config, (GCopyFunc)copy_src, NULL);
+               meta_copy = g_malloc0(sizeof(struct sr_datafeed_meta));
+               g_slist_foreach(meta->config, (GFunc)copy_src, meta_copy->config);
                (*copy)->payload = meta_copy;
                break;
        case SR_DF_LOGIC: