| Index: third_party/libevent/test/regress.c
|
| diff --git a/third_party/libevent/test/regress.c b/third_party/libevent/test/regress.c
|
| index e939d1d166237f2c555ac4fa8f7a598f3edc8eae..0b7517d3aa4c85b8e8afc900c0e1baa555f9f862 100644
|
| --- a/third_party/libevent/test/regress.c
|
| +++ b/third_party/libevent/test/regress.c
|
| @@ -43,7 +43,7 @@
|
| #ifndef WIN32
|
| #include <sys/socket.h>
|
| #include <sys/wait.h>
|
| -#include <sys/signal.h>
|
| +#include <signal.h>
|
| #include <unistd.h>
|
| #include <netdb.h>
|
| #endif
|
| @@ -95,6 +95,9 @@ simple_read_cb(int fd, short event, void *arg)
|
| char buf[256];
|
| int len;
|
|
|
| + if (arg == NULL)
|
| + return;
|
| +
|
| len = read(fd, buf, sizeof(buf));
|
|
|
| if (len) {
|
| @@ -113,6 +116,9 @@ simple_write_cb(int fd, short event, void *arg)
|
| {
|
| int len;
|
|
|
| + if (arg == NULL)
|
| + return;
|
| +
|
| len = write(fd, TEST1, strlen(TEST1) + 1);
|
| if (len == -1)
|
| test_ok = 0;
|
| @@ -195,6 +201,7 @@ timeout_cb(int fd, short event, void *arg)
|
| test_ok = 1;
|
| }
|
|
|
| +#ifndef WIN32
|
| static void
|
| signal_cb_sa(int sig)
|
| {
|
| @@ -209,6 +216,7 @@ signal_cb(int fd, short event, void *arg)
|
| signal_del(ev);
|
| test_ok = 1;
|
| }
|
| +#endif
|
|
|
| struct both {
|
| struct event ev;
|
| @@ -304,6 +312,57 @@ cleanup_test(void)
|
| }
|
|
|
| static void
|
| +test_registerfds(void)
|
| +{
|
| + int i, j;
|
| + int pair[2];
|
| + struct event read_evs[512];
|
| + struct event write_evs[512];
|
| +
|
| + struct event_base *base = event_base_new();
|
| +
|
| + fprintf(stdout, "Testing register fds: ");
|
| +
|
| + for (i = 0; i < 512; ++i) {
|
| + if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) {
|
| + /* run up to the limit of file descriptors */
|
| + break;
|
| + }
|
| + event_set(&read_evs[i], pair[0],
|
| + EV_READ|EV_PERSIST, simple_read_cb, NULL);
|
| + event_base_set(base, &read_evs[i]);
|
| + event_add(&read_evs[i], NULL);
|
| + event_set(&write_evs[i], pair[1],
|
| + EV_WRITE|EV_PERSIST, simple_write_cb, NULL);
|
| + event_base_set(base, &write_evs[i]);
|
| + event_add(&write_evs[i], NULL);
|
| +
|
| + /* just loop once */
|
| + event_base_loop(base, EVLOOP_ONCE);
|
| + }
|
| +
|
| + /* now delete everything */
|
| + for (j = 0; j < i; ++j) {
|
| + event_del(&read_evs[j]);
|
| + event_del(&write_evs[j]);
|
| +#ifndef WIN32
|
| + close(read_evs[j].ev_fd);
|
| + close(write_evs[j].ev_fd);
|
| +#else
|
| + CloseHandle((HANDLE)read_evs[j].ev_fd);
|
| + CloseHandle((HANDLE)write_evs[j].ev_fd);
|
| +#endif
|
| +
|
| + /* just loop once */
|
| + event_base_loop(base, EVLOOP_ONCE);
|
| + }
|
| +
|
| + event_base_free(base);
|
| +
|
| + fprintf(stdout, "OK\n");
|
| +}
|
| +
|
| +static void
|
| test_simpleread(void)
|
| {
|
| struct event ev;
|
| @@ -764,6 +823,52 @@ out:
|
| cleanup_test();
|
| return;
|
| }
|
| +
|
| +static void
|
| +signal_cb_swp(int sig, short event, void *arg)
|
| +{
|
| + called++;
|
| + if (called < 5)
|
| + raise(sig);
|
| + else
|
| + event_loopexit(NULL);
|
| +}
|
| +static void
|
| +timeout_cb_swp(int fd, short event, void *arg)
|
| +{
|
| + if (called == -1) {
|
| + struct timeval tv = {5, 0};
|
| +
|
| + called = 0;
|
| + evtimer_add((struct event *)arg, &tv);
|
| + raise(SIGUSR1);
|
| + return;
|
| + }
|
| + test_ok = 0;
|
| + event_loopexit(NULL);
|
| +}
|
| +
|
| +static void
|
| +test_signal_while_processing(void)
|
| +{
|
| + struct event_base *base = event_init();
|
| + struct event ev, ev_timer;
|
| + struct timeval tv = {0, 0};
|
| +
|
| + setup_test("Receiving a signal while processing other signal: ");
|
| +
|
| + called = -1;
|
| + test_ok = 1;
|
| + signal_set(&ev, SIGUSR1, signal_cb_swp, NULL);
|
| + signal_add(&ev, NULL);
|
| + evtimer_set(&ev_timer, timeout_cb_swp, &ev_timer);
|
| + evtimer_add(&ev_timer, &tv);
|
| + event_dispatch();
|
| +
|
| + event_base_free(base);
|
| + cleanup_test();
|
| + return;
|
| +}
|
| #endif
|
|
|
| static void
|
| @@ -1515,11 +1620,17 @@ main (int argc, char **argv)
|
| err = WSAStartup( wVersionRequested, &wsaData );
|
| #endif
|
|
|
| +#ifndef WIN32
|
| + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
|
| + return (1);
|
| +#endif
|
| setvbuf(stdout, NULL, _IONBF, 0);
|
|
|
| /* Initalize the event library */
|
| global_base = event_init();
|
|
|
| + test_registerfds();
|
| +
|
| test_evutil_strtoll();
|
|
|
| /* use the global event base and need to be called first */
|
| @@ -1584,6 +1695,7 @@ main (int argc, char **argv)
|
| test_signal_switchbase();
|
| test_signal_restore();
|
| test_signal_assert();
|
| + test_signal_while_processing();
|
| #endif
|
|
|
| return (0);
|
|
|