xref: /aosp_15_r20/external/libevent/cmake/CheckWorkingKqueue.cmake (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
1*663afb9bSAndroid Build Coastguard Workerinclude(CheckCSourceRuns)
2*663afb9bSAndroid Build Coastguard Worker
3*663afb9bSAndroid Build Coastguard Workercheck_c_source_runs(
4*663afb9bSAndroid Build Coastguard Worker"
5*663afb9bSAndroid Build Coastguard Worker#include <sys/types.h>
6*663afb9bSAndroid Build Coastguard Worker#include <sys/time.h>
7*663afb9bSAndroid Build Coastguard Worker#include <sys/event.h>
8*663afb9bSAndroid Build Coastguard Worker#include <stdio.h>
9*663afb9bSAndroid Build Coastguard Worker#include <unistd.h>
10*663afb9bSAndroid Build Coastguard Worker#include <fcntl.h>
11*663afb9bSAndroid Build Coastguard Worker
12*663afb9bSAndroid Build Coastguard Workerint
13*663afb9bSAndroid Build Coastguard Workermain(int argc, char **argv)
14*663afb9bSAndroid Build Coastguard Worker{
15*663afb9bSAndroid Build Coastguard Worker    int kq;
16*663afb9bSAndroid Build Coastguard Worker    int n;
17*663afb9bSAndroid Build Coastguard Worker    int fd[2];
18*663afb9bSAndroid Build Coastguard Worker    struct kevent ev;
19*663afb9bSAndroid Build Coastguard Worker    struct timespec ts;
20*663afb9bSAndroid Build Coastguard Worker    char buf[80000];
21*663afb9bSAndroid Build Coastguard Worker
22*663afb9bSAndroid Build Coastguard Worker    if (pipe(fd) == -1)
23*663afb9bSAndroid Build Coastguard Worker        exit(1);
24*663afb9bSAndroid Build Coastguard Worker    if (fcntl(fd[1], F_SETFL, O_NONBLOCK) == -1)
25*663afb9bSAndroid Build Coastguard Worker        exit(1);
26*663afb9bSAndroid Build Coastguard Worker
27*663afb9bSAndroid Build Coastguard Worker    while ((n = write(fd[1], buf, sizeof(buf))) == sizeof(buf))
28*663afb9bSAndroid Build Coastguard Worker        ;
29*663afb9bSAndroid Build Coastguard Worker
30*663afb9bSAndroid Build Coastguard Worker    if ((kq = kqueue()) == -1)
31*663afb9bSAndroid Build Coastguard Worker        exit(1);
32*663afb9bSAndroid Build Coastguard Worker
33*663afb9bSAndroid Build Coastguard Worker    memset(&ev, 0, sizeof(ev));
34*663afb9bSAndroid Build Coastguard Worker    ev.ident = fd[1];
35*663afb9bSAndroid Build Coastguard Worker    ev.filter = EVFILT_WRITE;
36*663afb9bSAndroid Build Coastguard Worker    ev.flags = EV_ADD | EV_ENABLE;
37*663afb9bSAndroid Build Coastguard Worker    n = kevent(kq, &ev, 1, NULL, 0, NULL);
38*663afb9bSAndroid Build Coastguard Worker    if (n == -1)
39*663afb9bSAndroid Build Coastguard Worker        exit(1);
40*663afb9bSAndroid Build Coastguard Worker
41*663afb9bSAndroid Build Coastguard Worker    read(fd[0], buf, sizeof(buf));
42*663afb9bSAndroid Build Coastguard Worker
43*663afb9bSAndroid Build Coastguard Worker    ts.tv_sec = 0;
44*663afb9bSAndroid Build Coastguard Worker    ts.tv_nsec = 0;
45*663afb9bSAndroid Build Coastguard Worker    n = kevent(kq, NULL, 0, &ev, 1, &ts);
46*663afb9bSAndroid Build Coastguard Worker    if (n == -1 || n == 0)
47*663afb9bSAndroid Build Coastguard Worker        exit(1);
48*663afb9bSAndroid Build Coastguard Worker
49*663afb9bSAndroid Build Coastguard Worker    exit(0);
50*663afb9bSAndroid Build Coastguard Worker}
51*663afb9bSAndroid Build Coastguard Worker
52*663afb9bSAndroid Build Coastguard Worker" EVENT__HAVE_WORKING_KQUEUE)
53