xref: /unit/src/nxt_port.h (revision 125)
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 
1142Smax.romanov@nginx.com typedef enum {
1242Smax.romanov@nginx.com     NXT_PORT_MSG_QUIT = 0,
1342Smax.romanov@nginx.com     NXT_PORT_MSG_NEW_PORT,
1442Smax.romanov@nginx.com     NXT_PORT_MSG_CHANGE_FILE,
1542Smax.romanov@nginx.com     NXT_PORT_MSG_MMAP,
1642Smax.romanov@nginx.com     NXT_PORT_MSG_DATA,
17*125Smax.romanov@nginx.com     NXT_PORT_MSG_REMOVE_PID,
1842Smax.romanov@nginx.com 
19*125Smax.romanov@nginx.com     NXT_PORT_MSG_MAX,
20*125Smax.romanov@nginx.com } nxt_port_msg_type_t;
2142Smax.romanov@nginx.com 
2214Sigor@sysoev.ru 
2342Smax.romanov@nginx.com /* Passed as a first iov chunk. */
2442Smax.romanov@nginx.com typedef struct {
2542Smax.romanov@nginx.com     uint32_t             stream;
2642Smax.romanov@nginx.com     nxt_pid_t            pid;
2742Smax.romanov@nginx.com     nxt_port_id_t        reply_port;
2842Smax.romanov@nginx.com 
2942Smax.romanov@nginx.com     nxt_port_msg_type_t  type:8;
3042Smax.romanov@nginx.com     uint8_t              last;      /* 1 bit */
3142Smax.romanov@nginx.com 
3242Smax.romanov@nginx.com     /* Message data send using mmap, next chunk is a nxt_port_mmap_msg_t. */
3342Smax.romanov@nginx.com     uint8_t              mmap;      /* 1 bit */
34124Smax.romanov@nginx.com } NXT_PACKED nxt_port_msg_t;
3514Sigor@sysoev.ru 
3614Sigor@sysoev.ru 
3714Sigor@sysoev.ru typedef struct {
3814Sigor@sysoev.ru     nxt_queue_link_t    link;
3914Sigor@sysoev.ru     nxt_buf_t           *buf;
4014Sigor@sysoev.ru     size_t              share;
4114Sigor@sysoev.ru     nxt_fd_t            fd;
4214Sigor@sysoev.ru     nxt_port_msg_t      port_msg;
43122Smax.romanov@nginx.com 
44122Smax.romanov@nginx.com     nxt_work_t          work;
45122Smax.romanov@nginx.com     nxt_event_engine_t  *engine;
46122Smax.romanov@nginx.com     nxt_mp_t            *mem_pool;
4714Sigor@sysoev.ru } nxt_port_send_msg_t;
4814Sigor@sysoev.ru 
4914Sigor@sysoev.ru 
5020Sigor@sysoev.ru struct nxt_port_recv_msg_s {
5114Sigor@sysoev.ru     nxt_fd_t            fd;
5214Sigor@sysoev.ru     nxt_buf_t           *buf;
5314Sigor@sysoev.ru     nxt_port_t          *port;
5442Smax.romanov@nginx.com     nxt_port_msg_t      port_msg;
5582Smax.romanov@nginx.com     size_t              size;
5620Sigor@sysoev.ru };
5714Sigor@sysoev.ru 
5814Sigor@sysoev.ru 
5914Sigor@sysoev.ru struct nxt_port_s {
6014Sigor@sysoev.ru     nxt_fd_event_t      socket;
6114Sigor@sysoev.ru 
62*125Smax.romanov@nginx.com     nxt_queue_link_t    link;       /* for nxt_process_t.ports */
6342Smax.romanov@nginx.com 
6414Sigor@sysoev.ru     nxt_queue_t         messages;   /* of nxt_port_send_msg_t */
6514Sigor@sysoev.ru 
6614Sigor@sysoev.ru     /* Maximum size of message part. */
6714Sigor@sysoev.ru     uint32_t            max_size;
6814Sigor@sysoev.ru     /* Maximum interleave of message parts. */
6914Sigor@sysoev.ru     uint32_t            max_share;
7014Sigor@sysoev.ru 
7114Sigor@sysoev.ru     nxt_port_handler_t  handler;
7214Sigor@sysoev.ru     void                *data;
7314Sigor@sysoev.ru 
7465Sigor@sysoev.ru     nxt_mp_t            *mem_pool;
7514Sigor@sysoev.ru     nxt_buf_t           *free_bufs;
7614Sigor@sysoev.ru     nxt_socket_t        pair[2];
7714Sigor@sysoev.ru 
7842Smax.romanov@nginx.com     nxt_port_id_t       id;
7914Sigor@sysoev.ru     nxt_pid_t           pid;
8014Sigor@sysoev.ru     uint32_t            engine;
8142Smax.romanov@nginx.com 
8242Smax.romanov@nginx.com     nxt_process_type_t  type:8;
8342Smax.romanov@nginx.com     nxt_process_t       *process;
8414Sigor@sysoev.ru };
8514Sigor@sysoev.ru 
8614Sigor@sysoev.ru 
8711Sigor@sysoev.ru typedef struct {
8842Smax.romanov@nginx.com     nxt_port_id_t       id;
8914Sigor@sysoev.ru     nxt_pid_t           pid;
9014Sigor@sysoev.ru     uint32_t            engine;
9114Sigor@sysoev.ru     size_t              max_size;
9214Sigor@sysoev.ru     size_t              max_share;
9342Smax.romanov@nginx.com     nxt_process_type_t  type:8;
94124Smax.romanov@nginx.com } NXT_PACKED nxt_port_msg_new_port_t;
9511Sigor@sysoev.ru 
9611Sigor@sysoev.ru 
9711Sigor@sysoev.ru /*
9814Sigor@sysoev.ru  * nxt_port_data_t size is allocation size
9914Sigor@sysoev.ru  * which enables effective reuse of memory pool cache.
10011Sigor@sysoev.ru  */
10111Sigor@sysoev.ru typedef union {
10211Sigor@sysoev.ru     nxt_buf_t                buf;
10314Sigor@sysoev.ru     nxt_port_msg_new_port_t  new_port;
10414Sigor@sysoev.ru } nxt_port_data_t;
10511Sigor@sysoev.ru 
10611Sigor@sysoev.ru 
10714Sigor@sysoev.ru nxt_int_t nxt_port_socket_init(nxt_task_t *task, nxt_port_t *port,
10814Sigor@sysoev.ru     size_t max_size);
10914Sigor@sysoev.ru void nxt_port_destroy(nxt_port_t *port);
11014Sigor@sysoev.ru void nxt_port_write_enable(nxt_task_t *task, nxt_port_t *port);
11114Sigor@sysoev.ru void nxt_port_write_close(nxt_port_t *port);
11214Sigor@sysoev.ru void nxt_port_read_enable(nxt_task_t *task, nxt_port_t *port);
11314Sigor@sysoev.ru void nxt_port_read_close(nxt_port_t *port);
11414Sigor@sysoev.ru nxt_int_t nxt_port_socket_write(nxt_task_t *task, nxt_port_t *port,
11542Smax.romanov@nginx.com     nxt_uint_t type, nxt_fd_t fd, uint32_t stream, nxt_port_id_t reply_port,
11642Smax.romanov@nginx.com     nxt_buf_t *b);
11714Sigor@sysoev.ru 
11877Smax.romanov@nginx.com void nxt_port_create(nxt_task_t *task, nxt_port_t *port,
11914Sigor@sysoev.ru     nxt_port_handler_t *handlers);
12020Sigor@sysoev.ru void nxt_port_write(nxt_task_t *task, nxt_runtime_t *rt, nxt_uint_t type,
12114Sigor@sysoev.ru     nxt_fd_t fd, uint32_t stream, nxt_buf_t *b);
12220Sigor@sysoev.ru void nxt_port_send_new_port(nxt_task_t *task, nxt_runtime_t *rt,
12314Sigor@sysoev.ru     nxt_port_t *port);
12481Smax.romanov@nginx.com nxt_int_t nxt_port_send_port(nxt_task_t *task, nxt_port_t *port,
12581Smax.romanov@nginx.com     nxt_port_t *new_port);
12620Sigor@sysoev.ru void nxt_port_change_log_file(nxt_task_t *task, nxt_runtime_t *rt,
12711Sigor@sysoev.ru     nxt_uint_t slot, nxt_fd_t fd);
12811Sigor@sysoev.ru 
12914Sigor@sysoev.ru void nxt_port_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
13014Sigor@sysoev.ru void nxt_port_new_port_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
13114Sigor@sysoev.ru void nxt_port_change_log_file_handler(nxt_task_t *task,
13211Sigor@sysoev.ru     nxt_port_recv_msg_t *msg);
13342Smax.romanov@nginx.com void nxt_port_mmap_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
13414Sigor@sysoev.ru void nxt_port_data_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
135*125Smax.romanov@nginx.com void nxt_port_remove_pid_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
13614Sigor@sysoev.ru void nxt_port_empty_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
13711Sigor@sysoev.ru 
13811Sigor@sysoev.ru 
13911Sigor@sysoev.ru #endif /* _NXT_PORT_H_INCLUDED_ */
140