summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_fd_event.h
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2017-02-07 20:04:56 +0300
committerIgor Sysoev <igor@sysoev.ru>2017-02-07 20:04:56 +0300
commit059a8642898a6bd4b47d13a1c1d599cd44af7e1c (patch)
treee3c8c530a04f1ae44777d5ea4fd6901dc55a8ebf /src/nxt_fd_event.h
parente57b95a92333fa7ff558737b0ba2b76894cc0412 (diff)
downloadunit-059a8642898a6bd4b47d13a1c1d599cd44af7e1c.tar.gz
unit-059a8642898a6bd4b47d13a1c1d599cd44af7e1c.tar.bz2
Event engines refactoring.
Diffstat (limited to 'src/nxt_fd_event.h')
-rw-r--r--src/nxt_fd_event.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/nxt_fd_event.h b/src/nxt_fd_event.h
new file mode 100644
index 00000000..ff989394
--- /dev/null
+++ b/src/nxt_fd_event.h
@@ -0,0 +1,122 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NXT_FD_EVENT_H_INCLUDED_
+#define _NXT_FD_EVENT_H_INCLUDED_
+
+
+typedef enum {
+ /* A completely inactive event. */
+ NXT_EVENT_INACTIVE = 0,
+
+ /*
+ * An event presents in the kernel but disabled after oneshot.
+ * Used by epoll.
+ */
+ NXT_EVENT_DISABLED,
+
+ /*
+ * An event is active in the kernel but blocked by application.
+ * Used by kqueue, epoll, eventport, devpoll, and pollset.
+ */
+ NXT_EVENT_BLOCKED,
+
+ /*
+ * An active oneshot event.
+ * Used by epoll, devpoll, pollset, poll, and select.
+ */
+ NXT_EVENT_ONESHOT,
+
+ /* An active level-triggered event. Used by eventport. */
+ NXT_EVENT_LEVEL,
+
+ /*
+ * An active default event. The event type depends on interface:
+ * edge-triggered for kqueue, and modern epoll;
+ * level-triggered for old epoll, devpoll, pollset, poll, and select;
+ * oneshot for kqueue and eventport.
+ */
+ NXT_EVENT_DEFAULT,
+ NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT,
+} nxt_fd_event_state_t;
+
+
+#define \
+nxt_fd_event_is_disabled(state) \
+ ((state) < NXT_EVENT_ONESHOT)
+
+
+#define \
+nxt_fd_event_is_active(state) \
+ ((state) >= NXT_EVENT_ONESHOT)
+
+
+struct nxt_fd_event_s {
+ void *data;
+
+ /* Both are int's. */
+ nxt_socket_t fd;
+ nxt_err_t error;
+
+ /* The flags should also be prefetched by nxt_work_queue_pop(). */
+
+#if (NXT_64BIT)
+ nxt_fd_event_state_t read:8; /* 3 bits. */
+ nxt_fd_event_state_t write:8; /* 3 bits. */
+ nxt_socket_error_level_t log_error:8; /* 3 bits. */
+ uint8_t read_ready;
+ uint8_t write_ready;
+ uint8_t changing;
+ uint8_t closed;
+ uint8_t shutdown;
+ uint8_t timedout;
+#if (NXT_HAVE_EPOLL)
+ uint8_t epoll_eof:1;
+ uint8_t epoll_error:1;
+#endif
+#if (NXT_HAVE_KQUEUE)
+ uint8_t kq_eof;
+#endif
+
+#else /* NXT_32BIT */
+ nxt_fd_event_state_t read:3;
+ nxt_fd_event_state_t write:3;
+ nxt_socket_error_level_t log_error:3;
+ uint8_t read_ready:1;
+ uint8_t write_ready:1;
+ uint8_t changing:1;
+ uint8_t closed:1;
+ uint8_t shutdown:1;
+ uint8_t timedout:1;
+#if (NXT_HAVE_EPOLL)
+ uint8_t epoll_eof:1;
+ uint8_t epoll_error:1;
+#endif
+#if (NXT_HAVE_KQUEUE)
+ uint8_t kq_eof:1;
+#endif
+#endif /* NXT_64BIT */
+
+#if (NXT_HAVE_KQUEUE)
+ /* nxt_err_t is int. */
+ nxt_err_t kq_errno;
+ /* struct kevent.data is intptr_t, however int32_t is enough. */
+ int32_t kq_available;
+#endif
+
+ nxt_task_t *task;
+
+ nxt_work_queue_t *read_work_queue;
+ nxt_work_handler_t read_handler;
+ nxt_work_queue_t *write_work_queue;
+ nxt_work_handler_t write_handler;
+ nxt_work_handler_t error_handler;
+
+ nxt_log_t *log;
+};
+
+
+#endif /* _NXT_FD_EVENT_H_INCLUDED_ */