Skip to content
Browse files

Allow user data pointer to be passed through pollfd notification API

  • Loading branch information...
1 parent 1df713d commit 819e65f880ca43526036e56c65c415042c91f58f Daniel Drake committed Jun 26, 2008
Showing with 16 additions and 6 deletions.
  1. +7 −3 libusb/io.c
  2. +8 −3 libusb/libusb.h
  3. +1 −0 libusb/libusbi.h
View
10 libusb/io.c
@@ -1634,13 +1634,17 @@ API_EXPORTED int libusb_get_next_timeout(libusb_context *ctx,
* \param ctx the context to operate on, or NULL for the default context
* \param added_cb pointer to function for addition notifications
* \param removed_cb pointer to function for removal notifications
+ * \param user_data User data to be passed back to callbacks (useful for
+ * passing context information)
*/
API_EXPORTED void libusb_set_pollfd_notifiers(libusb_context *ctx,
- libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb)
+ libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
+ void *user_data)
{
USBI_GET_CONTEXT(ctx);
ctx->fd_added_cb = added_cb;
ctx->fd_removed_cb = removed_cb;
+ ctx->fd_cb_user_data = user_data;
}
/* Add a file descriptor to the list of file descriptors to be monitored.
@@ -1660,7 +1664,7 @@ int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events)
pthread_mutex_unlock(&ctx->pollfds_lock);
if (ctx->fd_added_cb)
- ctx->fd_added_cb(fd, events);
+ ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data);
return 0;
}
@@ -1688,7 +1692,7 @@ void usbi_remove_pollfd(struct libusb_context *ctx, int fd)
pthread_mutex_unlock(&ctx->pollfds_lock);
free(ipollfd);
if (ctx->fd_removed_cb)
- ctx->fd_removed_cb(fd);
+ ctx->fd_removed_cb(fd, ctx->fd_cb_user_data);
}
/** \ingroup poll
View
11 libusb/libusb.h
@@ -1166,22 +1166,27 @@ struct libusb_pollfd {
* \param fd the new file descriptor
* \param events events to monitor for, see \ref libusb_pollfd for a
* description
+ * \param user_data User data pointer specified in
+ * libusb_set_pollfd_notifiers() call
* \see libusb_set_pollfd_notifiers()
*/
-typedef void (*libusb_pollfd_added_cb)(int fd, short events);
+typedef void (*libusb_pollfd_added_cb)(int fd, short events, void *user_data);
/** \ingroup poll
* Callback function, invoked when a file descriptor should be removed from
* the set of file descriptors being monitored for events. After returning
* from this callback, do not use that file descriptor again.
* \param fd the file descriptor to stop monitoring
+ * \param user_data User data pointer specified in
+ * libusb_set_pollfd_notifiers() call
* \see libusb_set_pollfd_notifiers()
*/
-typedef void (*libusb_pollfd_removed_cb)(int fd);
+typedef void (*libusb_pollfd_removed_cb)(int fd, void *user_data);
const struct libusb_pollfd **libusb_get_pollfds(libusb_context *ctx);
void libusb_set_pollfd_notifiers(libusb_context *ctx,
- libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb);
+ libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
+ void *user_data);
#ifdef __cplusplus
}
View
1 libusb/libusbi.h
@@ -166,6 +166,7 @@ struct libusb_context {
/* user callbacks for pollfd changes */
libusb_pollfd_added_cb fd_added_cb;
libusb_pollfd_removed_cb fd_removed_cb;
+ void *fd_cb_user_data;
/* ensures that only one thread is handling events at any one time */
pthread_mutex_t events_lock;

0 comments on commit 819e65f

Please sign in to comment.
Something went wrong with that request. Please try again.