xref: /unit/src/nxt_port.h (revision 14)
111Sigor@sysoev.ru 
211Sigor@sysoev.ru /*
311Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
411Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
511Sigor@sysoev.ru  */
611Sigor@sysoev.ru 
711Sigor@sysoev.ru #ifndef _NXT_PORT_H_INCLUDED_
811Sigor@sysoev.ru #define _NXT_PORT_H_INCLUDED_
911Sigor@sysoev.ru 
1011Sigor@sysoev.ru 
11*14Sigor@sysoev.ru typedef struct nxt_port_s  nxt_port_t;
12*14Sigor@sysoev.ru 
13*14Sigor@sysoev.ru 
14*14Sigor@sysoev.ru typedef struct {
15*14Sigor@sysoev.ru     uint32_t            stream;
16*14Sigor@sysoev.ru 
17*14Sigor@sysoev.ru     uint16_t            type;
18*14Sigor@sysoev.ru     uint8_t             last;      /* 1 bit */
19*14Sigor@sysoev.ru } nxt_port_msg_t;
20*14Sigor@sysoev.ru 
21*14Sigor@sysoev.ru 
22*14Sigor@sysoev.ru typedef struct {
23*14Sigor@sysoev.ru     nxt_queue_link_t    link;
24*14Sigor@sysoev.ru     nxt_buf_t           *buf;
25*14Sigor@sysoev.ru     size_t              share;
26*14Sigor@sysoev.ru     nxt_fd_t            fd;
27*14Sigor@sysoev.ru     nxt_port_msg_t      port_msg;
28*14Sigor@sysoev.ru } nxt_port_send_msg_t;
29*14Sigor@sysoev.ru 
30*14Sigor@sysoev.ru 
31*14Sigor@sysoev.ru typedef struct nxt_port_recv_msg_s {
32*14Sigor@sysoev.ru     uint32_t            stream;
33*14Sigor@sysoev.ru     uint16_t            type;
34*14Sigor@sysoev.ru 
35*14Sigor@sysoev.ru     nxt_fd_t            fd;
36*14Sigor@sysoev.ru     nxt_buf_t           *buf;
37*14Sigor@sysoev.ru     nxt_port_t          *port;
38*14Sigor@sysoev.ru } nxt_port_recv_msg_t;
39*14Sigor@sysoev.ru 
40*14Sigor@sysoev.ru 
41*14Sigor@sysoev.ru typedef void (*nxt_port_handler_t)(nxt_task_t *task, nxt_port_recv_msg_t *msg);
42*14Sigor@sysoev.ru 
43*14Sigor@sysoev.ru 
44*14Sigor@sysoev.ru struct nxt_port_s {
45*14Sigor@sysoev.ru     /* Must be the first field. */
46*14Sigor@sysoev.ru     nxt_fd_event_t      socket;
47*14Sigor@sysoev.ru 
48*14Sigor@sysoev.ru     nxt_queue_t         messages;   /* of nxt_port_send_msg_t */
49*14Sigor@sysoev.ru 
50*14Sigor@sysoev.ru     /* Maximum size of message part. */
51*14Sigor@sysoev.ru     uint32_t            max_size;
52*14Sigor@sysoev.ru     /* Maximum interleave of message parts. */
53*14Sigor@sysoev.ru     uint32_t            max_share;
54*14Sigor@sysoev.ru 
55*14Sigor@sysoev.ru     nxt_port_handler_t  handler;
56*14Sigor@sysoev.ru     void                *data;
57*14Sigor@sysoev.ru 
58*14Sigor@sysoev.ru     nxt_mem_pool_t      *mem_pool;
59*14Sigor@sysoev.ru     nxt_buf_t           *free_bufs;
60*14Sigor@sysoev.ru     nxt_socket_t        pair[2];
61*14Sigor@sysoev.ru 
62*14Sigor@sysoev.ru     nxt_pid_t           pid;
63*14Sigor@sysoev.ru     uint32_t            engine;
64*14Sigor@sysoev.ru     uint32_t            generation;
65*14Sigor@sysoev.ru };
66*14Sigor@sysoev.ru 
67*14Sigor@sysoev.ru 
6811Sigor@sysoev.ru #define NXT_PORT_MSG_MAX  NXT_PORT_MSG_DATA
6911Sigor@sysoev.ru 
7011Sigor@sysoev.ru typedef enum {
7111Sigor@sysoev.ru     NXT_PORT_MSG_QUIT = 0,
7211Sigor@sysoev.ru     NXT_PORT_MSG_NEW_PORT,
73*14Sigor@sysoev.ru     NXT_PORT_MSG_CHANGE_FILE,
7411Sigor@sysoev.ru     NXT_PORT_MSG_DATA,
7511Sigor@sysoev.ru } nxt_port_msg_type_e;
7611Sigor@sysoev.ru 
7711Sigor@sysoev.ru 
7811Sigor@sysoev.ru typedef struct {
79*14Sigor@sysoev.ru     nxt_pid_t           pid;
80*14Sigor@sysoev.ru     uint32_t            engine;
81*14Sigor@sysoev.ru     size_t              max_size;
82*14Sigor@sysoev.ru     size_t              max_share;
83*14Sigor@sysoev.ru } nxt_port_msg_new_port_t;
8411Sigor@sysoev.ru 
8511Sigor@sysoev.ru 
8611Sigor@sysoev.ru /*
87*14Sigor@sysoev.ru  * nxt_port_data_t size is allocation size
88*14Sigor@sysoev.ru  * which enables effective reuse of memory pool cache.
8911Sigor@sysoev.ru  */
9011Sigor@sysoev.ru typedef union {
9111Sigor@sysoev.ru     nxt_buf_t                buf;
92*14Sigor@sysoev.ru     nxt_port_msg_new_port_t  new_port;
93*14Sigor@sysoev.ru } nxt_port_data_t;
9411Sigor@sysoev.ru 
9511Sigor@sysoev.ru 
96*14Sigor@sysoev.ru nxt_int_t nxt_port_socket_init(nxt_task_t *task, nxt_port_t *port,
97*14Sigor@sysoev.ru     size_t max_size);
98*14Sigor@sysoev.ru void nxt_port_destroy(nxt_port_t *port);
99*14Sigor@sysoev.ru void nxt_port_write_enable(nxt_task_t *task, nxt_port_t *port);
100*14Sigor@sysoev.ru void nxt_port_write_close(nxt_port_t *port);
101*14Sigor@sysoev.ru void nxt_port_read_enable(nxt_task_t *task, nxt_port_t *port);
102*14Sigor@sysoev.ru void nxt_port_read_close(nxt_port_t *port);
103*14Sigor@sysoev.ru nxt_int_t nxt_port_socket_write(nxt_task_t *task, nxt_port_t *port,
10411Sigor@sysoev.ru     nxt_uint_t type, nxt_fd_t fd, uint32_t stream, nxt_buf_t *b);
105*14Sigor@sysoev.ru 
106*14Sigor@sysoev.ru void nxt_port_create(nxt_thread_t *thread, nxt_port_t *port,
107*14Sigor@sysoev.ru     nxt_port_handler_t *handlers);
108*14Sigor@sysoev.ru void nxt_port_write(nxt_task_t *task, nxt_cycle_t *cycle, nxt_uint_t type,
109*14Sigor@sysoev.ru     nxt_fd_t fd, uint32_t stream, nxt_buf_t *b);
110*14Sigor@sysoev.ru void nxt_port_send_new_port(nxt_task_t *task, nxt_cycle_t *cycle,
111*14Sigor@sysoev.ru     nxt_port_t *port);
112*14Sigor@sysoev.ru void nxt_port_change_log_file(nxt_task_t *task, nxt_cycle_t *cycle,
11311Sigor@sysoev.ru     nxt_uint_t slot, nxt_fd_t fd);
11411Sigor@sysoev.ru 
115*14Sigor@sysoev.ru void nxt_port_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
116*14Sigor@sysoev.ru void nxt_port_new_port_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
117*14Sigor@sysoev.ru void nxt_port_change_log_file_handler(nxt_task_t *task,
11811Sigor@sysoev.ru     nxt_port_recv_msg_t *msg);
119*14Sigor@sysoev.ru void nxt_port_data_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
120*14Sigor@sysoev.ru void nxt_port_empty_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
12111Sigor@sysoev.ru 
12211Sigor@sysoev.ru 
12311Sigor@sysoev.ru #endif /* _NXT_PORT_H_INCLUDED_ */
124