diff options
| author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2014-02-04 10:18:29 +0000 | 
|---|---|---|
| committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2014-02-04 10:18:29 +0000 | 
| commit | 8afaf3ad9c389c7673f905e889441bd97eb6685c (patch) | |
| tree | bf5ea54077bc4adb6d4fe8018faf832ec04595db | |
| parent | abee5cae12835698bf5c77c7dc8ce6c8bf83b268 (diff) | |
Notes
| -rw-r--r-- | lib/libusb/Makefile | 2 | ||||
| -rw-r--r-- | lib/libusb/libusb.3 | 35 | ||||
| -rw-r--r-- | lib/libusb/libusb.h | 2 | ||||
| -rw-r--r-- | lib/libusb/libusb10_io.c | 38 | 
4 files changed, 66 insertions, 11 deletions
| diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile index 99bdfc2b9fc9..92c0843139bf 100644 --- a/lib/libusb/Makefile +++ b/lib/libusb/Makefile @@ -130,6 +130,8 @@ MLINKS += libusb.3 libusb_event_handler_active.3  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 diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3 index b50981cf5d5c..785c8c475768 100644 --- a/lib/libusb/libusb.3 +++ b/lib/libusb/libusb.3 @@ -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 stops event handling, and 1 if the  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" diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h index b14990eda50d..c2e56f94a61a 100644 --- a/lib/libusb/libusb.h +++ b/lib/libusb/libusb.h @@ -438,6 +438,8 @@ int	libusb_event_handler_active(libusb_context * ctx);  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); diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c index 9aa31c484224..e27bbba4f45c 100644 --- a/lib/libusb/libusb10_io.c +++ b/lib/libusb/libusb10_io.c @@ -336,29 +336,50 @@ libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)  }  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_context *ctx, struct timeval *tv)  	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);  } | 
