Mercurial > hg > nginx
annotate src/event/ngx_event_posted.c @ 7612:1ce3f01a4355
SSL: reworked posted next events.
Introduced in 9d2ad2fb4423 available bytes handling in SSL relied
on connection read handler being overwritten to set the ready flag
and the amount of available bytes. This approach is, however, does
not work properly when connection read handler is changed, for example,
when switching to a next pipelined request, and can result in unexpected
connection timeouts, see here:
http://mailman.nginx.org/pipermail/nginx-devel/2019-December/012825.html
Fix is to introduce ngx_event_process_posted_next() instead, which
will set ready and available regardless of how event handler is set.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 24 Dec 2019 17:24:59 +0300 |
parents | 9d2ad2fb4423 |
children | f1720934c45b |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
381
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
381
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
4412 | 4 * Copyright (C) Nginx, Inc. |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
381
diff
changeset
|
5 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
381
diff
changeset
|
6 |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_core.h> |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 #include <ngx_event.h> |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
11 |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
12 |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
13 ngx_queue_t ngx_posted_accept_events; |
7584
9d2ad2fb4423
SSL: available bytes handling (ticket #1431).
Maxim Dounin <mdounin@mdounin.ru>
parents:
5821
diff
changeset
|
14 ngx_queue_t ngx_posted_next_events; |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
15 ngx_queue_t ngx_posted_events; |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
16 |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
17 |
563 | 18 void |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
19 ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted) |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
20 { |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
21 ngx_queue_t *q; |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
22 ngx_event_t *ev; |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
23 |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
24 while (!ngx_queue_empty(posted)) { |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
25 |
5821
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
26 q = ngx_queue_head(posted); |
3f5f0ab59b35
Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents:
5820
diff
changeset
|
27 ev = ngx_queue_data(q, ngx_event_t, queue); |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
28 |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
29 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
461 | 30 "posted event %p", ev); |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
31 |
375
744ccb59062d
nginx-0.0.7-2004-07-02-19:54:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
374
diff
changeset
|
32 ngx_delete_posted_event(ev); |
744ccb59062d
nginx-0.0.7-2004-07-02-19:54:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
374
diff
changeset
|
33 |
509 | 34 ev->handler(ev); |
306
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
35 } |
6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
36 } |
7612
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
37 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
38 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
39 void |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
40 ngx_event_process_posted_next(ngx_cycle_t *cycle, ngx_queue_t *posted) |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
41 { |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
42 ngx_queue_t *q; |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
43 ngx_event_t *ev; |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
44 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
45 while (!ngx_queue_empty(posted)) { |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
46 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
47 q = ngx_queue_head(posted); |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
48 ev = ngx_queue_data(q, ngx_event_t, queue); |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
49 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
50 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
51 "posted next event %p", ev); |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
52 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
53 ngx_delete_posted_event(ev); |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
54 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
55 if (!ev->ready) { |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
56 ev->ready = 1; |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
57 ev->available = -1; |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
58 } |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
59 |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
60 ev->handler(ev); |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
61 } |
1ce3f01a4355
SSL: reworked posted next events.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7584
diff
changeset
|
62 } |