[gvfs] mtp: Use libusb interruption mechanism



commit 07c635a0ed402d6fb7c309c83dbdb9c21fad93bc
Author: Philip Langdale <philipl overt org>
Date:   Mon May 16 08:02:02 2016 -0700

    mtp: Use libusb interruption mechanism
    
    Now that libusb 1.0.21 is finally out, there is a way to explicitly
    interrupt a thread that is waiting for events. This allows us to
    use a long timeout on our event waiting, which we can interrupt,
    rather than a short, one second, timeout. The only nuance is that
    we need to link against libusb directly to be able to use the
    interrupt mechanism. This is a little bit ugly, but is necessary
    unless libmtp wraps the interruption call.

 configure.ac            |   20 ++++++++++++++++++++
 daemon/Makefile.am      |    4 ++--
 daemon/gvfsbackendmtp.c |   11 +++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 8c91fc4..bef758f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -478,6 +478,25 @@ AC_SUBST(BLURAY_CFLAGS)
 AC_SUBST(BLURAY_LIBS)
 AM_CONDITIONAL([HAVE_BLURAY], [test "$msg_bluray" = "yes"])
 
+dnl ************************************************
+dnl *** Check if we should build with libusb-1.0 ***
+dnl ************************************************
+AC_ARG_ENABLE([libusb], [AS_HELP_STRING([--disable-libusb],[build without libusb support])])
+msg_libusb=no
+
+if test "x$enable_libusb" != "xno"; then
+  PKG_CHECK_EXISTS([libusb-1.0 >= 1.0.21], [msg_libusb=yes])
+
+  if test "x$msg_libusb" = "xyes"; then
+    PKG_CHECK_MODULES([LIBUSB], [libusb-1.0 >= 1.0.21])
+    AC_DEFINE([HAVE_LIBUSB], 1, [Define to 1 if libusb is going to be built])
+  fi
+fi
+
+AC_SUBST(LIBUSB_CFLAGS)
+AC_SUBST(LIBUSB_LIBS)
+AM_CONDITIONAL([HAVE_LIBUSB], [test "$msg_libusb" = "yes"])
+
 dnl *************************
 dnl *** Check for libmtp ***
 dnl *************************
@@ -901,6 +920,7 @@ echo "
         Gphoto2 support:              $msg_gphoto2
         MTP support:                  $msg_libmtp
        Polkit support:               $msg_admin
+        USB support:                  $msg_libusb
        archive support:              $msg_archive
        AFC support:                  $msg_afc
         AFP support:                  $msg_afp
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 801c58d..963a721 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -505,9 +505,9 @@ gvfsd_mtp_CPPFLAGS = \
        -DDEFAULT_BACKEND_TYPE=mtp \
        -DMAX_JOB_THREADS=1 \
        -DBACKEND_TYPES='"mtp", G_VFS_TYPE_BACKEND_MTP,' \
-       $(GUDEV_CFLAGS) $(LIBMTP_CFLAGS)
+       $(GUDEV_CFLAGS) $(LIBMTP_CFLAGS) $(LIBUSB_CFLAGS)
 
-gvfsd_mtp_LDADD = $(libraries) $(GUDEV_LIBS) $(LIBMTP_LIBS) \
+gvfsd_mtp_LDADD = $(libraries) $(GUDEV_LIBS) $(LIBMTP_LIBS) $(LIBUSB_LIBS) \
                  $(top_builddir)/common/libgvfscommon-gphoto2.la
 
 gvfsd_http_SOURCES = \
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index 7570b6a..dddc4d5 100644
--- a/daemon/gvfsbackendmtp.c
+++ b/daemon/gvfsbackendmtp.c
@@ -34,6 +34,9 @@
 #include <gio/gio.h>
 
 #include <libmtp.h>
+#if HAVE_LIBUSB
+#include <libusb.h>
+#endif
 
 #include "gvfsbackendmtp.h"
 #include "gvfsicon.h"
@@ -76,7 +79,11 @@
  * Constants
  ************************************************/
 
+#if HAVE_LIBUSB
+#define EVENT_POLL_PERIOD { 3600, 0 }
+#else
 #define EVENT_POLL_PERIOD { 1, 0 }
+#endif
 
 /************************************************
  * Private Types
@@ -959,6 +966,10 @@ do_unmount (GVfsBackend *backend, GVfsJobUnmount *job,
 
   g_atomic_int_set (&op_backend->unmount_started, TRUE);
 
+#if HAVE_LIBUSB
+  libusb_interrupt_event_handler (NULL);
+#endif
+
 #ifdef HAVE_LIBMTP_1_1_12
   /* Thread will terminate after flag is set. */
   g_thread_join (op_backend->event_thread);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]