From: Pete Batard Date: Sat, 5 Jun 2010 17:14:19 +0000 (-0500) Subject: Abstract low-level event handler operations X-Git-Tag: upstream/1.0.21~919 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc0af8e3f76925ad09e0fbc6d233d500753ee375;p=platform%2Fupstream%2Flibusb.git Abstract low-level event handler operations The Windows backend uses something other than UNIX file descriptors for event handling. Abstract out the operations to allow for this. --- diff --git a/libusb/Makefile.am b/libusb/Makefile.am index 8784db4..e0f9f5a 100644 --- a/libusb/Makefile.am +++ b/libusb/Makefile.am @@ -15,7 +15,7 @@ AM_CFLAGS_EXT = -no-cpp-precomp endif libusb_1_0_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) $(THREAD_CFLAGS) -libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c sync.c os/threads_posix.h $(OS_SRC) +libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c sync.c os/threads_posix.h os/poll_posix.h $(OS_SRC) hdrdir = $(includedir)/libusb-1.0 hdr_HEADERS = libusb.h diff --git a/libusb/core.c b/libusb/core.c index ef5d0d5..08c23fa 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -21,15 +21,14 @@ #include #include -#include #include #include #include #include #include -#include -#include "libusb.h" +#include "os/poll_posix.h" + #include "libusbi.h" #if defined(OS_LINUX) @@ -1043,7 +1042,7 @@ API_EXPORTED void libusb_close(libusb_device_handle *dev_handle) usbi_mutex_unlock(&ctx->pollfd_modify_lock); /* write some data on control pipe to interrupt event handlers */ - r = write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); + r = usbi_write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy)); if (r <= 0) { usbi_warn(ctx, "internal signalling write failed, closing anyway"); do_close(ctx, dev_handle); @@ -1057,7 +1056,7 @@ API_EXPORTED void libusb_close(libusb_device_handle *dev_handle) libusb_lock_events(ctx); /* read the dummy data */ - r = read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); + r = usbi_read(ctx->ctrl_pipe[0], &dummy, sizeof(dummy)); if (r <= 0) usbi_warn(ctx, "internal signalling read failed, closing anyway"); diff --git a/libusb/io.c b/libusb/io.c index 05f1614..f6e20bf 100644 --- a/libusb/io.c +++ b/libusb/io.c @@ -20,14 +20,14 @@ #include #include -#include #include #include #include #include #include #include -#include + +#include "os/poll_posix.h" #ifdef USBI_TIMERFD_AVAILABLE #include @@ -1014,7 +1014,7 @@ int usbi_io_init(struct libusb_context *ctx) list_init(&ctx->pollfds); /* FIXME should use an eventfd on kernels that support it */ - r = pipe(ctx->ctrl_pipe); + r = usbi_pipe(ctx->ctrl_pipe); if (r < 0) { r = LIBUSB_ERROR_OTHER; goto err; @@ -1044,8 +1044,8 @@ int usbi_io_init(struct libusb_context *ctx) return 0; err_close_pipe: - close(ctx->ctrl_pipe[0]); - close(ctx->ctrl_pipe[1]); + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); err: usbi_mutex_destroy(&ctx->flying_transfers_lock); usbi_mutex_destroy(&ctx->pollfds_lock); @@ -1059,8 +1059,8 @@ err: void usbi_io_exit(struct libusb_context *ctx) { usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]); - close(ctx->ctrl_pipe[0]); - close(ctx->ctrl_pipe[1]); + usbi_close(ctx->ctrl_pipe[0]); + usbi_close(ctx->ctrl_pipe[1]); #ifdef USBI_TIMERFD_AVAILABLE if (usbi_using_timerfd(ctx)) { usbi_remove_pollfd(ctx, ctx->timerfd); @@ -1830,7 +1830,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv) timeout_ms++; usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); - r = poll(fds, nfds, timeout_ms); + r = usbi_poll(fds, nfds, timeout_ms); usbi_dbg("poll() returned %d", r); if (r == 0) { free(fds); diff --git a/libusb/os/poll_posix.h b/libusb/os/poll_posix.h new file mode 100644 index 0000000..17298a5 --- /dev/null +++ b/libusb/os/poll_posix.h @@ -0,0 +1,12 @@ +#ifndef __LIBUSB_POLL_POSIX_H__ +#define __LIBUSB_POLL_POSIX_H__ + +#include +#include +#define usbi_write write +#define usbi_read read +#define usbi_close close +#define usbi_pipe pipe +#define usbi_poll poll + +#endif /* __LIBUSB_POLL_POSIX_H__ */