Implement two new libusb API functions.

PR:		usb/185454
MFC after:	2 weeks
This commit is contained in:
Hans Petter Selasky 2014-01-05 10:41:43 +00:00
parent fd71662513
commit 03205428b8
4 changed files with 66 additions and 11 deletions

View File

@ -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

View File

@ -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"

View File

@ -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);

View File

@ -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);
}