Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jan 2014 10:41:43 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r260315 - head/lib/libusb
Message-ID:  <201401051041.s05Afhkx019042@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Sun Jan  5 10:41:43 2014
New Revision: 260315
URL: http://svnweb.freebsd.org/changeset/base/260315

Log:
  Implement two new libusb API functions.
  
  PR:		usb/185454
  MFC after:	2 weeks

Modified:
  head/lib/libusb/Makefile
  head/lib/libusb/libusb.3
  head/lib/libusb/libusb.h
  head/lib/libusb/libusb10_io.c

Modified: head/lib/libusb/Makefile
==============================================================================
--- head/lib/libusb/Makefile	Sun Jan  5 02:00:05 2014	(r260314)
+++ head/lib/libusb/Makefile	Sun Jan  5 10:41:43 2014	(r260315)
@@ -130,6 +130,8 @@ MLINKS += libusb.3 libusb_event_handler_
 MLINKS += libusb.3 libusb_lock_event_waiters.3
 MLINKS += libusb.3 libusb_unlock_event_waiters.3
 MLINKS += libusb.3 libusb_wait_for_event.3
+MLINKS += libusb.3 libusb_handle_events_timeout_completed.3
+MLINKS += libusb.3 libusb_handle_events_completed.3
 MLINKS += libusb.3 libusb_handle_events_timeout.3
 MLINKS += libusb.3 libusb_handle_events.3
 MLINKS += libusb.3 libusb_handle_events_locked.3

Modified: head/lib/libusb/libusb.3
==============================================================================
--- head/lib/libusb/libusb.3	Sun Jan  5 02:00:05 2014	(r260314)
+++ head/lib/libusb/libusb.3	Sun Jan  5 10:41:43 2014	(r260315)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 7, 2013
+.Dd January 5, 2014
 .Dt LIBUSB 3
 .Os
 .Sh NAME
@@ -485,11 +485,40 @@ transfer completes or another thread sto
 timeout expired.
 .Pp
 .Ft int
+.Fn libusb_handle_events_timeout_completed "libusb_context *ctx" "struct timeval *tv" "int *completed"
+Handle any pending events by checking if timeouts have expired and by
+checking the set of file descriptors for activity.
+If the
+.Fa completed
+argument is not equal to NULL, this function will
+loop until a transfer completion callback sets the variable pointed to
+by the
+.Fa completed
+argument to non-zero.
+If the
+.Fa tv
+argument is not equal to NULL, this function will return
+LIBUSB_ERROR_TIMEOUT after the given timeout.
+Returns 0 on success, or a LIBUSB_ERROR code on failure or timeout.
+.Pp
+.Ft int
+.Fn libusb_handle_events_completed "libusb_context *ctx" "int *completed"
+Handle any pending events by checking the set of file descriptors for activity.
+If the
+.Fa completed
+argument is not equal to NULL, this function will
+loop until a transfer completion callback sets the variable pointed to
+by the
+.Fa completed
+argument to non-zero.
+Returns 0 on success, or a LIBUSB_ERROR code on failure.
+.Pp
+.Ft int
 .Fn libusb_handle_events_timeout "libusb_context *ctx" "struct timeval *tv"
 Handle any pending events by checking if timeouts have expired and by
 checking the set of file descriptors for activity.
 Returns 0 on success, or a
-LIBUSB_ERROR code on failure.
+LIBUSB_ERROR code on failure or timeout.
 .Pp
 .Ft int
 .Fn libusb_handle_events "libusb_context *ctx"
@@ -508,7 +537,7 @@ Must be called with the event lock held.
 Determine the next internal timeout that libusb needs to handle.
 Returns 0
 if there are no pending timeouts, 1 if a timeout was returned, or a LIBUSB_ERROR
-code on failure.
+code on failure or timeout.
 .Pp
 .Ft void
 .Fn libusb_set_pollfd_notifiers "libusb_context *ctx" "libusb_pollfd_added_cb added_cb" "libusb_pollfd_removed_cb remove_cb" "void *user_data"

Modified: head/lib/libusb/libusb.h
==============================================================================
--- head/lib/libusb/libusb.h	Sun Jan  5 02:00:05 2014	(r260314)
+++ head/lib/libusb/libusb.h	Sun Jan  5 10:41:43 2014	(r260315)
@@ -438,6 +438,8 @@ int	libusb_event_handler_active(libusb_c
 void	libusb_lock_event_waiters(libusb_context * ctx);
 void	libusb_unlock_event_waiters(libusb_context * ctx);
 int	libusb_wait_for_event(libusb_context * ctx, struct timeval *tv);
+int	libusb_handle_events_timeout_completed(libusb_context * ctx, struct timeval *tv, int *completed);
+int	libusb_handle_events_completed(libusb_context * ctx, int *completed);
 int	libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv);
 int	libusb_handle_events(libusb_context * ctx);
 int	libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv);

Modified: head/lib/libusb/libusb10_io.c
==============================================================================
--- head/lib/libusb/libusb10_io.c	Sun Jan  5 02:00:05 2014	(r260314)
+++ head/lib/libusb/libusb10_io.c	Sun Jan  5 10:41:43 2014	(r260315)
@@ -336,29 +336,50 @@ libusb_wait_for_event(libusb_context *ct
 }
 
 int
-libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
+libusb_handle_events_timeout_completed(libusb_context *ctx,
+    struct timeval *tv, int *completed)
 {
-	int err;
+	int err = 0;
 
 	ctx = GET_CONTEXT(ctx);
 
-	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout enter");
+	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout_completed enter");
 
 	libusb_lock_events(ctx);
 
-	err = libusb_handle_events_locked(ctx, tv);
+	while (1) {
+		if (completed != NULL) {
+			if (*completed != 0 || err != 0)
+				break;
+		}
+		err = libusb_handle_events_locked(ctx, tv);
+		if (completed == NULL)
+			break;
+	}
 
 	libusb_unlock_events(ctx);
 
-	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout leave");
+	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout_completed exit");
 
 	return (err);
 }
 
 int
+libusb_handle_events_completed(libusb_context *ctx, int *completed)
+{
+	return (libusb_handle_events_timeout_completed(ctx, NULL, completed));
+}
+
+int
+libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
+{
+	return (libusb_handle_events_timeout_completed(ctx, tv, NULL));
+}
+
+int
 libusb_handle_events(libusb_context *ctx)
 {
-	return (libusb_handle_events_timeout(ctx, NULL));
+	return (libusb_handle_events_timeout_completed(ctx, NULL, NULL));
 }
 
 int
@@ -371,8 +392,9 @@ libusb_handle_events_locked(libusb_conte
 	if (libusb_event_handling_ok(ctx)) {
 		err = libusb10_handle_events_sub(ctx, tv);
 	} else {
-		libusb_wait_for_event(ctx, tv);
-		err = 0;
+		err = libusb_wait_for_event(ctx, tv);
+		if (err != 0)
+			err = LIBUSB_ERROR_TIMEOUT;
 	}
 	return (err);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401051041.s05Afhkx019042>