xref: /unit/src/nxt_port.h (revision 20)
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 
1114Sigor@sysoev.ru typedef struct {
1214Sigor@sysoev.ru     uint32_t            stream;
1314Sigor@sysoev.ru 
1414Sigor@sysoev.ru     uint16_t            type;
1514Sigor@sysoev.ru     uint8_t             last;      /* 1 bit */
1614Sigor@sysoev.ru } nxt_port_msg_t;
1714Sigor@sysoev.ru 
1814Sigor@sysoev.ru 
1914Sigor@sysoev.ru typedef struct {
2014Sigor@sysoev.ru     nxt_queue_link_t    link;
2114Sigor@sysoev.ru     nxt_buf_t           *buf;
2214Sigor@sysoev.ru     size_t              share;
2314Sigor@sysoev.ru     nxt_fd_t            fd;
2414Sigor@sysoev.ru     nxt_port_msg_t      port_msg;
2514Sigor@sysoev.ru } nxt_port_send_msg_t;
2614Sigor@sysoev.ru 
2714Sigor@sysoev.ru 
28*20Sigor@sysoev.ru struct nxt_port_recv_msg_s {
2914Sigor@sysoev.ru     uint32_t            stream;
3014Sigor@sysoev.ru     uint16_t            type;
3114Sigor@sysoev.ru 
3214Sigor@sysoev.ru     nxt_fd_t            fd;
3314Sigor@sysoev.ru     nxt_buf_t           *buf;
3414Sigor@sysoev.ru     nxt_port_t          *port;
35*20Sigor@sysoev.ru };
3614Sigor@sysoev.ru 
3714Sigor@sysoev.ru 
3814Sigor@sysoev.ru struct nxt_port_s {
3914Sigor@sysoev.ru     /* Must be the first field. */
4014Sigor@sysoev.ru     nxt_fd_event_t      socket;
4114Sigor@sysoev.ru 
4214Sigor@sysoev.ru     nxt_queue_t         messages;   /* of nxt_port_send_msg_t */
4314Sigor@sysoev.ru 
4414Sigor@sysoev.ru     /* Maximum size of message part. */
4514Sigor@sysoev.ru     uint32_t            max_size;
4614Sigor@sysoev.ru     /* Maximum interleave of message parts. */
4714Sigor@sysoev.ru     uint32_t            max_share;
4814Sigor@sysoev.ru 
4914Sigor@sysoev.ru     nxt_port_handler_t  handler;
5014Sigor@sysoev.ru     void                *data;
5114Sigor@sysoev.ru 
5214Sigor@sysoev.ru     nxt_mem_pool_t      *mem_pool;
5314Sigor@sysoev.ru     nxt_buf_t           *free_bufs;
5414Sigor@sysoev.ru     nxt_socket_t        pair[2];
5514Sigor@sysoev.ru 
5614Sigor@sysoev.ru     nxt_pid_t           pid;
5714Sigor@sysoev.ru     uint32_t            engine;
5814Sigor@sysoev.ru };
5914Sigor@sysoev.ru 
6014Sigor@sysoev.ru 
6111Sigor@sysoev.ru #define NXT_PORT_MSG_MAX  NXT_PORT_MSG_DATA
6211Sigor@sysoev.ru 
6311Sigor@sysoev.ru typedef enum {
6411Sigor@sysoev.ru     NXT_PORT_MSG_QUIT = 0,
6511Sigor@sysoev.ru     NXT_PORT_MSG_NEW_PORT,
6614Sigor@sysoev.ru     NXT_PORT_MSG_CHANGE_FILE,
6711Sigor@sysoev.ru     NXT_PORT_MSG_DATA,
6811Sigor@sysoev.ru } nxt_port_msg_type_e;
6911Sigor@sysoev.ru 
7011Sigor@sysoev.ru 
7111Sigor@sysoev.ru typedef struct {
7214Sigor@sysoev.ru     nxt_pid_t           pid;
7314Sigor@sysoev.ru     uint32_t            engine;
7414Sigor@sysoev.ru     size_t              max_size;
7514Sigor@sysoev.ru     size_t              max_share;
7614Sigor@sysoev.ru } nxt_port_msg_new_port_t;
7711Sigor@sysoev.ru 
7811Sigor@sysoev.ru 
7911Sigor@sysoev.ru /*
8014Sigor@sysoev.ru  * nxt_port_data_t size is allocation size
8114Sigor@sysoev.ru  * which enables effective reuse of memory pool cache.
8211Sigor@sysoev.ru  */
8311Sigor@sysoev.ru typedef union {
8411Sigor@sysoev.ru     nxt_buf_t                buf;
8514Sigor@sysoev.ru     nxt_port_msg_new_port_t  new_port;
8614Sigor@sysoev.ru } nxt_port_data_t;
8711Sigor@sysoev.ru 
8811Sigor@sysoev.ru 
8914Sigor@sysoev.ru nxt_int_t nxt_port_socket_init(nxt_task_t *task, nxt_port_t *port,
9014Sigor@sysoev.ru     size_t max_size);
9114Sigor@sysoev.ru void nxt_port_destroy(nxt_port_t *port);
9214Sigor@sysoev.ru void nxt_port_write_enable(nxt_task_t *task, nxt_port_t *port);
9314Sigor@sysoev.ru void nxt_port_write_close(nxt_port_t *port);
9414Sigor@sysoev.ru void nxt_port_read_enable(nxt_task_t *task, nxt_port_t *port);
9514Sigor@sysoev.ru void nxt_port_read_close(nxt_port_t *port);
9614Sigor@sysoev.ru nxt_int_t nxt_port_socket_write(nxt_task_t *task, nxt_port_t *port,
9711Sigor@sysoev.ru     nxt_uint_t type, nxt_fd_t fd, uint32_t stream, nxt_buf_t *b);
9814Sigor@sysoev.ru 
9914Sigor@sysoev.ru void nxt_port_create(nxt_thread_t *thread, nxt_port_t *port,
10014Sigor@sysoev.ru     nxt_port_handler_t *handlers);
101*20Sigor@sysoev.ru void nxt_port_write(nxt_task_t *task, nxt_runtime_t *rt, nxt_uint_t type,
10214Sigor@sysoev.ru     nxt_fd_t fd, uint32_t stream, nxt_buf_t *b);
103*20Sigor@sysoev.ru void nxt_port_send_new_port(nxt_task_t *task, nxt_runtime_t *rt,
10414Sigor@sysoev.ru     nxt_port_t *port);
105*20Sigor@sysoev.ru void nxt_port_change_log_file(nxt_task_t *task, nxt_runtime_t *rt,
10611Sigor@sysoev.ru     nxt_uint_t slot, nxt_fd_t fd);
10711Sigor@sysoev.ru 
10814Sigor@sysoev.ru void nxt_port_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
10914Sigor@sysoev.ru void nxt_port_new_port_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
11014Sigor@sysoev.ru void nxt_port_change_log_file_handler(nxt_task_t *task,
11111Sigor@sysoev.ru     nxt_port_recv_msg_t *msg);
11214Sigor@sysoev.ru void nxt_port_data_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
11314Sigor@sysoev.ru void nxt_port_empty_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
11411Sigor@sysoev.ru 
11511Sigor@sysoev.ru 
11611Sigor@sysoev.ru #endif /* _NXT_PORT_H_INCLUDED_ */
117