xref: /unit/src/nxt_fd_event.h (revision 2084:7d479274f334)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_FD_EVENT_H_INCLUDED_
8 #define _NXT_FD_EVENT_H_INCLUDED_
9 
10 
11 typedef enum {
12     /* A completely inactive event. */
13     NXT_EVENT_INACTIVE = 0,
14 
15     /*
16      * An event presents in the kernel but disabled after oneshot.
17      * Used by epoll.
18      */
19     NXT_EVENT_DISABLED,
20 
21     /*
22      * An event is active in the kernel but blocked by application.
23      * Used by kqueue, epoll, eventport, devpoll, and pollset.
24      */
25     NXT_EVENT_BLOCKED,
26 
27     /*
28      * An active oneshot event.
29      * Used by epoll, devpoll, pollset, poll, and select.
30      */
31     NXT_EVENT_ONESHOT,
32 
33     /* An active level-triggered event.  Used by eventport. */
34     NXT_EVENT_LEVEL,
35 
36     /*
37      * An active default event.  The event type depends on interface:
38      *    edge-triggered for kqueue, and modern epoll;
39      *    level-triggered for old epoll, devpoll, pollset, poll, and select;
40      *    oneshot for kqueue and eventport.
41      */
42     NXT_EVENT_DEFAULT,
43     NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT,
44 } nxt_fd_event_state_t;
45 
46 
47 #define nxt_fd_event_is_disabled(state)                                       \
48     ((state) < NXT_EVENT_ONESHOT)
49 
50 
51 #define nxt_fd_event_is_active(state)                                         \
52     ((state) >= NXT_EVENT_ONESHOT)
53 
54 
55 struct nxt_fd_event_s {
56     void                    *data;
57 
58     /* Both are int's. */
59     nxt_socket_t            fd;
60     nxt_err_t               error;
61 
62     /* The flags should also be prefetched by nxt_work_queue_pop(). */
63 
64 #if (NXT_64BIT)
65     nxt_fd_event_state_t      read:8;       /* 3 bits. */
66     nxt_fd_event_state_t      write:8;      /* 3 bits. */
67     uint8_t                   read_ready;
68     uint8_t                   write_ready;
69     uint8_t                   changing;
70     uint8_t                   closed;
71     uint8_t                   timedout;
72     uint8_t                   shutdown:1;
73 #if (NXT_HAVE_EPOLL)
74     uint8_t                   epoll_eof:1;
75     uint8_t                   epoll_error:1;
76 #endif
77 #if (NXT_HAVE_KQUEUE)
78     uint8_t                   kq_eof:1;
79 #endif
80 
81 #else /* NXT_32BIT */
82     nxt_fd_event_state_t      read:3;
83     nxt_fd_event_state_t      write:3;
84     uint8_t                   read_ready:1;
85     uint8_t                   write_ready:1;
86     uint8_t                   changing:1;
87     uint8_t                   closed:1;
88     uint8_t                   timedout:1;
89     uint8_t                   shutdown:1;
90 #if (NXT_HAVE_EPOLL)
91     uint8_t                   epoll_eof:1;
92     uint8_t                   epoll_error:1;
93 #endif
94 #if (NXT_HAVE_KQUEUE)
95     uint8_t                   kq_eof:1;
96 #endif
97 #endif /* NXT_64BIT */
98 
99 #if (NXT_HAVE_KQUEUE)
100     /* nxt_err_t is int. */
101     nxt_err_t               kq_errno;
102     /* struct kevent.data is intptr_t, however int32_t is enough. */
103     int32_t                 kq_available;
104 #endif
105 
106     nxt_task_t              *task;
107 
108     nxt_work_queue_t        *read_work_queue;
109     nxt_work_handler_t      read_handler;
110     nxt_work_queue_t        *write_work_queue;
111     nxt_work_handler_t      write_handler;
112     nxt_work_handler_t      error_handler;
113 
114     nxt_log_t               *log;
115 };
116 
117 
118 #endif /* _NXT_FD_EVENT_H_INCLUDED_ */
119