summaryrefslogtreecommitdiff
path: root/event.c
diff options
context:
space:
mode:
authorGreg Hazel <ghazel@gmail.com>2014-01-08 14:57:14 -0800
committerAzat Khuzhin <a3at.mail@gmail.com>2018-11-04 01:15:24 +0300
commit965ed54c7a18622c8b477e940481e7c887b0789c (patch)
tree0656cf44bf46d84359723bc2ca4c65534d47f2c9 /event.c
parent69bc2da79fb2f358c22feba45e9ad4752729d320 (diff)
downloadlibevent-965ed54c7a18622c8b477e940481e7c887b0789c.tar.gz
assert that fds are nonblocking in debug mode
Check that each fd that had been added with some event do has O_NOBLOCK after event_enable_debug_mode() Rebased and do not check signals (EV_SIGNAL) by azat. Refs: nmathewson/Libevent#90 Refs: #96
Diffstat (limited to 'event.c')
-rw-r--r--event.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/event.c b/event.c
index ea72ddd3..5ee7d81b 100644
--- a/event.c
+++ b/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;