xref: /unit/src/nxt_fd_event.h (revision 13)
112Sigor@sysoev.ru 
212Sigor@sysoev.ru /*
312Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
412Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
512Sigor@sysoev.ru  */
612Sigor@sysoev.ru 
712Sigor@sysoev.ru #ifndef _NXT_FD_EVENT_H_INCLUDED_
812Sigor@sysoev.ru #define _NXT_FD_EVENT_H_INCLUDED_
912Sigor@sysoev.ru 
1012Sigor@sysoev.ru 
1112Sigor@sysoev.ru typedef enum {
1212Sigor@sysoev.ru     /* A completely inactive event. */
1312Sigor@sysoev.ru     NXT_EVENT_INACTIVE = 0,
1412Sigor@sysoev.ru 
1512Sigor@sysoev.ru     /*
1612Sigor@sysoev.ru      * An event presents in the kernel but disabled after oneshot.
1712Sigor@sysoev.ru      * Used by epoll.
1812Sigor@sysoev.ru      */
1912Sigor@sysoev.ru     NXT_EVENT_DISABLED,
2012Sigor@sysoev.ru 
2112Sigor@sysoev.ru     /*
2212Sigor@sysoev.ru      * An event is active in the kernel but blocked by application.
2312Sigor@sysoev.ru      * Used by kqueue, epoll, eventport, devpoll, and pollset.
2412Sigor@sysoev.ru      */
2512Sigor@sysoev.ru     NXT_EVENT_BLOCKED,
2612Sigor@sysoev.ru 
2712Sigor@sysoev.ru     /*
2812Sigor@sysoev.ru      * An active oneshot event.
2912Sigor@sysoev.ru      * Used by epoll, devpoll, pollset, poll, and select.
3012Sigor@sysoev.ru      */
3112Sigor@sysoev.ru     NXT_EVENT_ONESHOT,
3212Sigor@sysoev.ru 
3312Sigor@sysoev.ru     /* An active level-triggered event.  Used by eventport. */
3412Sigor@sysoev.ru     NXT_EVENT_LEVEL,
3512Sigor@sysoev.ru 
3612Sigor@sysoev.ru     /*
3712Sigor@sysoev.ru      * An active default event.  The event type depends on interface:
3812Sigor@sysoev.ru      *    edge-triggered for kqueue, and modern epoll;
3912Sigor@sysoev.ru      *    level-triggered for old epoll, devpoll, pollset, poll, and select;
4012Sigor@sysoev.ru      *    oneshot for kqueue and eventport.
4112Sigor@sysoev.ru      */
4212Sigor@sysoev.ru     NXT_EVENT_DEFAULT,
4312Sigor@sysoev.ru     NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT,
4412Sigor@sysoev.ru } nxt_fd_event_state_t;
4512Sigor@sysoev.ru 
4612Sigor@sysoev.ru 
4712Sigor@sysoev.ru #define                                                                       \
4812Sigor@sysoev.ru nxt_fd_event_is_disabled(state)                                               \
4912Sigor@sysoev.ru     ((state) < NXT_EVENT_ONESHOT)
5012Sigor@sysoev.ru 
5112Sigor@sysoev.ru 
5212Sigor@sysoev.ru #define                                                                       \
5312Sigor@sysoev.ru nxt_fd_event_is_active(state)                                                 \
5412Sigor@sysoev.ru     ((state) >= NXT_EVENT_ONESHOT)
5512Sigor@sysoev.ru 
5612Sigor@sysoev.ru 
5712Sigor@sysoev.ru struct nxt_fd_event_s {
5812Sigor@sysoev.ru     void                    *data;
5912Sigor@sysoev.ru 
6012Sigor@sysoev.ru     /* Both are int's. */
6112Sigor@sysoev.ru     nxt_socket_t            fd;
6212Sigor@sysoev.ru     nxt_err_t               error;
6312Sigor@sysoev.ru 
6412Sigor@sysoev.ru     /* The flags should also be prefetched by nxt_work_queue_pop(). */
6512Sigor@sysoev.ru 
6612Sigor@sysoev.ru #if (NXT_64BIT)
6712Sigor@sysoev.ru     nxt_fd_event_state_t      read:8;       /* 3 bits. */
6812Sigor@sysoev.ru     nxt_fd_event_state_t      write:8;      /* 3 bits. */
6912Sigor@sysoev.ru     uint8_t                   read_ready;
7012Sigor@sysoev.ru     uint8_t                   write_ready;
7112Sigor@sysoev.ru     uint8_t                   changing;
7212Sigor@sysoev.ru     uint8_t                   closed;
7312Sigor@sysoev.ru     uint8_t                   timedout;
74*13Sigor@sysoev.ru     uint8_t                   shutdown:1;
7512Sigor@sysoev.ru #if (NXT_HAVE_EPOLL)
7612Sigor@sysoev.ru     uint8_t                   epoll_eof:1;
7712Sigor@sysoev.ru     uint8_t                   epoll_error:1;
7812Sigor@sysoev.ru #endif
7912Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE)
80*13Sigor@sysoev.ru     uint8_t                   kq_eof:1;
8112Sigor@sysoev.ru #endif
8212Sigor@sysoev.ru 
8312Sigor@sysoev.ru #else /* NXT_32BIT */
8412Sigor@sysoev.ru     nxt_fd_event_state_t      read:3;
8512Sigor@sysoev.ru     nxt_fd_event_state_t      write:3;
8612Sigor@sysoev.ru     uint8_t                   read_ready:1;
8712Sigor@sysoev.ru     uint8_t                   write_ready:1;
8812Sigor@sysoev.ru     uint8_t                   changing:1;
8912Sigor@sysoev.ru     uint8_t                   closed:1;
90*13Sigor@sysoev.ru     uint8_t                   timedout:1;
9112Sigor@sysoev.ru     uint8_t                   shutdown:1;
9212Sigor@sysoev.ru #if (NXT_HAVE_EPOLL)
9312Sigor@sysoev.ru     uint8_t                   epoll_eof:1;
9412Sigor@sysoev.ru     uint8_t                   epoll_error:1;
9512Sigor@sysoev.ru #endif
9612Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE)
9712Sigor@sysoev.ru     uint8_t                   kq_eof:1;
9812Sigor@sysoev.ru #endif
9912Sigor@sysoev.ru #endif /* NXT_64BIT */
10012Sigor@sysoev.ru 
10112Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE)
10212Sigor@sysoev.ru     /* nxt_err_t is int. */
10312Sigor@sysoev.ru     nxt_err_t               kq_errno;
10412Sigor@sysoev.ru     /* struct kevent.data is intptr_t, however int32_t is enough. */
10512Sigor@sysoev.ru     int32_t                 kq_available;
10612Sigor@sysoev.ru #endif
10712Sigor@sysoev.ru 
10812Sigor@sysoev.ru     nxt_task_t              *task;
10912Sigor@sysoev.ru 
11012Sigor@sysoev.ru     nxt_work_queue_t        *read_work_queue;
11112Sigor@sysoev.ru     nxt_work_handler_t      read_handler;
11212Sigor@sysoev.ru     nxt_work_queue_t        *write_work_queue;
11312Sigor@sysoev.ru     nxt_work_handler_t      write_handler;
11412Sigor@sysoev.ru     nxt_work_handler_t      error_handler;
11512Sigor@sysoev.ru 
11612Sigor@sysoev.ru     nxt_log_t               *log;
11712Sigor@sysoev.ru };
11812Sigor@sysoev.ru 
11912Sigor@sysoev.ru 
12012Sigor@sysoev.ru #endif /* _NXT_FD_EVENT_H_INCLUDED_ */
121