From a39898f363450b59f3bced7ed8e605ca4a20c4d1 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Sun, 4 Nov 2018 01:21:48 +0300 Subject: [PATCH] Merge branch 'check-O_NONBLOCK-in-debug' * check-O_NONBLOCK-in-debug: regress: use non blocking descriptors whenever it is possible assert that fds are nonblocking in debug mode Closes: nmathewson/Libevent#90 (cherry picked from commit 6f988ee161680925fc3308f17d293c680e3ac916) --- event.c | 39 +++++++++++++++++++++++++++------------ test/regress.c | 15 ++++++--------- test/regress_et.c | 34 +++++++--------------------------- 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/event.c b/event.c index ea72ddd3..5ee7d81b 100644 --- a/event.c +++ b/event.c @@ -52,6 +52,9 @@ #include #include #include +#ifdef EVENT__HAVE_FCNTL_H +#include +#endif #include "event2/event.h" #include "event2/event_struct.h" @@ -234,9 +237,8 @@ static void event_debug_note_setup_(const struct event *ev) { struct event_debug_entry *dent, find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) goto out; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -262,9 +264,8 @@ static void event_debug_note_teardown_(const struct event *ev) { struct event_debug_entry *dent, find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) goto out; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -281,9 +282,8 @@ static void event_debug_note_add_(const struct event *ev) { struct event_debug_entry *dent,find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) goto out; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -308,9 +308,8 @@ static void event_debug_note_del_(const struct event *ev) { struct event_debug_entry *dent, find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) goto out; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -335,9 +334,8 @@ static void event_debug_assert_is_setup_(const struct event *ev) { struct event_debug_entry *dent, find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) return; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -357,9 +355,8 @@ static void event_debug_assert_not_added_(const struct event *ev) { struct event_debug_entry *dent, find; - if (!event_debug_mode_on_) { + if (!event_debug_mode_on_) return; - } find.ptr = ev; EVLOCK_LOCK(event_debug_map_lock_, 0); @@ -374,6 +371,21 @@ static void event_debug_assert_not_added_(const struct event *ev) } EVLOCK_UNLOCK(event_debug_map_lock_, 0); } +static void event_debug_assert_socket_nonblocking_(evutil_socket_t fd) +{ + int flags; + + if (!event_debug_mode_on_) + return; + +#ifndef _WIN32 + if ((flags = fcntl(fd, F_GETFL, NULL)) >= 0) { + EVUTIL_ASSERT(flags & O_NONBLOCK); + } +#else + (void)flags; +#endif +} #else static void event_debug_note_setup_(const struct event *ev) { (void)ev; } static void event_debug_note_teardown_(const struct event *ev) { (void)ev; } @@ -381,6 +393,7 @@ static void event_debug_note_add_(const struct event *ev) { (void)ev; } static void event_debug_note_del_(const struct event *ev) { (void)ev; } static void event_debug_assert_is_setup_(const struct event *ev) { (void)ev; } static void event_debug_assert_not_added_(const struct event *ev) { (void)ev; } +static void event_debug_assert_socket_nonblocking_(evutil_socket_t fd) { (void)fd; } #endif #define EVENT_BASE_ASSERT_LOCKED(base) \ @@ -2099,6 +2112,8 @@ event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, shor if (arg == &event_self_cbarg_ptr_) arg = ev; + if (!(events & EV_SIGNAL)) + event_debug_assert_socket_nonblocking_(fd); event_debug_assert_not_added_(ev); ev->ev_base = base; diff --git a/test/regress.c b/test/regress.c index 6daa17ed..e3966247 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1389,18 +1389,14 @@ test_free_active_base(void *ptr) struct event ev1; base1 = event_init(); - if (base1) { - event_assign(&ev1, base1, data->pair[1], EV_READ, - dummy_read_cb, NULL); - event_add(&ev1, NULL); - event_base_free(base1); /* should not crash */ - } else { - tt_fail_msg("failed to create event_base for test"); - } + tt_assert(base1); + event_assign(&ev1, base1, data->pair[1], EV_READ, dummy_read_cb, NULL); + event_add(&ev1, NULL); + event_base_free(base1); /* should not crash */ base1 = event_init(); tt_assert(base1); - event_assign(&ev1, base1, 0, 0, dummy_read_cb, NULL); + event_assign(&ev1, base1, data->pair[0], 0, dummy_read_cb, NULL); event_active(&ev1, EV_READ, 1); event_base_free(base1); end: @@ -3080,6 +3076,7 @@ test_many_events(void *arg) * instance of that. */ sock[i] = socket(AF_INET, SOCK_DGRAM, 0); tt_assert(sock[i] >= 0); + tt_assert(!evutil_make_socket_nonblocking(sock[i])); called[i] = 0; ev[i] = event_new(base, sock[i], EV_WRITE|evflags, many_event_cb, &called[i]); diff --git a/test/regress_et.c b/test/regress_et.c index b9bd317e..07bcd4a5 100644 --- a/test/regress_et.c +++ b/test/regress_et.c @@ -75,19 +75,14 @@ read_cb(evutil_socket_t fd, short event, void *arg) event_del(arg); } -#ifdef _WIN32 -#define LOCAL_SOCKETPAIR_AF AF_INET -#else -#define LOCAL_SOCKETPAIR_AF AF_UNIX -#endif - static void -test_edgetriggered(void *et) +test_edgetriggered(void *data_) { + struct basic_test_data *data = data_; + struct event_base *base = data->base; + int *pair = data->pair; struct event *ev = NULL; - struct event_base *base = NULL; const char *test = "test string"; - evutil_socket_t pair[2] = {-1,-1}; int supports_et; /* On Linux 3.2.1 (at least, as patched by Fedora and tested by Nick), @@ -96,24 +91,12 @@ test_edgetriggered(void *et) * get edge-triggered behavior. Yuck! Linux 3.1.9 didn't have this * problem. */ -#ifdef __linux__ - if (evutil_ersatz_socketpair_(AF_INET, SOCK_STREAM, 0, pair) == -1) { - tt_abort_perror("socketpair"); - } -#else - if (evutil_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0, pair) == -1) { - tt_abort_perror("socketpair"); - } -#endif called = was_et = 0; tt_int_op(send(pair[0], test, (int)strlen(test)+1, 0), >, 0); shutdown(pair[0], EVUTIL_SHUT_WR); - /* Initalize the event library */ - base = event_base_new(); - supports_et = base_supports_et(base); TT_BLATHER(("Checking for edge-triggered events with %s, which should %s" "support edge-triggering", event_base_get_method(base), @@ -142,15 +125,11 @@ test_edgetriggered(void *et) tt_assert(!was_et); } - end: +end: if (ev) { event_del(ev); event_free(ev); } - if (base) - event_base_free(base); - evutil_closesocket(pair[0]); - evutil_closesocket(pair[1]); } static void @@ -281,7 +260,8 @@ end: } struct testcase_t edgetriggered_testcases[] = { - { "et", test_edgetriggered, TT_FORK, NULL, NULL }, + { "et", test_edgetriggered, + TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR, &basic_setup, NULL }, { "et_mix_error", test_edgetriggered_mix_error, TT_FORK|TT_NEED_SOCKETPAIR|TT_NO_LOGS, &basic_setup, NULL }, { "et_multiple_events", test_edge_triggered_multiple_events,