MCPcopy Create free account
hub / github.com/F-Stack/f-stack / ff_epoll_ctl

Function ff_epoll_ctl

lib/ff_epoll.c:30–104  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

28}
29
30int
31ff_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
32{
33 /*
34 * Since kqueue uses EVFILT_READ and EVFILT_WRITE filters to
35 * handle read/write events, so we need two kevents.
36 */
37 const int changes = 2;
38 struct kevent kev[changes];
39 int flags = 0;
40 int read_flags, write_flags;
41
42 if ((!event && op != EPOLL_CTL_DEL) ||
43 (op != EPOLL_CTL_ADD &&
44 op != EPOLL_CTL_MOD &&
45 op != EPOLL_CTL_DEL)) {
46 errno = EINVAL;
47 return -1;
48 }
49
50 /*
51 * EPOLL_CTL_DEL doesn't need to care for event->events.
52 */
53 if (op == EPOLL_CTL_DEL) {
54 EV_SET(&kev[0], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL);
55 EV_SET(&kev[1], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
56
57 return ff_kevent(epfd, kev, changes, NULL, 0, NULL);
58 }
59
60 /*
61 * FIXME:
62 *
63 * Kqueue doesn't have edge-triggered mode that exactly
64 * same with epoll, the most similar way is setting EV_CLEAR
65 * or EV_DISPATCH flag, but there are still some differences.
66 *
67 * EV_CLEAR:after the event is retrieved by the user,
68 * its state is reset.
69 * EV_DISPATCH: disable the event source immediately
70 * after delivery of an event.
71 *
72 * Here we use EV_CLEAR temporarily.
73 *
74 */
75 if (event->events & EPOLLET) {
76 flags |= EV_CLEAR;
77 }
78
79 if (event->events & EPOLLONESHOT) {
80 flags |= EV_ONESHOT;
81 }
82
83 if (op == EPOLL_CTL_ADD) {
84 flags |= EV_ADD;
85 }
86
87 read_flags = write_flags = flags | EV_DISABLE;

Callers 3

loopFunction · 0.85
mainFunction · 0.85
ff_sys_epoll_ctlFunction · 0.85

Calls 1

ff_keventFunction · 0.85

Tested by

no test coverage detected