nxt_conn.c (654:b6ca49c1da1b) nxt_conn.c (771:f349b2d68e75)
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8
9
10nxt_conn_io_t nxt_unix_conn_io = {
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8
9
10nxt_conn_io_t nxt_unix_conn_io = {
11 nxt_conn_io_connect,
12 nxt_conn_io_accept,
11 .connect = nxt_conn_io_connect,
12 .accept = nxt_conn_io_accept,
13
13
14 nxt_conn_io_read,
15 nxt_conn_io_recvbuf,
16 nxt_conn_io_recv,
14 .read = nxt_conn_io_read,
15 .recvbuf = nxt_conn_io_recvbuf,
16 .recv = nxt_conn_io_recv,
17
17
18 nxt_conn_io_write,
19 nxt_event_conn_io_write_chunk,
18 .write = nxt_conn_io_write,
19 .sendbuf = nxt_conn_io_sendbuf,
20
21#if (NXT_HAVE_LINUX_SENDFILE)
20
21#if (NXT_HAVE_LINUX_SENDFILE)
22 nxt_linux_event_conn_io_sendfile,
22 .old_sendbuf = nxt_linux_event_conn_io_sendfile,
23#elif (NXT_HAVE_FREEBSD_SENDFILE)
23#elif (NXT_HAVE_FREEBSD_SENDFILE)
24 nxt_freebsd_event_conn_io_sendfile,
24 .old_sendbuf = nxt_freebsd_event_conn_io_sendfile,
25#elif (NXT_HAVE_MACOSX_SENDFILE)
25#elif (NXT_HAVE_MACOSX_SENDFILE)
26 nxt_macosx_event_conn_io_sendfile,
26 .old_sendbuf = nxt_macosx_event_conn_io_sendfile,
27#elif (NXT_HAVE_SOLARIS_SENDFILEV)
27#elif (NXT_HAVE_SOLARIS_SENDFILEV)
28 nxt_solaris_event_conn_io_sendfilev,
28 .old_sendbuf = nxt_solaris_event_conn_io_sendfilev,
29#elif (NXT_HAVE_AIX_SEND_FILE)
29#elif (NXT_HAVE_AIX_SEND_FILE)
30 nxt_aix_event_conn_io_send_file,
30 .old_sendbuf = nxt_aix_event_conn_io_send_file,
31#elif (NXT_HAVE_HPUX_SENDFILE)
31#elif (NXT_HAVE_HPUX_SENDFILE)
32 nxt_hpux_event_conn_io_sendfile,
32 .old_sendbuf = nxt_hpux_event_conn_io_sendfile,
33#else
33#else
34 nxt_event_conn_io_sendbuf,
34 .old_sendbuf = nxt_event_conn_io_sendbuf,
35#endif
36
35#endif
36
37 nxt_event_conn_io_writev,
38 nxt_event_conn_io_send,
39
40 nxt_conn_io_shutdown,
37 .writev = nxt_event_conn_io_writev,
38 .send = nxt_event_conn_io_send,
41};
42
43
44nxt_conn_t *
45nxt_conn_create(nxt_mp_t *mp, nxt_task_t *task)
46{
47 nxt_conn_t *c;
48 nxt_thread_t *thr;

--- 50 unchanged lines hidden (view full) ---

99 task->thread->engine->connections--;
100
101 mp = c->mem_pool;
102 nxt_mp_release(mp);
103}
104
105
106void
39};
40
41
42nxt_conn_t *
43nxt_conn_create(nxt_mp_t *mp, nxt_task_t *task)
44{
45 nxt_conn_t *c;
46 nxt_thread_t *thr;

--- 50 unchanged lines hidden (view full) ---

97 task->thread->engine->connections--;
98
99 mp = c->mem_pool;
100 nxt_mp_release(mp);
101}
102
103
104void
107nxt_conn_io_shutdown(nxt_task_t *task, void *obj, void *data)
108{
109 int ret;
110 nxt_conn_t *c;
111
112 static const struct linger linger_off = {
113 .l_onoff = 1,
114 .l_linger = 0,
115 };
116
117 c = obj;
118
119 nxt_debug(task, "event conn shutdown");
120
121 if (c->socket.timedout) {
122 /*
123 * Resetting of timed out connection on close
124 * releases kernel memory associated with socket.
125 * This also causes sending TCP/IP RST to a peer.
126 */
127 ret = setsockopt(c->socket.fd, SOL_SOCKET, SO_LINGER, &linger_off,
128 sizeof(struct linger));
129
130 if (nxt_slow_path(ret != 0)) {
131 nxt_alert(task, "setsockopt(%d, SO_LINGER) failed %E",
132 c->socket.fd, nxt_socket_errno);
133 }
134 }
135
136 c->write_state->close_handler(task, c, data);
137}
138
139
140void
141nxt_conn_timer(nxt_event_engine_t *engine, nxt_conn_t *c,
142 const nxt_conn_state_t *state, nxt_timer_t *timer)
143{
144 nxt_msec_t value;
145
146 if (state->timer_value != NULL) {
147 value = state->timer_value(c, state->timer_data);
148

--- 73 unchanged lines hidden ---
105nxt_conn_timer(nxt_event_engine_t *engine, nxt_conn_t *c,
106 const nxt_conn_state_t *state, nxt_timer_t *timer)
107{
108 nxt_msec_t value;
109
110 if (state->timer_value != NULL) {
111 value = state->timer_value(c, state->timer_data);
112

--- 73 unchanged lines hidden ---