Abstract low-level event handler operations
authorPete Batard <pbatard@gmail.com>
Sat, 5 Jun 2010 17:14:19 +0000 (12:14 -0500)
committerDaniel Drake <dan@reactivated.net>
Sat, 5 Jun 2010 17:16:20 +0000 (12:16 -0500)
The Windows backend uses something other than UNIX file descriptors
for event handling. Abstract out the operations to allow for this.

libusb/Makefile.am
libusb/core.c
libusb/io.c
libusb/os/poll_posix.h [new file with mode: 0644]

index 8784db4..e0f9f5a 100644 (file)
@@ -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
index ef5d0d5..08c23fa 100644 (file)
 #include <config.h>
 
 #include <errno.h>
-#include <poll.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
-#include <unistd.h>
 
-#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");
 
index 05f1614..f6e20bf 100644 (file)
 
 #include <config.h>
 #include <errno.h>
-#include <poll.h>
 #include <signal.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/time.h>
 #include <time.h>
-#include <unistd.h>
+
+#include "os/poll_posix.h"
 
 #ifdef USBI_TIMERFD_AVAILABLE
 #include <sys/timerfd.h>
@@ -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 (file)
index 0000000..17298a5
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __LIBUSB_POLL_POSIX_H__
+#define __LIBUSB_POLL_POSIX_H__
+
+#include <unistd.h>
+#include <poll.h>
+#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__ */