-
-
Save papertigers/5ae99002a2428d04ca736c0522ca43fe to your computer and use it in GitHub Desktop.
epoll illumos bug
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <err.h> | |
#include <pthread.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
#include <unistd.h> | |
#include <sys/epoll.h> | |
#include <sys/eventfd.h> | |
void write_to_event_fd(int event_fd) { | |
static uint64_t data = 1; | |
if (write(event_fd, &data, sizeof (data)) != sizeof (data)) { | |
err(1, "write to event_fd"); | |
} | |
} | |
void read_from_event_fd(int event_fd) { | |
static uint64_t want_data = 1; | |
uint64_t have_data; | |
if (read(event_fd, &have_data, sizeof (have_data)) != sizeof (have_data)) { | |
err(1, "read from event_fd"); | |
} | |
if (want_data != have_data) { | |
err(1, "read bad data from event_fd"); | |
} | |
} | |
void wait_for_epoll_events(int epoll_fd) { | |
int nevents = 50; | |
int timeout = -1; | |
struct epoll_event ep_events[nevents]; | |
int num_events; | |
num_events = epoll_wait(epoll_fd, ep_events, nevents, timeout); | |
if (num_events != 1) { | |
err(1, "epoll_wait returned bad value: %d", num_events); | |
} | |
} | |
int main(int arg, char **argv) { | |
int ret; | |
struct epoll_event ev; | |
// create epoll handle | |
int epoll_fd = epoll_create1(EPOLL_CLOEXEC); | |
if (epoll_fd == -1) { | |
err(1, "epoll_create1"); | |
} | |
// create eventfd handle | |
int event_fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); | |
if (event_fd == -1) { | |
err(1, "eventfd create"); | |
} | |
// add eventfd handle to epoll event watcher | |
ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET; | |
ev.data.ptr = NULL; | |
ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event_fd, &ev); | |
if (ret == -1) { | |
err(1, "epoll_ctl (add eventfd to epoll)"); | |
} | |
write_to_event_fd(event_fd); | |
wait_for_epoll_events(epoll_fd); | |
printf("first epoll_wait returned\n"); | |
/* | |
* If we skip the read on Linux the edge triggered event | |
* still causes epoll_wait to return. On illumos this isn't | |
* the case | |
*/ | |
//read_from_event_fd(event_fd); | |
write_to_event_fd(event_fd); | |
wait_for_epoll_events(epoll_fd); | |
printf("second epoll_wait returned\n"); | |
return 0; | |
} |
Author
papertigers
commented
Mar 21, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment