mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-08 11:53:00 -04:00
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)
This commit is contained in:
parent
bf3a67cfc5
commit
a39898f363
39
event.c
39
event.c
@ -52,6 +52,9 @@
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <limits.h>
|
||||
#ifdef EVENT__HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
#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;
|
||||
|
@ -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]);
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user