]> sigrok.org Git - libsigrok.git/commitdiff
USB: Remove Windows-specific event handling code
authorDaniel Elstner <redacted>
Fri, 4 Sep 2015 21:47:08 +0000 (23:47 +0200)
committerDaniel Elstner <redacted>
Mon, 7 Sep 2015 22:04:22 +0000 (00:04 +0200)
For the generic code to work on Windows, a version of libusb
with the experimental event-abstraction changes is required.

src/libsigrok-internal.h
src/session.c
src/usb.c

index ea0960c7a6e360291bf9486a1184b97264aec881..42ce04a67213f18d6c7077ebbe15ef79b6d3ddcc 100644 (file)
@@ -206,12 +206,6 @@ struct sr_context {
 #ifdef HAVE_LIBUSB_1_0
        libusb_context *libusb_ctx;
        gboolean usb_source_present;
-# ifdef G_OS_WIN32
-       int64_t usb_timeout;
-       int64_t usb_due;
-       sr_receive_data_callback usb_cb;
-       void *usb_cb_data;
-# endif
 #endif
 };
 
index 44aa59ed729afb4c101d29957b931ca4b78f8e64..f253dbd8e9e98760b290841cff789917aa7cf942 100644 (file)
@@ -409,7 +409,7 @@ static int sr_session_iteration(struct sr_session *session)
        struct source *source;
        GPollFD *pollfd;
        gintptr poll_object;
-#if HAVE_LIBUSB_1_0 && !defined(G_OS_WIN32)
+#if HAVE_LIBUSB_1_0
        int64_t usb_timeout;
        int64_t usb_due;
        struct timeval tv;
@@ -427,7 +427,7 @@ static int sr_session_iteration(struct sr_session *session)
                        min_due = source->due;
                source->triggered = FALSE;
        }
-#if HAVE_LIBUSB_1_0 && !defined(G_OS_WIN32)
+#if HAVE_LIBUSB_1_0
        usb_due = INT64_MAX;
        if (session->ctx->usb_source_present) {
                ret = libusb_get_next_timeout(session->ctx->libusb_ctx, &tv);
@@ -506,7 +506,7 @@ static int sr_session_iteration(struct sr_session *session)
                        revents = 0;
 
                due = source->due;
-#if HAVE_LIBUSB_1_0 && !defined(G_OS_WIN32)
+#if HAVE_LIBUSB_1_0
                if (usb_due < due && poll_object
                                == (gintptr)session->ctx->libusb_ctx)
                        due = usb_due;
index fd8bb7a341fd527e6f96c08711b6c37492508a50..60d828ad3d325b012d1607359688b81c376a355f 100644 (file)
--- a/src/usb.c
+++ b/src/usb.c
@@ -184,104 +184,19 @@ SR_PRIV void sr_usb_close(struct sr_usb_dev_inst *usb)
        sr_dbg("Closed USB device %d.%d.", usb->bus, usb->address);
 }
 
-#ifdef G_OS_WIN32
-/*
- * USB callback wrapper run when the main loop is idle.
- */
-static int usb_callback(int fd, int revents, void *cb_data)
-{
-       int64_t start_time, stop_time, due, timeout;
-       struct timeval tv;
-       struct sr_context *ctx;
-       int ret;
-
-       (void)fd;
-       (void)revents;
-       ctx = cb_data;
-
-       start_time = g_get_monotonic_time();
-       due = ctx->usb_due;
-
-       if (due > start_time) {
-               timeout = due - start_time;
-               tv.tv_sec  = timeout / G_USEC_PER_SEC;
-               tv.tv_usec = timeout % G_USEC_PER_SEC;
-
-               sr_spew("libusb_handle_events enter: %g ms timeout",
-                       1e-3 * timeout);
-
-               ret = libusb_handle_events_timeout_completed(ctx->libusb_ctx,
-                               (ctx->usb_timeout < 0) ? NULL : &tv, NULL);
-               if (ret != 0) {
-                       /* Warn but still invoke the callback, to give
-                        * the driver a chance to deal with the problem.
-                        */
-                       sr_warn("Error handling libusb event (%s)",
-                               libusb_error_name(ret));
-               }
-               stop_time = g_get_monotonic_time();
-
-               sr_spew("libusb_handle_events leave: %g ms elapsed",
-                       1e-3 * (stop_time - start_time));
-               /*
-                * The event source may have been removed by the driver's
-                * libusb transfer callback. Skip the callback in that case.
-                */
-               if (!ctx->usb_source_present)
-                       return TRUE;
-       } else {
-               /* Timeout already expired on entry.
-                */
-               stop_time = start_time;
-
-               sr_spew("libusb_handle_events skipped");
-       }
-
-       if (ctx->usb_timeout >= 0)
-               ctx->usb_due = stop_time + ctx->usb_timeout;
-       /*
-        * Run the registered callback to execute any follow-up activity
-        * to libusb's event handling.
-        */
-       return ctx->usb_cb(-1, (stop_time < due) ? G_IO_IN : 0,
-                       ctx->usb_cb_data);
-}
-#endif
-
 SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
                int timeout, sr_receive_data_callback cb, void *cb_data)
 {
+       const struct libusb_pollfd **lupfd;
+       GPollFD *pollfds;
+       int i;
+       int num_fds = 0;
        int ret;
 
        if (ctx->usb_source_present) {
                sr_err("A USB event source is already present.");
                return SR_ERR;
        }
-
-#ifdef G_OS_WIN32
-       if (timeout >= 0) {
-               ctx->usb_timeout = INT64_C(1000) * timeout;
-               ctx->usb_due = g_get_monotonic_time() + ctx->usb_timeout;
-       } else {
-               ctx->usb_timeout = -1;
-               ctx->usb_due = INT64_MAX;
-       }
-       ctx->usb_cb = cb;
-       ctx->usb_cb_data = cb_data;
-       /*
-        * TODO: Install an idle source which will fire permanently, and block
-        * in a wrapper callback until any libusb events have been processed.
-        * This will have to do for now, until we implement a proper way to
-        * deal with libusb events on Windows.
-        */
-       ret = sr_session_source_add_internal(session, NULL, 0,
-                       0, &usb_callback, ctx, (gintptr)ctx->libusb_ctx);
-#else
-       const struct libusb_pollfd **lupfd;
-       GPollFD *pollfds;
-       int i;
-       int num_fds = 0;
-
        lupfd = libusb_get_pollfds(ctx->libusb_ctx);
        if (!lupfd || !lupfd[0]) {
                free(lupfd);
@@ -293,7 +208,12 @@ SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
        pollfds = g_new(GPollFD, num_fds);
 
        for (i = 0; i < num_fds; ++i) {
+#if defined(G_OS_WIN32) && (GLIB_SIZEOF_VOID_P == 4)
+               /* Avoid a warning on 32-bit Windows. */
+               pollfds[i].fd = (gintptr)lupfd[i]->fd;
+#else
                pollfds[i].fd = lupfd[i]->fd;
+#endif
                pollfds[i].events = lupfd[i]->events;
                pollfds[i].revents = 0;
        }
@@ -301,7 +221,7 @@ SR_PRIV int usb_source_add(struct sr_session *session, struct sr_context *ctx,
        ret = sr_session_source_add_internal(session, pollfds, num_fds,
                        timeout, cb, cb_data, (gintptr)ctx->libusb_ctx);
        g_free(pollfds);
-#endif
+
        ctx->usb_source_present = (ret == SR_OK);
 
        return ret;