diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_sendbuf.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/nxt_sendbuf.h b/src/nxt_sendbuf.h new file mode 100644 index 00000000..338bb84f --- /dev/null +++ b/src/nxt_sendbuf.h @@ -0,0 +1,108 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NXT_SENDBUF_H_INCLUDED_ +#define _NXT_SENDBUF_H_INCLUDED_ + + +/* + * The sendbuf interface is intended to send a buffer chain to a connection. + * It uses sendfile interface if available. Otherwise it can send only + * memory buffers, so file buffers must be read in memory in advance. + * + * The sendbuf interface sets c->socket.write_ready to appropriate state + * and returns: + * + * N > 0 if sendbuf sent N bytes. + * + * 0 if sendbuf was interrupted (EINTR and so on), + * or sendbuf sent previously buffered data, + * or single sync buffer has been encountered. + * In all these cases sendbuf is ready to continue + * operation, unless c->socket.write_ready is cleared. + * + * NXT_AGAIN if sendbuf did not send any bytes. + * + * NXT_ERROR if there was erorr. + * + * The sendbuf limit is size_t type since size_t is large enough and many + * sendfile implementations do not support anyway sending more than size_t + * at once. The limit support is located at the sendbuf level otherwise + * an additional limited chain must be created on each sendbuf call. + */ + + +typedef struct { + nxt_buf_t *buf; + nxt_iobuf_t *iobuf; + + uint32_t nmax; + uint8_t sync; /* 1 bit */ + uint8_t last; /* 1 bit */ + + size_t size; + size_t limit; +} nxt_sendbuf_coalesce_t; + + +#if (NXT_HAVE_LINUX_SENDFILE) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_linux_event_conn_io_sendfile(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +#if (NXT_HAVE_FREEBSD_SENDFILE) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_freebsd_event_conn_io_sendfile(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +#if (NXT_HAVE_SOLARIS_SENDFILEV) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_solaris_event_conn_io_sendfilev(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +#if (NXT_HAVE_MACOSX_SENDFILE) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_macosx_event_conn_io_sendfile(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +#if (NXT_HAVE_AIX_SEND_FILE) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_aix_event_conn_io_send_file(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +#if (NXT_HAVE_HPUX_SENDFILE) +#define NXT_HAVE_SENDFILE 1 +ssize_t nxt_hpux_event_conn_io_sendfile(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); +#endif + +ssize_t nxt_event_conn_io_sendbuf(nxt_event_conn_t *c, nxt_buf_t *b, + size_t limit); + + +nxt_uint_t nxt_sendbuf_mem_coalesce(nxt_sendbuf_coalesce_t *sb); +size_t nxt_sendbuf_file_coalesce(nxt_sendbuf_coalesce_t *sb); + +/* + * Auxiliary nxt_sendbuf_copy_coalesce() interface copies small memory + * buffers into internal buffer before output. It is intended for + * SSL/TLS libraries which lack vector I/O interface yet add noticeable + * overhead to each SSL/TLS record. + */ +ssize_t nxt_sendbuf_copy_coalesce(nxt_event_conn_t *c, nxt_buf_mem_t *bm, + nxt_buf_t *b, size_t limit); + +nxt_buf_t *nxt_sendbuf_update(nxt_buf_t *b, size_t sent); +nxt_buf_t *nxt_sendbuf_completion(nxt_thread_t *thr, nxt_work_queue_t *wq, + nxt_buf_t *b, size_t sent); + + +#endif /* _NXT_SENDBUF_H_INCLUDED_ */ |