xref: /unit/src/nxt_fd_event.h (revision 12:477899a6661b)
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                                                                       \
48 nxt_fd_event_is_disabled(state)                                               \
49     ((state) < NXT_EVENT_ONESHOT)
50 
51 
52 #define                                                                       \
53 nxt_fd_event_is_active(state)                                                 \
54     ((state) >= NXT_EVENT_ONESHOT)
55 
56 
57 struct nxt_fd_event_s {
58     void                    *data;
59 
60     /* Both are int's. */
61     nxt_socket_t            fd;
62     nxt_err_t               error;
63 
64     /* The flags should also be prefetched by nxt_work_queue_pop(). */
65 
66 #if (NXT_64BIT)
67     nxt_fd_event_state_t      read:8;       /* 3 bits. */
68     nxt_fd_event_state_t      write:8;      /* 3 bits. */
69     nxt_socket_error_level_t  log_error:8;  /* 3 bits. */
70     uint8_t                   read_ready;
71     uint8_t                   write_ready;
72     uint8_t                   changing;
73     uint8_t                   closed;
74     uint8_t                   shutdown;
75     uint8_t                   timedout;
76 #if (NXT_HAVE_EPOLL)
77     uint8_t                   epoll_eof:1;
78     uint8_t                   epoll_error:1;
79 #endif
80 #if (NXT_HAVE_KQUEUE)
81     uint8_t                   kq_eof;
82 #endif
83 
84 #else /* NXT_32BIT */
85     nxt_fd_event_state_t      read:3;
86     nxt_fd_event_state_t      write:3;
87     nxt_socket_error_level_t  log_error:3;
88     uint8_t                   read_ready:1;
89     uint8_t                   write_ready:1;
90     uint8_t                   changing:1;
91     uint8_t                   closed:1;
92     uint8_t                   shutdown:1;
93     uint8_t                   timedout:1;
94 #if (NXT_HAVE_EPOLL)
95     uint8_t                   epoll_eof:1;
96     uint8_t                   epoll_error:1;
97 #endif
98 #if (NXT_HAVE_KQUEUE)
99     uint8_t                   kq_eof:1;
100 #endif
101 #endif /* NXT_64BIT */
102 
103 #if (NXT_HAVE_KQUEUE)
104     /* nxt_err_t is int. */
105     nxt_err_t               kq_errno;
106     /* struct kevent.data is intptr_t, however int32_t is enough. */
107     int32_t                 kq_available;
108 #endif
109 
110     nxt_task_t              *task;
111 
112     nxt_work_queue_t        *read_work_queue;
113     nxt_work_handler_t      read_handler;
114     nxt_work_queue_t        *write_work_queue;
115     nxt_work_handler_t      write_handler;
116     nxt_work_handler_t      error_handler;
117 
118     nxt_log_t               *log;
119 };
120 
121 
122 #endif /* _NXT_FD_EVENT_H_INCLUDED_ */
123