]> granicus.if.org Git - libevent/commitdiff
Added a test for testing if kqueue works with pipes.
authorJoakim Söderberg <joakim.soderberg@gmail.com>
Tue, 17 Dec 2013 13:01:21 +0000 (14:01 +0100)
committerJoakim Söderberg <joakim.soderberg@gmail.com>
Tue, 17 Dec 2013 13:01:21 +0000 (14:01 +0100)
CMakeLists.txt
cmake/CheckWorkingKqueue.cmake [new file with mode: 0644]

index 00cac54e919eddf15488302f79ca583d6f9bf147..ea26e8337f65d283be397ef04513439a9d142e6c 100644 (file)
@@ -35,6 +35,7 @@ option(EVENT__DISABLE_OPENSSL "Define if libevent should build without support f
 option(EVENT__DISABLE_BENCHMARK "Defines if libevent should build without the benchmark exectuables" OFF)
 option(EVENT__DISABLE_TESTS "If tests should be compiled or not" OFF)
 option(EVENT__DISABLE_REGRESS "Disable the regress tests" OFF)
+option(EVENT__FORCE_KQUEUE_CHECK "When crosscompiling forces running a test program that verifies that Kqueue works with pipes. Note that this requires you to manually run the test program on the the cross compilation target to verify that it works. See cmake documentation for try_run for more details" OFF)
 # TODO: Add --enable-verbose-debug, verbose debug logging
 # TODO: Add --disable-largefile     omit support for large files
 
@@ -370,9 +371,15 @@ CHECK_TYPE_SIZE("void *" EVENT__SIZEOF_VOID_P)
 CHECK_FILE_OFFSET_BITS()
 set(EVENT___FILE_OFFSET_BITS _FILE_OFFSET_BITS)
 
-# TODO: Check EVENT__HAVE_WORKING_KQUEUE (Define if kqueue works correctly with pipes)
+# Verify kqueue works with pipes.
 if (EVENT__HAVE_KQUEUE)
-    set(EVENT__HAVE_WORKING_KQUEUE 1)
+    if (CMAKE_CROSSCOMPILING AND NOT EVENT__FORCE_KQUEUE_CHECK)
+        message(WARNING "Cannot check if kqueue works with pipes when crosscompiling, use EVENT__FORCE_KQUEUE_CHECK to be sure (this requires manually running a test program on the cross compilation target)")
+        set(EVENT__HAVE_WORKING_KQUEUE 1)
+    else()
+        message("Checking if kqueue works with pipes...")
+        include(CheckWorkingKqueue)
+    endif()
 endif()
 
 CHECK_SYMBOL_EXISTS(_MINIX "stdio.h" EVENT___MINIX)
diff --git a/cmake/CheckWorkingKqueue.cmake b/cmake/CheckWorkingKqueue.cmake
new file mode 100644 (file)
index 0000000..47bf4e8
--- /dev/null
@@ -0,0 +1,52 @@
+include(CheckCSourceRuns)
+
+check_c_source_runs(
+"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/event.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+int
+main(int argc, char **argv)
+{
+    int kq;
+    int n;
+    int fd[2];
+    struct kevent ev;
+    struct timespec ts;
+    char buf[8000];
+
+    if (pipe(fd) == -1)
+        exit(1);
+    if (fcntl(fd[1], F_SETFL, O_NONBLOCK) == -1)
+        exit(1);
+
+    while ((n = write(fd[1], buf, sizeof(buf))) == sizeof(buf))
+        ;
+
+        if ((kq = kqueue()) == -1)
+        exit(1);
+
+    memset(&ev, 0, sizeof(ev));
+    ev.ident = fd[1];
+    ev.filter = EVFILT_WRITE;
+    ev.flags = EV_ADD | EV_ENABLE;
+    n = kevent(kq, &ev, 1, NULL, 0, NULL);
+    if (n == -1)
+        exit(1);
+
+    read(fd[0], buf, sizeof(buf));
+
+    ts.tv_sec = 0;
+    ts.tv_nsec = 0;
+    n = kevent(kq, NULL, 0, &ev, 1, &ts);
+    if (n == -1 || n == 0)
+        exit(1);
+
+    exit(0);
+}
+
+" EVENT__HAVE_WORKING_KQUEUE)
\ No newline at end of file