/src/haproxy/include/haproxy/dynbuf.h
Line | Count | Source |
1 | | /* |
2 | | * include/haproxy/dynbuf.h |
3 | | * Buffer management functions. |
4 | | * |
5 | | * Copyright (C) 2000-2020 Willy Tarreau - w@1wt.eu |
6 | | * |
7 | | * This library is free software; you can redistribute it and/or |
8 | | * modify it under the terms of the GNU Lesser General Public |
9 | | * License as published by the Free Software Foundation, version 2.1 |
10 | | * exclusively. |
11 | | * |
12 | | * This library is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | | * Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public |
18 | | * License along with this library; if not, write to the Free Software |
19 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | | */ |
21 | | |
22 | | #ifndef _HAPROXY_DYNBUF_H |
23 | | #define _HAPROXY_DYNBUF_H |
24 | | |
25 | | #include <stdio.h> |
26 | | #include <stdlib.h> |
27 | | #include <string.h> |
28 | | |
29 | | #include <import/ist.h> |
30 | | #include <haproxy/activity.h> |
31 | | #include <haproxy/api.h> |
32 | | #include <haproxy/buf.h> |
33 | | #include <haproxy/chunk.h> |
34 | | #include <haproxy/dynbuf-t.h> |
35 | | #include <haproxy/global.h> |
36 | | #include <haproxy/pool.h> |
37 | | |
38 | | extern struct pool_head *pool_head_buffer; |
39 | | extern struct pool_head *pool_head_large_buffer; |
40 | | extern struct pool_head *pool_head_small_buffer; |
41 | | |
42 | | int init_buffer(void); |
43 | | void buffer_dump(FILE *o, struct buffer *b, int from, int to); |
44 | | |
45 | | /*****************************************************************/ |
46 | | /* These functions are used to compute various buffer area sizes */ |
47 | | /*****************************************************************/ |
48 | | |
49 | | /* Return 1 if the buffer has less than 1/4 of its capacity free, otherwise 0 */ |
50 | | static inline int buffer_almost_full(const struct buffer *buf) |
51 | 0 | { |
52 | 0 | if (b_is_null(buf)) |
53 | 0 | return 0; |
54 | | |
55 | 0 | return b_almost_full(buf); |
56 | 0 | } Unexecuted instantiation: tools.c:buffer_almost_full Unexecuted instantiation: applet.c:buffer_almost_full Unexecuted instantiation: cfgparse.c:buffer_almost_full Unexecuted instantiation: channel.c:buffer_almost_full Unexecuted instantiation: cli.c:buffer_almost_full Unexecuted instantiation: connection.c:buffer_almost_full Unexecuted instantiation: debug.c:buffer_almost_full Unexecuted instantiation: dynbuf.c:buffer_almost_full Unexecuted instantiation: errors.c:buffer_almost_full Unexecuted instantiation: frontend.c:buffer_almost_full Unexecuted instantiation: haproxy.c:buffer_almost_full Unexecuted instantiation: http_ana.c:buffer_almost_full Unexecuted instantiation: http_ext.c:buffer_almost_full Unexecuted instantiation: htx.c:buffer_almost_full Unexecuted instantiation: log.c:buffer_almost_full Unexecuted instantiation: mworker.c:buffer_almost_full Unexecuted instantiation: peers.c:buffer_almost_full Unexecuted instantiation: pool.c:buffer_almost_full Unexecuted instantiation: proxy.c:buffer_almost_full Unexecuted instantiation: resolvers.c:buffer_almost_full Unexecuted instantiation: ring.c:buffer_almost_full Unexecuted instantiation: sample.c:buffer_almost_full Unexecuted instantiation: server.c:buffer_almost_full Unexecuted instantiation: sink.c:buffer_almost_full Unexecuted instantiation: stats-html.c:buffer_almost_full Unexecuted instantiation: stats.c:buffer_almost_full Unexecuted instantiation: stconn.c:buffer_almost_full Unexecuted instantiation: stick_table.c:buffer_almost_full Unexecuted instantiation: stream.c:buffer_almost_full Unexecuted instantiation: tcp_rules.c:buffer_almost_full Unexecuted instantiation: tcpcheck.c:buffer_almost_full Unexecuted instantiation: trace.c:buffer_almost_full Unexecuted instantiation: vars.c:buffer_almost_full Unexecuted instantiation: activity.c:buffer_almost_full Unexecuted instantiation: backend.c:buffer_almost_full Unexecuted instantiation: check.c:buffer_almost_full Unexecuted instantiation: compression.c:buffer_almost_full Unexecuted instantiation: dns.c:buffer_almost_full Unexecuted instantiation: dns_ring.c:buffer_almost_full Unexecuted instantiation: filters.c:buffer_almost_full Unexecuted instantiation: flt_http_comp.c:buffer_almost_full Unexecuted instantiation: haterm.c:buffer_almost_full Unexecuted instantiation: http_fetch.c:buffer_almost_full Unexecuted instantiation: mux_spop.c:buffer_almost_full Unexecuted instantiation: payload.c:buffer_almost_full Unexecuted instantiation: stats-json.c:buffer_almost_full Unexecuted instantiation: cache.c:buffer_almost_full Unexecuted instantiation: fcgi-app.c:buffer_almost_full Unexecuted instantiation: flt_spoe.c:buffer_almost_full |
57 | | |
58 | | /* Return 1 if <sz> is the default buffer size */ |
59 | | static inline int b_is_default_sz(size_t sz) |
60 | 0 | { |
61 | 0 | return (sz == pool_head_buffer->size); |
62 | 0 | } Unexecuted instantiation: tools.c:b_is_default_sz Unexecuted instantiation: applet.c:b_is_default_sz Unexecuted instantiation: cfgparse.c:b_is_default_sz Unexecuted instantiation: channel.c:b_is_default_sz Unexecuted instantiation: cli.c:b_is_default_sz Unexecuted instantiation: connection.c:b_is_default_sz Unexecuted instantiation: debug.c:b_is_default_sz Unexecuted instantiation: dynbuf.c:b_is_default_sz Unexecuted instantiation: errors.c:b_is_default_sz Unexecuted instantiation: frontend.c:b_is_default_sz Unexecuted instantiation: haproxy.c:b_is_default_sz Unexecuted instantiation: http_ana.c:b_is_default_sz Unexecuted instantiation: http_ext.c:b_is_default_sz Unexecuted instantiation: htx.c:b_is_default_sz Unexecuted instantiation: log.c:b_is_default_sz Unexecuted instantiation: mworker.c:b_is_default_sz Unexecuted instantiation: peers.c:b_is_default_sz Unexecuted instantiation: pool.c:b_is_default_sz Unexecuted instantiation: proxy.c:b_is_default_sz Unexecuted instantiation: resolvers.c:b_is_default_sz Unexecuted instantiation: ring.c:b_is_default_sz Unexecuted instantiation: sample.c:b_is_default_sz Unexecuted instantiation: server.c:b_is_default_sz Unexecuted instantiation: sink.c:b_is_default_sz Unexecuted instantiation: stats-html.c:b_is_default_sz Unexecuted instantiation: stats.c:b_is_default_sz Unexecuted instantiation: stconn.c:b_is_default_sz Unexecuted instantiation: stick_table.c:b_is_default_sz Unexecuted instantiation: stream.c:b_is_default_sz Unexecuted instantiation: tcp_rules.c:b_is_default_sz Unexecuted instantiation: tcpcheck.c:b_is_default_sz Unexecuted instantiation: trace.c:b_is_default_sz Unexecuted instantiation: vars.c:b_is_default_sz Unexecuted instantiation: activity.c:b_is_default_sz Unexecuted instantiation: backend.c:b_is_default_sz Unexecuted instantiation: check.c:b_is_default_sz Unexecuted instantiation: compression.c:b_is_default_sz Unexecuted instantiation: dns.c:b_is_default_sz Unexecuted instantiation: dns_ring.c:b_is_default_sz Unexecuted instantiation: filters.c:b_is_default_sz Unexecuted instantiation: flt_http_comp.c:b_is_default_sz Unexecuted instantiation: haterm.c:b_is_default_sz Unexecuted instantiation: http_fetch.c:b_is_default_sz Unexecuted instantiation: mux_spop.c:b_is_default_sz Unexecuted instantiation: payload.c:b_is_default_sz Unexecuted instantiation: stats-json.c:b_is_default_sz Unexecuted instantiation: cache.c:b_is_default_sz Unexecuted instantiation: fcgi-app.c:b_is_default_sz Unexecuted instantiation: flt_spoe.c:b_is_default_sz |
63 | | |
64 | | /* Return 1 if <sz> is the size of a large buffer (alwoys false is large buffers are not configured) */ |
65 | | static inline int b_is_large_sz(size_t sz) |
66 | 0 | { |
67 | 0 | return (pool_head_large_buffer && sz == pool_head_large_buffer->size); |
68 | 0 | } Unexecuted instantiation: tools.c:b_is_large_sz Unexecuted instantiation: applet.c:b_is_large_sz Unexecuted instantiation: cfgparse.c:b_is_large_sz Unexecuted instantiation: channel.c:b_is_large_sz Unexecuted instantiation: cli.c:b_is_large_sz Unexecuted instantiation: connection.c:b_is_large_sz Unexecuted instantiation: debug.c:b_is_large_sz Unexecuted instantiation: dynbuf.c:b_is_large_sz Unexecuted instantiation: errors.c:b_is_large_sz Unexecuted instantiation: frontend.c:b_is_large_sz Unexecuted instantiation: haproxy.c:b_is_large_sz Unexecuted instantiation: http_ana.c:b_is_large_sz Unexecuted instantiation: http_ext.c:b_is_large_sz Unexecuted instantiation: htx.c:b_is_large_sz Unexecuted instantiation: log.c:b_is_large_sz Unexecuted instantiation: mworker.c:b_is_large_sz Unexecuted instantiation: peers.c:b_is_large_sz Unexecuted instantiation: pool.c:b_is_large_sz Unexecuted instantiation: proxy.c:b_is_large_sz Unexecuted instantiation: resolvers.c:b_is_large_sz Unexecuted instantiation: ring.c:b_is_large_sz Unexecuted instantiation: sample.c:b_is_large_sz Unexecuted instantiation: server.c:b_is_large_sz Unexecuted instantiation: sink.c:b_is_large_sz Unexecuted instantiation: stats-html.c:b_is_large_sz Unexecuted instantiation: stats.c:b_is_large_sz Unexecuted instantiation: stconn.c:b_is_large_sz Unexecuted instantiation: stick_table.c:b_is_large_sz Unexecuted instantiation: stream.c:b_is_large_sz Unexecuted instantiation: tcp_rules.c:b_is_large_sz Unexecuted instantiation: tcpcheck.c:b_is_large_sz Unexecuted instantiation: trace.c:b_is_large_sz Unexecuted instantiation: vars.c:b_is_large_sz Unexecuted instantiation: activity.c:b_is_large_sz Unexecuted instantiation: backend.c:b_is_large_sz Unexecuted instantiation: check.c:b_is_large_sz Unexecuted instantiation: compression.c:b_is_large_sz Unexecuted instantiation: dns.c:b_is_large_sz Unexecuted instantiation: dns_ring.c:b_is_large_sz Unexecuted instantiation: filters.c:b_is_large_sz Unexecuted instantiation: flt_http_comp.c:b_is_large_sz Unexecuted instantiation: haterm.c:b_is_large_sz Unexecuted instantiation: http_fetch.c:b_is_large_sz Unexecuted instantiation: mux_spop.c:b_is_large_sz Unexecuted instantiation: payload.c:b_is_large_sz Unexecuted instantiation: stats-json.c:b_is_large_sz Unexecuted instantiation: cache.c:b_is_large_sz Unexecuted instantiation: fcgi-app.c:b_is_large_sz Unexecuted instantiation: flt_spoe.c:b_is_large_sz |
69 | | |
70 | | /* Return 1 if <sz> is the size of a small buffer */ |
71 | | static inline int b_is_small_sz(size_t sz) |
72 | 0 | { |
73 | 0 | return (pool_head_small_buffer && sz == pool_head_small_buffer->size); |
74 | 0 | } Unexecuted instantiation: tools.c:b_is_small_sz Unexecuted instantiation: applet.c:b_is_small_sz Unexecuted instantiation: cfgparse.c:b_is_small_sz Unexecuted instantiation: channel.c:b_is_small_sz Unexecuted instantiation: cli.c:b_is_small_sz Unexecuted instantiation: connection.c:b_is_small_sz Unexecuted instantiation: debug.c:b_is_small_sz Unexecuted instantiation: dynbuf.c:b_is_small_sz Unexecuted instantiation: errors.c:b_is_small_sz Unexecuted instantiation: frontend.c:b_is_small_sz Unexecuted instantiation: haproxy.c:b_is_small_sz Unexecuted instantiation: http_ana.c:b_is_small_sz Unexecuted instantiation: http_ext.c:b_is_small_sz Unexecuted instantiation: htx.c:b_is_small_sz Unexecuted instantiation: log.c:b_is_small_sz Unexecuted instantiation: mworker.c:b_is_small_sz Unexecuted instantiation: peers.c:b_is_small_sz Unexecuted instantiation: pool.c:b_is_small_sz Unexecuted instantiation: proxy.c:b_is_small_sz Unexecuted instantiation: resolvers.c:b_is_small_sz Unexecuted instantiation: ring.c:b_is_small_sz Unexecuted instantiation: sample.c:b_is_small_sz Unexecuted instantiation: server.c:b_is_small_sz Unexecuted instantiation: sink.c:b_is_small_sz Unexecuted instantiation: stats-html.c:b_is_small_sz Unexecuted instantiation: stats.c:b_is_small_sz Unexecuted instantiation: stconn.c:b_is_small_sz Unexecuted instantiation: stick_table.c:b_is_small_sz Unexecuted instantiation: stream.c:b_is_small_sz Unexecuted instantiation: tcp_rules.c:b_is_small_sz Unexecuted instantiation: tcpcheck.c:b_is_small_sz Unexecuted instantiation: trace.c:b_is_small_sz Unexecuted instantiation: vars.c:b_is_small_sz Unexecuted instantiation: activity.c:b_is_small_sz Unexecuted instantiation: backend.c:b_is_small_sz Unexecuted instantiation: check.c:b_is_small_sz Unexecuted instantiation: compression.c:b_is_small_sz Unexecuted instantiation: dns.c:b_is_small_sz Unexecuted instantiation: dns_ring.c:b_is_small_sz Unexecuted instantiation: filters.c:b_is_small_sz Unexecuted instantiation: flt_http_comp.c:b_is_small_sz Unexecuted instantiation: haterm.c:b_is_small_sz Unexecuted instantiation: http_fetch.c:b_is_small_sz Unexecuted instantiation: mux_spop.c:b_is_small_sz Unexecuted instantiation: payload.c:b_is_small_sz Unexecuted instantiation: stats-json.c:b_is_small_sz Unexecuted instantiation: cache.c:b_is_small_sz Unexecuted instantiation: fcgi-app.c:b_is_small_sz Unexecuted instantiation: flt_spoe.c:b_is_small_sz |
75 | | |
76 | | /* Return 1 if <bug> is a default buffer */ |
77 | | static inline int b_is_default(struct buffer *buf) |
78 | 0 | { |
79 | 0 | return b_is_default_sz(b_size(buf)); |
80 | 0 | } Unexecuted instantiation: tools.c:b_is_default Unexecuted instantiation: applet.c:b_is_default Unexecuted instantiation: cfgparse.c:b_is_default Unexecuted instantiation: channel.c:b_is_default Unexecuted instantiation: cli.c:b_is_default Unexecuted instantiation: connection.c:b_is_default Unexecuted instantiation: debug.c:b_is_default Unexecuted instantiation: dynbuf.c:b_is_default Unexecuted instantiation: errors.c:b_is_default Unexecuted instantiation: frontend.c:b_is_default Unexecuted instantiation: haproxy.c:b_is_default Unexecuted instantiation: http_ana.c:b_is_default Unexecuted instantiation: http_ext.c:b_is_default Unexecuted instantiation: htx.c:b_is_default Unexecuted instantiation: log.c:b_is_default Unexecuted instantiation: mworker.c:b_is_default Unexecuted instantiation: peers.c:b_is_default Unexecuted instantiation: pool.c:b_is_default Unexecuted instantiation: proxy.c:b_is_default Unexecuted instantiation: resolvers.c:b_is_default Unexecuted instantiation: ring.c:b_is_default Unexecuted instantiation: sample.c:b_is_default Unexecuted instantiation: server.c:b_is_default Unexecuted instantiation: sink.c:b_is_default Unexecuted instantiation: stats-html.c:b_is_default Unexecuted instantiation: stats.c:b_is_default Unexecuted instantiation: stconn.c:b_is_default Unexecuted instantiation: stick_table.c:b_is_default Unexecuted instantiation: stream.c:b_is_default Unexecuted instantiation: tcp_rules.c:b_is_default Unexecuted instantiation: tcpcheck.c:b_is_default Unexecuted instantiation: trace.c:b_is_default Unexecuted instantiation: vars.c:b_is_default Unexecuted instantiation: activity.c:b_is_default Unexecuted instantiation: backend.c:b_is_default Unexecuted instantiation: check.c:b_is_default Unexecuted instantiation: compression.c:b_is_default Unexecuted instantiation: dns.c:b_is_default Unexecuted instantiation: dns_ring.c:b_is_default Unexecuted instantiation: filters.c:b_is_default Unexecuted instantiation: flt_http_comp.c:b_is_default Unexecuted instantiation: haterm.c:b_is_default Unexecuted instantiation: http_fetch.c:b_is_default Unexecuted instantiation: mux_spop.c:b_is_default Unexecuted instantiation: payload.c:b_is_default Unexecuted instantiation: stats-json.c:b_is_default Unexecuted instantiation: cache.c:b_is_default Unexecuted instantiation: fcgi-app.c:b_is_default Unexecuted instantiation: flt_spoe.c:b_is_default |
81 | | |
82 | | /* Return 1 if <buf> is a large buffer (alwoys 0 is large buffers are not configured) */ |
83 | | static inline int b_is_large(struct buffer *buf) |
84 | 0 | { |
85 | 0 | return b_is_large_sz(b_size(buf)); |
86 | 0 | } Unexecuted instantiation: tools.c:b_is_large Unexecuted instantiation: applet.c:b_is_large Unexecuted instantiation: cfgparse.c:b_is_large Unexecuted instantiation: channel.c:b_is_large Unexecuted instantiation: cli.c:b_is_large Unexecuted instantiation: connection.c:b_is_large Unexecuted instantiation: debug.c:b_is_large Unexecuted instantiation: dynbuf.c:b_is_large Unexecuted instantiation: errors.c:b_is_large Unexecuted instantiation: frontend.c:b_is_large Unexecuted instantiation: haproxy.c:b_is_large Unexecuted instantiation: http_ana.c:b_is_large Unexecuted instantiation: http_ext.c:b_is_large Unexecuted instantiation: htx.c:b_is_large Unexecuted instantiation: log.c:b_is_large Unexecuted instantiation: mworker.c:b_is_large Unexecuted instantiation: peers.c:b_is_large Unexecuted instantiation: pool.c:b_is_large Unexecuted instantiation: proxy.c:b_is_large Unexecuted instantiation: resolvers.c:b_is_large Unexecuted instantiation: ring.c:b_is_large Unexecuted instantiation: sample.c:b_is_large Unexecuted instantiation: server.c:b_is_large Unexecuted instantiation: sink.c:b_is_large Unexecuted instantiation: stats-html.c:b_is_large Unexecuted instantiation: stats.c:b_is_large Unexecuted instantiation: stconn.c:b_is_large Unexecuted instantiation: stick_table.c:b_is_large Unexecuted instantiation: stream.c:b_is_large Unexecuted instantiation: tcp_rules.c:b_is_large Unexecuted instantiation: tcpcheck.c:b_is_large Unexecuted instantiation: trace.c:b_is_large Unexecuted instantiation: vars.c:b_is_large Unexecuted instantiation: activity.c:b_is_large Unexecuted instantiation: backend.c:b_is_large Unexecuted instantiation: check.c:b_is_large Unexecuted instantiation: compression.c:b_is_large Unexecuted instantiation: dns.c:b_is_large Unexecuted instantiation: dns_ring.c:b_is_large Unexecuted instantiation: filters.c:b_is_large Unexecuted instantiation: flt_http_comp.c:b_is_large Unexecuted instantiation: haterm.c:b_is_large Unexecuted instantiation: http_fetch.c:b_is_large Unexecuted instantiation: mux_spop.c:b_is_large Unexecuted instantiation: payload.c:b_is_large Unexecuted instantiation: stats-json.c:b_is_large Unexecuted instantiation: cache.c:b_is_large Unexecuted instantiation: fcgi-app.c:b_is_large Unexecuted instantiation: flt_spoe.c:b_is_large |
87 | | |
88 | | /* Return 1 if <buf> is a small buffer */ |
89 | | static inline int b_is_small(struct buffer *buf) |
90 | 0 | { |
91 | 0 | return b_is_small_sz(b_size(buf)); |
92 | 0 | } Unexecuted instantiation: tools.c:b_is_small Unexecuted instantiation: applet.c:b_is_small Unexecuted instantiation: cfgparse.c:b_is_small Unexecuted instantiation: channel.c:b_is_small Unexecuted instantiation: cli.c:b_is_small Unexecuted instantiation: connection.c:b_is_small Unexecuted instantiation: debug.c:b_is_small Unexecuted instantiation: dynbuf.c:b_is_small Unexecuted instantiation: errors.c:b_is_small Unexecuted instantiation: frontend.c:b_is_small Unexecuted instantiation: haproxy.c:b_is_small Unexecuted instantiation: http_ana.c:b_is_small Unexecuted instantiation: http_ext.c:b_is_small Unexecuted instantiation: htx.c:b_is_small Unexecuted instantiation: log.c:b_is_small Unexecuted instantiation: mworker.c:b_is_small Unexecuted instantiation: peers.c:b_is_small Unexecuted instantiation: pool.c:b_is_small Unexecuted instantiation: proxy.c:b_is_small Unexecuted instantiation: resolvers.c:b_is_small Unexecuted instantiation: ring.c:b_is_small Unexecuted instantiation: sample.c:b_is_small Unexecuted instantiation: server.c:b_is_small Unexecuted instantiation: sink.c:b_is_small Unexecuted instantiation: stats-html.c:b_is_small Unexecuted instantiation: stats.c:b_is_small Unexecuted instantiation: stconn.c:b_is_small Unexecuted instantiation: stick_table.c:b_is_small Unexecuted instantiation: stream.c:b_is_small Unexecuted instantiation: tcp_rules.c:b_is_small Unexecuted instantiation: tcpcheck.c:b_is_small Unexecuted instantiation: trace.c:b_is_small Unexecuted instantiation: vars.c:b_is_small Unexecuted instantiation: activity.c:b_is_small Unexecuted instantiation: backend.c:b_is_small Unexecuted instantiation: check.c:b_is_small Unexecuted instantiation: compression.c:b_is_small Unexecuted instantiation: dns.c:b_is_small Unexecuted instantiation: dns_ring.c:b_is_small Unexecuted instantiation: filters.c:b_is_small Unexecuted instantiation: flt_http_comp.c:b_is_small Unexecuted instantiation: haterm.c:b_is_small Unexecuted instantiation: http_fetch.c:b_is_small Unexecuted instantiation: mux_spop.c:b_is_small Unexecuted instantiation: payload.c:b_is_small Unexecuted instantiation: stats-json.c:b_is_small Unexecuted instantiation: cache.c:b_is_small Unexecuted instantiation: fcgi-app.c:b_is_small Unexecuted instantiation: flt_spoe.c:b_is_small |
93 | | |
94 | | /**************************************************/ |
95 | | /* Functions below are used for buffer allocation */ |
96 | | /**************************************************/ |
97 | | |
98 | | /* returns non-zero if one may try to allocate a buffer for criticality flags |
99 | | * <crit> (made of a criticality and optional flags). |
100 | | */ |
101 | | static inline int b_may_alloc_for_crit(uint crit) |
102 | 0 | { |
103 | 0 | int q = DB_CRIT_TO_QUEUE(crit & DB_F_CRIT_MASK); |
104 | | |
105 | | /* if this queue or any more critical ones have entries, we must wait */ |
106 | 0 | if (!(crit & DB_F_NOQUEUE) && th_ctx->bufq_map & ((2 << q) - 1)) |
107 | 0 | return 0; |
108 | | |
109 | | /* If the emergency buffers are too low, we won't try to allocate a |
110 | | * buffer either so that we speed up their release. As a corrolary, it |
111 | | * means that we're always allowed to try to fall back to an emergency |
112 | | * buffer if pool_alloc() fails. The minimum number of available |
113 | | * emergency buffers for an allocation depends on the queue: |
114 | | * q == 0 -> 0% |
115 | | * q == 1 -> 33% |
116 | | * q == 2 -> 66% |
117 | | * q == 3 -> 100% |
118 | | */ |
119 | 0 | if (th_ctx->emergency_bufs_left * 3 < q * global.tune.reserved_bufs) |
120 | 0 | return 0; |
121 | 0 | return 1; |
122 | 0 | } Unexecuted instantiation: tools.c:b_may_alloc_for_crit Unexecuted instantiation: applet.c:b_may_alloc_for_crit Unexecuted instantiation: cfgparse.c:b_may_alloc_for_crit Unexecuted instantiation: channel.c:b_may_alloc_for_crit Unexecuted instantiation: cli.c:b_may_alloc_for_crit Unexecuted instantiation: connection.c:b_may_alloc_for_crit Unexecuted instantiation: debug.c:b_may_alloc_for_crit Unexecuted instantiation: dynbuf.c:b_may_alloc_for_crit Unexecuted instantiation: errors.c:b_may_alloc_for_crit Unexecuted instantiation: frontend.c:b_may_alloc_for_crit Unexecuted instantiation: haproxy.c:b_may_alloc_for_crit Unexecuted instantiation: http_ana.c:b_may_alloc_for_crit Unexecuted instantiation: http_ext.c:b_may_alloc_for_crit Unexecuted instantiation: htx.c:b_may_alloc_for_crit Unexecuted instantiation: log.c:b_may_alloc_for_crit Unexecuted instantiation: mworker.c:b_may_alloc_for_crit Unexecuted instantiation: peers.c:b_may_alloc_for_crit Unexecuted instantiation: pool.c:b_may_alloc_for_crit Unexecuted instantiation: proxy.c:b_may_alloc_for_crit Unexecuted instantiation: resolvers.c:b_may_alloc_for_crit Unexecuted instantiation: ring.c:b_may_alloc_for_crit Unexecuted instantiation: sample.c:b_may_alloc_for_crit Unexecuted instantiation: server.c:b_may_alloc_for_crit Unexecuted instantiation: sink.c:b_may_alloc_for_crit Unexecuted instantiation: stats-html.c:b_may_alloc_for_crit Unexecuted instantiation: stats.c:b_may_alloc_for_crit Unexecuted instantiation: stconn.c:b_may_alloc_for_crit Unexecuted instantiation: stick_table.c:b_may_alloc_for_crit Unexecuted instantiation: stream.c:b_may_alloc_for_crit Unexecuted instantiation: tcp_rules.c:b_may_alloc_for_crit Unexecuted instantiation: tcpcheck.c:b_may_alloc_for_crit Unexecuted instantiation: trace.c:b_may_alloc_for_crit Unexecuted instantiation: vars.c:b_may_alloc_for_crit Unexecuted instantiation: activity.c:b_may_alloc_for_crit Unexecuted instantiation: backend.c:b_may_alloc_for_crit Unexecuted instantiation: check.c:b_may_alloc_for_crit Unexecuted instantiation: compression.c:b_may_alloc_for_crit Unexecuted instantiation: dns.c:b_may_alloc_for_crit Unexecuted instantiation: dns_ring.c:b_may_alloc_for_crit Unexecuted instantiation: filters.c:b_may_alloc_for_crit Unexecuted instantiation: flt_http_comp.c:b_may_alloc_for_crit Unexecuted instantiation: haterm.c:b_may_alloc_for_crit Unexecuted instantiation: http_fetch.c:b_may_alloc_for_crit Unexecuted instantiation: mux_spop.c:b_may_alloc_for_crit Unexecuted instantiation: payload.c:b_may_alloc_for_crit Unexecuted instantiation: stats-json.c:b_may_alloc_for_crit Unexecuted instantiation: cache.c:b_may_alloc_for_crit Unexecuted instantiation: fcgi-app.c:b_may_alloc_for_crit Unexecuted instantiation: flt_spoe.c:b_may_alloc_for_crit |
123 | | |
124 | | /* Allocates one of the emergency buffers or returns NULL if there are none left */ |
125 | | static inline char *__b_get_emergency_buf(void) |
126 | 0 | { |
127 | 0 | char *ret; |
128 | |
|
129 | 0 | if (!th_ctx->emergency_bufs_left) |
130 | 0 | return NULL; |
131 | | |
132 | 0 | th_ctx->emergency_bufs_left--; |
133 | 0 | ret = th_ctx->emergency_bufs[th_ctx->emergency_bufs_left]; |
134 | 0 | th_ctx->emergency_bufs[th_ctx->emergency_bufs_left] = NULL; |
135 | 0 | return ret; |
136 | 0 | } Unexecuted instantiation: tools.c:__b_get_emergency_buf Unexecuted instantiation: applet.c:__b_get_emergency_buf Unexecuted instantiation: cfgparse.c:__b_get_emergency_buf Unexecuted instantiation: channel.c:__b_get_emergency_buf Unexecuted instantiation: cli.c:__b_get_emergency_buf Unexecuted instantiation: connection.c:__b_get_emergency_buf Unexecuted instantiation: debug.c:__b_get_emergency_buf Unexecuted instantiation: dynbuf.c:__b_get_emergency_buf Unexecuted instantiation: errors.c:__b_get_emergency_buf Unexecuted instantiation: frontend.c:__b_get_emergency_buf Unexecuted instantiation: haproxy.c:__b_get_emergency_buf Unexecuted instantiation: http_ana.c:__b_get_emergency_buf Unexecuted instantiation: http_ext.c:__b_get_emergency_buf Unexecuted instantiation: htx.c:__b_get_emergency_buf Unexecuted instantiation: log.c:__b_get_emergency_buf Unexecuted instantiation: mworker.c:__b_get_emergency_buf Unexecuted instantiation: peers.c:__b_get_emergency_buf Unexecuted instantiation: pool.c:__b_get_emergency_buf Unexecuted instantiation: proxy.c:__b_get_emergency_buf Unexecuted instantiation: resolvers.c:__b_get_emergency_buf Unexecuted instantiation: ring.c:__b_get_emergency_buf Unexecuted instantiation: sample.c:__b_get_emergency_buf Unexecuted instantiation: server.c:__b_get_emergency_buf Unexecuted instantiation: sink.c:__b_get_emergency_buf Unexecuted instantiation: stats-html.c:__b_get_emergency_buf Unexecuted instantiation: stats.c:__b_get_emergency_buf Unexecuted instantiation: stconn.c:__b_get_emergency_buf Unexecuted instantiation: stick_table.c:__b_get_emergency_buf Unexecuted instantiation: stream.c:__b_get_emergency_buf Unexecuted instantiation: tcp_rules.c:__b_get_emergency_buf Unexecuted instantiation: tcpcheck.c:__b_get_emergency_buf Unexecuted instantiation: trace.c:__b_get_emergency_buf Unexecuted instantiation: vars.c:__b_get_emergency_buf Unexecuted instantiation: activity.c:__b_get_emergency_buf Unexecuted instantiation: backend.c:__b_get_emergency_buf Unexecuted instantiation: check.c:__b_get_emergency_buf Unexecuted instantiation: compression.c:__b_get_emergency_buf Unexecuted instantiation: dns.c:__b_get_emergency_buf Unexecuted instantiation: dns_ring.c:__b_get_emergency_buf Unexecuted instantiation: filters.c:__b_get_emergency_buf Unexecuted instantiation: flt_http_comp.c:__b_get_emergency_buf Unexecuted instantiation: haterm.c:__b_get_emergency_buf Unexecuted instantiation: http_fetch.c:__b_get_emergency_buf Unexecuted instantiation: mux_spop.c:__b_get_emergency_buf Unexecuted instantiation: payload.c:__b_get_emergency_buf Unexecuted instantiation: stats-json.c:__b_get_emergency_buf Unexecuted instantiation: cache.c:__b_get_emergency_buf Unexecuted instantiation: fcgi-app.c:__b_get_emergency_buf Unexecuted instantiation: flt_spoe.c:__b_get_emergency_buf |
137 | | |
138 | | /* Ensures that <buf> is allocated, or allocates it. If no memory is available, |
139 | | * ((char *)1) is assigned instead with a zero size. The allocated buffer is |
140 | | * returned, or NULL in case no memory is available. Since buffers only contain |
141 | | * user data, poisonning is always disabled as it brings no benefit and impacts |
142 | | * performance. Due to the difficult buffer_wait management, they are not |
143 | | * subject to forced allocation failures either. If other waiters are present |
144 | | * at higher criticality levels, we refrain from allocating. |
145 | | */ |
146 | 0 | #define b_alloc(_buf, _crit) \ |
147 | 0 | ({ \ |
148 | 0 | char *_area = NULL; \ |
149 | 0 | struct buffer *_retbuf = _buf; \ |
150 | 0 | uint _criticality = _crit; \ |
151 | 0 | \ |
152 | 0 | if (!_retbuf->size) { \ |
153 | 0 | *_retbuf = BUF_WANTED; \ |
154 | 0 | if (b_may_alloc_for_crit(_criticality)) { \ |
155 | 0 | _area = pool_alloc_flag(pool_head_buffer, POOL_F_NO_POISON | POOL_F_NO_FAIL); \ |
156 | 0 | if (unlikely(!_area)) \ |
157 | 0 | _area = __b_get_emergency_buf(); \ |
158 | 0 | } \ |
159 | 0 | if (unlikely(!_area)) { \ |
160 | 0 | activity[tid].buf_wait++; \ |
161 | 0 | _retbuf = NULL; \ |
162 | 0 | } \ |
163 | 0 | else { \ |
164 | 0 | _retbuf->area = _area; \ |
165 | 0 | _retbuf->size = pool_head_buffer->size; \ |
166 | 0 | } \ |
167 | 0 | } \ |
168 | 0 | _retbuf; \ |
169 | 0 | }) |
170 | | |
171 | | /* Releases buffer <buf> (no check of emptiness). The buffer's head is marked |
172 | | * empty. |
173 | | */ |
174 | | #define __b_free(_buf) \ |
175 | 0 | do { \ |
176 | 0 | char *area = (_buf)->area; \ |
177 | 0 | size_t sz = (_buf)->size; \ |
178 | 0 | \ |
179 | 0 | /* let's first clear the area to save an occasional "show sess all" \ |
180 | 0 | * glancing over our shoulder from getting a dangling pointer. \ |
181 | 0 | */ \ |
182 | 0 | *(_buf) = BUF_NULL; \ |
183 | 0 | __ha_barrier_store(); \ |
184 | 0 | /* if enabled, large buffers are always strictly greater \ |
185 | 0 | * than the default buffers */ \ |
186 | 0 | if (unlikely(b_is_large_sz(sz))) \ |
187 | 0 | pool_free(pool_head_large_buffer, area); \ |
188 | 0 | else if (unlikely(b_is_small_sz(sz))) \ |
189 | 0 | pool_free(pool_head_small_buffer, area); \ |
190 | 0 | else if (th_ctx->emergency_bufs_left < global.tune.reserved_bufs) \ |
191 | 0 | th_ctx->emergency_bufs[th_ctx->emergency_bufs_left++] = area; \ |
192 | 0 | else \ |
193 | 0 | pool_free(pool_head_buffer, area); \ |
194 | 0 | } while (0) \ |
195 | | |
196 | | /* Releases buffer <buf> if allocated, and marks it empty. */ |
197 | | #define b_free(_buf) \ |
198 | 0 | do { \ |
199 | 0 | if ((_buf)->size) \ |
200 | 0 | __b_free((_buf)); \ |
201 | 0 | } while (0) |
202 | | |
203 | | |
204 | | static inline struct buffer *b_alloc_small(struct buffer *buf) |
205 | 0 | { |
206 | 0 | char *area = NULL; |
207 | |
|
208 | 0 | if (!buf->size) { |
209 | 0 | area = pool_alloc(pool_head_small_buffer); |
210 | 0 | if (!area) |
211 | 0 | return NULL; |
212 | 0 | buf->area = area; |
213 | 0 | buf->size = global.tune.bufsize_small; |
214 | 0 | } |
215 | 0 | return buf; |
216 | 0 | } Unexecuted instantiation: tools.c:b_alloc_small Unexecuted instantiation: applet.c:b_alloc_small Unexecuted instantiation: cfgparse.c:b_alloc_small Unexecuted instantiation: channel.c:b_alloc_small Unexecuted instantiation: cli.c:b_alloc_small Unexecuted instantiation: connection.c:b_alloc_small Unexecuted instantiation: debug.c:b_alloc_small Unexecuted instantiation: dynbuf.c:b_alloc_small Unexecuted instantiation: errors.c:b_alloc_small Unexecuted instantiation: frontend.c:b_alloc_small Unexecuted instantiation: haproxy.c:b_alloc_small Unexecuted instantiation: http_ana.c:b_alloc_small Unexecuted instantiation: http_ext.c:b_alloc_small Unexecuted instantiation: htx.c:b_alloc_small Unexecuted instantiation: log.c:b_alloc_small Unexecuted instantiation: mworker.c:b_alloc_small Unexecuted instantiation: peers.c:b_alloc_small Unexecuted instantiation: pool.c:b_alloc_small Unexecuted instantiation: proxy.c:b_alloc_small Unexecuted instantiation: resolvers.c:b_alloc_small Unexecuted instantiation: ring.c:b_alloc_small Unexecuted instantiation: sample.c:b_alloc_small Unexecuted instantiation: server.c:b_alloc_small Unexecuted instantiation: sink.c:b_alloc_small Unexecuted instantiation: stats-html.c:b_alloc_small Unexecuted instantiation: stats.c:b_alloc_small Unexecuted instantiation: stconn.c:b_alloc_small Unexecuted instantiation: stick_table.c:b_alloc_small Unexecuted instantiation: stream.c:b_alloc_small Unexecuted instantiation: tcp_rules.c:b_alloc_small Unexecuted instantiation: tcpcheck.c:b_alloc_small Unexecuted instantiation: trace.c:b_alloc_small Unexecuted instantiation: vars.c:b_alloc_small Unexecuted instantiation: activity.c:b_alloc_small Unexecuted instantiation: backend.c:b_alloc_small Unexecuted instantiation: check.c:b_alloc_small Unexecuted instantiation: compression.c:b_alloc_small Unexecuted instantiation: dns.c:b_alloc_small Unexecuted instantiation: dns_ring.c:b_alloc_small Unexecuted instantiation: filters.c:b_alloc_small Unexecuted instantiation: flt_http_comp.c:b_alloc_small Unexecuted instantiation: haterm.c:b_alloc_small Unexecuted instantiation: http_fetch.c:b_alloc_small Unexecuted instantiation: mux_spop.c:b_alloc_small Unexecuted instantiation: payload.c:b_alloc_small Unexecuted instantiation: stats-json.c:b_alloc_small Unexecuted instantiation: cache.c:b_alloc_small Unexecuted instantiation: fcgi-app.c:b_alloc_small Unexecuted instantiation: flt_spoe.c:b_alloc_small |
217 | | |
218 | | static inline struct buffer *b_alloc_large(struct buffer *buf) |
219 | 0 | { |
220 | 0 | char *area = NULL; |
221 | |
|
222 | 0 | if (!buf->size) { |
223 | 0 | area = pool_alloc(pool_head_large_buffer); |
224 | 0 | if (!area) |
225 | 0 | return NULL; |
226 | 0 | buf->area = area; |
227 | 0 | buf->size = global.tune.bufsize_large; |
228 | 0 | } |
229 | 0 | return buf; |
230 | 0 | } Unexecuted instantiation: tools.c:b_alloc_large Unexecuted instantiation: applet.c:b_alloc_large Unexecuted instantiation: cfgparse.c:b_alloc_large Unexecuted instantiation: channel.c:b_alloc_large Unexecuted instantiation: cli.c:b_alloc_large Unexecuted instantiation: connection.c:b_alloc_large Unexecuted instantiation: debug.c:b_alloc_large Unexecuted instantiation: dynbuf.c:b_alloc_large Unexecuted instantiation: errors.c:b_alloc_large Unexecuted instantiation: frontend.c:b_alloc_large Unexecuted instantiation: haproxy.c:b_alloc_large Unexecuted instantiation: http_ana.c:b_alloc_large Unexecuted instantiation: http_ext.c:b_alloc_large Unexecuted instantiation: htx.c:b_alloc_large Unexecuted instantiation: log.c:b_alloc_large Unexecuted instantiation: mworker.c:b_alloc_large Unexecuted instantiation: peers.c:b_alloc_large Unexecuted instantiation: pool.c:b_alloc_large Unexecuted instantiation: proxy.c:b_alloc_large Unexecuted instantiation: resolvers.c:b_alloc_large Unexecuted instantiation: ring.c:b_alloc_large Unexecuted instantiation: sample.c:b_alloc_large Unexecuted instantiation: server.c:b_alloc_large Unexecuted instantiation: sink.c:b_alloc_large Unexecuted instantiation: stats-html.c:b_alloc_large Unexecuted instantiation: stats.c:b_alloc_large Unexecuted instantiation: stconn.c:b_alloc_large Unexecuted instantiation: stick_table.c:b_alloc_large Unexecuted instantiation: stream.c:b_alloc_large Unexecuted instantiation: tcp_rules.c:b_alloc_large Unexecuted instantiation: tcpcheck.c:b_alloc_large Unexecuted instantiation: trace.c:b_alloc_large Unexecuted instantiation: vars.c:b_alloc_large Unexecuted instantiation: activity.c:b_alloc_large Unexecuted instantiation: backend.c:b_alloc_large Unexecuted instantiation: check.c:b_alloc_large Unexecuted instantiation: compression.c:b_alloc_large Unexecuted instantiation: dns.c:b_alloc_large Unexecuted instantiation: dns_ring.c:b_alloc_large Unexecuted instantiation: filters.c:b_alloc_large Unexecuted instantiation: flt_http_comp.c:b_alloc_large Unexecuted instantiation: haterm.c:b_alloc_large Unexecuted instantiation: http_fetch.c:b_alloc_large Unexecuted instantiation: mux_spop.c:b_alloc_large Unexecuted instantiation: payload.c:b_alloc_large Unexecuted instantiation: stats-json.c:b_alloc_large Unexecuted instantiation: cache.c:b_alloc_large Unexecuted instantiation: fcgi-app.c:b_alloc_large Unexecuted instantiation: flt_spoe.c:b_alloc_large |
231 | | |
232 | | /* Offer one or multiple buffer currently belonging to target <from> to whoever |
233 | | * needs one. Any pointer is valid for <from>, including NULL. Its purpose is |
234 | | * to avoid passing a buffer to oneself in case of failed allocations (e.g. |
235 | | * need two buffers, get one, fail, release it and wake up self again). In case |
236 | | * of normal buffer release where it is expected that the caller is not waiting |
237 | | * for a buffer, NULL is fine. It will wake waiters on the current thread only. |
238 | | */ |
239 | | void __offer_buffers(void *from, unsigned int count); |
240 | | |
241 | | static inline void offer_buffers(void *from, unsigned int count) |
242 | 0 | { |
243 | 0 | int q; |
244 | |
|
245 | 0 | if (likely(!th_ctx->bufq_map)) |
246 | 0 | return; |
247 | | |
248 | 0 | for (q = 0; q < DYNBUF_NBQ; q++) { |
249 | 0 | if (!(th_ctx->bufq_map & (1 << q))) |
250 | 0 | continue; |
251 | | |
252 | 0 | BUG_ON_HOT(LIST_ISEMPTY(&th_ctx->buffer_wq[q])); |
253 | 0 | __offer_buffers(from, count); |
254 | 0 | break; |
255 | 0 | } |
256 | 0 | } Unexecuted instantiation: tools.c:offer_buffers Unexecuted instantiation: applet.c:offer_buffers Unexecuted instantiation: cfgparse.c:offer_buffers Unexecuted instantiation: channel.c:offer_buffers Unexecuted instantiation: cli.c:offer_buffers Unexecuted instantiation: connection.c:offer_buffers Unexecuted instantiation: debug.c:offer_buffers Unexecuted instantiation: dynbuf.c:offer_buffers Unexecuted instantiation: errors.c:offer_buffers Unexecuted instantiation: frontend.c:offer_buffers Unexecuted instantiation: haproxy.c:offer_buffers Unexecuted instantiation: http_ana.c:offer_buffers Unexecuted instantiation: http_ext.c:offer_buffers Unexecuted instantiation: htx.c:offer_buffers Unexecuted instantiation: log.c:offer_buffers Unexecuted instantiation: mworker.c:offer_buffers Unexecuted instantiation: peers.c:offer_buffers Unexecuted instantiation: pool.c:offer_buffers Unexecuted instantiation: proxy.c:offer_buffers Unexecuted instantiation: resolvers.c:offer_buffers Unexecuted instantiation: ring.c:offer_buffers Unexecuted instantiation: sample.c:offer_buffers Unexecuted instantiation: server.c:offer_buffers Unexecuted instantiation: sink.c:offer_buffers Unexecuted instantiation: stats-html.c:offer_buffers Unexecuted instantiation: stats.c:offer_buffers Unexecuted instantiation: stconn.c:offer_buffers Unexecuted instantiation: stick_table.c:offer_buffers Unexecuted instantiation: stream.c:offer_buffers Unexecuted instantiation: tcp_rules.c:offer_buffers Unexecuted instantiation: tcpcheck.c:offer_buffers Unexecuted instantiation: trace.c:offer_buffers Unexecuted instantiation: vars.c:offer_buffers Unexecuted instantiation: activity.c:offer_buffers Unexecuted instantiation: backend.c:offer_buffers Unexecuted instantiation: check.c:offer_buffers Unexecuted instantiation: compression.c:offer_buffers Unexecuted instantiation: dns.c:offer_buffers Unexecuted instantiation: dns_ring.c:offer_buffers Unexecuted instantiation: filters.c:offer_buffers Unexecuted instantiation: flt_http_comp.c:offer_buffers Unexecuted instantiation: haterm.c:offer_buffers Unexecuted instantiation: http_fetch.c:offer_buffers Unexecuted instantiation: mux_spop.c:offer_buffers Unexecuted instantiation: payload.c:offer_buffers Unexecuted instantiation: stats-json.c:offer_buffers Unexecuted instantiation: cache.c:offer_buffers Unexecuted instantiation: fcgi-app.c:offer_buffers Unexecuted instantiation: flt_spoe.c:offer_buffers |
257 | | |
258 | | /* Queues a buffer request for the current thread via <bw>, and returns |
259 | | * non-zero if the criticality allows to queue a request, otherwise returns |
260 | | * zero. If the <bw> was already queued, non-zero is returned so that the call |
261 | | * is idempotent. It is assumed that the buffer_wait struct had already been |
262 | | * preset with its context and callback, otherwise please use b_queue() |
263 | | * instead. |
264 | | */ |
265 | | static inline int b_requeue(enum dynbuf_crit crit, struct buffer_wait *bw) |
266 | 0 | { |
267 | 0 | int q = DB_CRIT_TO_QUEUE(crit); |
268 | |
|
269 | 0 | if (LIST_INLIST(&bw->list)) |
270 | 0 | return 1; |
271 | | |
272 | | /* these ones are never queued */ |
273 | 0 | if (crit < DB_MUX_RX) |
274 | 0 | return 0; |
275 | | |
276 | 0 | th_ctx->bufq_map |= 1 << q; |
277 | 0 | LIST_APPEND(&th_ctx->buffer_wq[q], &bw->list); |
278 | 0 | return 1; |
279 | 0 | } Unexecuted instantiation: tools.c:b_requeue Unexecuted instantiation: applet.c:b_requeue Unexecuted instantiation: cfgparse.c:b_requeue Unexecuted instantiation: channel.c:b_requeue Unexecuted instantiation: cli.c:b_requeue Unexecuted instantiation: connection.c:b_requeue Unexecuted instantiation: debug.c:b_requeue Unexecuted instantiation: dynbuf.c:b_requeue Unexecuted instantiation: errors.c:b_requeue Unexecuted instantiation: frontend.c:b_requeue Unexecuted instantiation: haproxy.c:b_requeue Unexecuted instantiation: http_ana.c:b_requeue Unexecuted instantiation: http_ext.c:b_requeue Unexecuted instantiation: htx.c:b_requeue Unexecuted instantiation: log.c:b_requeue Unexecuted instantiation: mworker.c:b_requeue Unexecuted instantiation: peers.c:b_requeue Unexecuted instantiation: pool.c:b_requeue Unexecuted instantiation: proxy.c:b_requeue Unexecuted instantiation: resolvers.c:b_requeue Unexecuted instantiation: ring.c:b_requeue Unexecuted instantiation: sample.c:b_requeue Unexecuted instantiation: server.c:b_requeue Unexecuted instantiation: sink.c:b_requeue Unexecuted instantiation: stats-html.c:b_requeue Unexecuted instantiation: stats.c:b_requeue Unexecuted instantiation: stconn.c:b_requeue Unexecuted instantiation: stick_table.c:b_requeue Unexecuted instantiation: stream.c:b_requeue Unexecuted instantiation: tcp_rules.c:b_requeue Unexecuted instantiation: tcpcheck.c:b_requeue Unexecuted instantiation: trace.c:b_requeue Unexecuted instantiation: vars.c:b_requeue Unexecuted instantiation: activity.c:b_requeue Unexecuted instantiation: backend.c:b_requeue Unexecuted instantiation: check.c:b_requeue Unexecuted instantiation: compression.c:b_requeue Unexecuted instantiation: dns.c:b_requeue Unexecuted instantiation: dns_ring.c:b_requeue Unexecuted instantiation: filters.c:b_requeue Unexecuted instantiation: flt_http_comp.c:b_requeue Unexecuted instantiation: haterm.c:b_requeue Unexecuted instantiation: http_fetch.c:b_requeue Unexecuted instantiation: mux_spop.c:b_requeue Unexecuted instantiation: payload.c:b_requeue Unexecuted instantiation: stats-json.c:b_requeue Unexecuted instantiation: cache.c:b_requeue Unexecuted instantiation: fcgi-app.c:b_requeue Unexecuted instantiation: flt_spoe.c:b_requeue |
280 | | |
281 | | /* Queues a buffer request for the current thread via <bw> with the given <ctx> |
282 | | * and <cb>, and returns non-zero if the criticality allows to queue a request, |
283 | | * otherwise returns zero. If the <bw> was already queued, non-zero is returned |
284 | | * so that the call is idempotent. If the buffer_wait struct had already been |
285 | | * preset with the ctx and cb, please use the lighter b_requeue() instead. |
286 | | */ |
287 | | static inline int b_queue(enum dynbuf_crit crit, struct buffer_wait *bw, void *ctx, int (*cb)(void *)) |
288 | 0 | { |
289 | 0 | bw->target = ctx; |
290 | 0 | bw->wakeup_cb = cb; |
291 | 0 | return b_requeue(crit, bw); |
292 | 0 | } Unexecuted instantiation: tools.c:b_queue Unexecuted instantiation: applet.c:b_queue Unexecuted instantiation: cfgparse.c:b_queue Unexecuted instantiation: channel.c:b_queue Unexecuted instantiation: cli.c:b_queue Unexecuted instantiation: connection.c:b_queue Unexecuted instantiation: debug.c:b_queue Unexecuted instantiation: dynbuf.c:b_queue Unexecuted instantiation: errors.c:b_queue Unexecuted instantiation: frontend.c:b_queue Unexecuted instantiation: haproxy.c:b_queue Unexecuted instantiation: http_ana.c:b_queue Unexecuted instantiation: http_ext.c:b_queue Unexecuted instantiation: htx.c:b_queue Unexecuted instantiation: log.c:b_queue Unexecuted instantiation: mworker.c:b_queue Unexecuted instantiation: peers.c:b_queue Unexecuted instantiation: pool.c:b_queue Unexecuted instantiation: proxy.c:b_queue Unexecuted instantiation: resolvers.c:b_queue Unexecuted instantiation: ring.c:b_queue Unexecuted instantiation: sample.c:b_queue Unexecuted instantiation: server.c:b_queue Unexecuted instantiation: sink.c:b_queue Unexecuted instantiation: stats-html.c:b_queue Unexecuted instantiation: stats.c:b_queue Unexecuted instantiation: stconn.c:b_queue Unexecuted instantiation: stick_table.c:b_queue Unexecuted instantiation: stream.c:b_queue Unexecuted instantiation: tcp_rules.c:b_queue Unexecuted instantiation: tcpcheck.c:b_queue Unexecuted instantiation: trace.c:b_queue Unexecuted instantiation: vars.c:b_queue Unexecuted instantiation: activity.c:b_queue Unexecuted instantiation: backend.c:b_queue Unexecuted instantiation: check.c:b_queue Unexecuted instantiation: compression.c:b_queue Unexecuted instantiation: dns.c:b_queue Unexecuted instantiation: dns_ring.c:b_queue Unexecuted instantiation: filters.c:b_queue Unexecuted instantiation: flt_http_comp.c:b_queue Unexecuted instantiation: haterm.c:b_queue Unexecuted instantiation: http_fetch.c:b_queue Unexecuted instantiation: mux_spop.c:b_queue Unexecuted instantiation: payload.c:b_queue Unexecuted instantiation: stats-json.c:b_queue Unexecuted instantiation: cache.c:b_queue Unexecuted instantiation: fcgi-app.c:b_queue Unexecuted instantiation: flt_spoe.c:b_queue |
293 | | |
294 | | /* Dequeues bw element <bw> from its list at for thread <thr> and updates the |
295 | | * thread's bufq_map if it was the last element. The element is assumed to be |
296 | | * in a list (it's the caller's job to test it). This is only meant to really |
297 | | * be used either by the owner thread or under thread isolation. You should |
298 | | * use b_dequeue() instead. |
299 | | */ |
300 | | static inline void _b_dequeue(struct buffer_wait *bw, int thr) |
301 | 0 | { |
302 | 0 | struct thread_ctx *ctx = &ha_thread_ctx[thr]; |
303 | 0 | uint q; |
304 | | |
305 | | /* trick: detect if we're the last one and pointing to a root, so we |
306 | | * can figure the queue number since the root belongs to an array. |
307 | | */ |
308 | 0 | if (LIST_ATMOST1(&bw->list)) { |
309 | | /* OK then which root? */ |
310 | 0 | q = bw->list.n - &ctx->buffer_wq[0]; |
311 | 0 | BUG_ON_HOT(q >= DYNBUF_NBQ); |
312 | 0 | ctx->bufq_map &= ~(1 << q); |
313 | 0 | } |
314 | 0 | LIST_DEL_INIT(&bw->list); |
315 | 0 | } Unexecuted instantiation: tools.c:_b_dequeue Unexecuted instantiation: applet.c:_b_dequeue Unexecuted instantiation: cfgparse.c:_b_dequeue Unexecuted instantiation: channel.c:_b_dequeue Unexecuted instantiation: cli.c:_b_dequeue Unexecuted instantiation: connection.c:_b_dequeue Unexecuted instantiation: debug.c:_b_dequeue Unexecuted instantiation: dynbuf.c:_b_dequeue Unexecuted instantiation: errors.c:_b_dequeue Unexecuted instantiation: frontend.c:_b_dequeue Unexecuted instantiation: haproxy.c:_b_dequeue Unexecuted instantiation: http_ana.c:_b_dequeue Unexecuted instantiation: http_ext.c:_b_dequeue Unexecuted instantiation: htx.c:_b_dequeue Unexecuted instantiation: log.c:_b_dequeue Unexecuted instantiation: mworker.c:_b_dequeue Unexecuted instantiation: peers.c:_b_dequeue Unexecuted instantiation: pool.c:_b_dequeue Unexecuted instantiation: proxy.c:_b_dequeue Unexecuted instantiation: resolvers.c:_b_dequeue Unexecuted instantiation: ring.c:_b_dequeue Unexecuted instantiation: sample.c:_b_dequeue Unexecuted instantiation: server.c:_b_dequeue Unexecuted instantiation: sink.c:_b_dequeue Unexecuted instantiation: stats-html.c:_b_dequeue Unexecuted instantiation: stats.c:_b_dequeue Unexecuted instantiation: stconn.c:_b_dequeue Unexecuted instantiation: stick_table.c:_b_dequeue Unexecuted instantiation: stream.c:_b_dequeue Unexecuted instantiation: tcp_rules.c:_b_dequeue Unexecuted instantiation: tcpcheck.c:_b_dequeue Unexecuted instantiation: trace.c:_b_dequeue Unexecuted instantiation: vars.c:_b_dequeue Unexecuted instantiation: activity.c:_b_dequeue Unexecuted instantiation: backend.c:_b_dequeue Unexecuted instantiation: check.c:_b_dequeue Unexecuted instantiation: compression.c:_b_dequeue Unexecuted instantiation: dns.c:_b_dequeue Unexecuted instantiation: dns_ring.c:_b_dequeue Unexecuted instantiation: filters.c:_b_dequeue Unexecuted instantiation: flt_http_comp.c:_b_dequeue Unexecuted instantiation: haterm.c:_b_dequeue Unexecuted instantiation: http_fetch.c:_b_dequeue Unexecuted instantiation: mux_spop.c:_b_dequeue Unexecuted instantiation: payload.c:_b_dequeue Unexecuted instantiation: stats-json.c:_b_dequeue Unexecuted instantiation: cache.c:_b_dequeue Unexecuted instantiation: fcgi-app.c:_b_dequeue Unexecuted instantiation: flt_spoe.c:_b_dequeue |
316 | | |
317 | | /* Dequeues bw element <bw> from its list and updates the bufq_map if if was |
318 | | * the last element. All users of buffer_wait should use this to dequeue (e.g. |
319 | | * when killing a pending request on timeout) so as to make sure that we keep |
320 | | * consistency between the list heads and the bitmap. |
321 | | */ |
322 | | static inline void b_dequeue(struct buffer_wait *bw) |
323 | 0 | { |
324 | 0 | if (unlikely(LIST_INLIST(&bw->list))) |
325 | 0 | _b_dequeue(bw, tid); |
326 | 0 | } Unexecuted instantiation: tools.c:b_dequeue Unexecuted instantiation: applet.c:b_dequeue Unexecuted instantiation: cfgparse.c:b_dequeue Unexecuted instantiation: channel.c:b_dequeue Unexecuted instantiation: cli.c:b_dequeue Unexecuted instantiation: connection.c:b_dequeue Unexecuted instantiation: debug.c:b_dequeue Unexecuted instantiation: dynbuf.c:b_dequeue Unexecuted instantiation: errors.c:b_dequeue Unexecuted instantiation: frontend.c:b_dequeue Unexecuted instantiation: haproxy.c:b_dequeue Unexecuted instantiation: http_ana.c:b_dequeue Unexecuted instantiation: http_ext.c:b_dequeue Unexecuted instantiation: htx.c:b_dequeue Unexecuted instantiation: log.c:b_dequeue Unexecuted instantiation: mworker.c:b_dequeue Unexecuted instantiation: peers.c:b_dequeue Unexecuted instantiation: pool.c:b_dequeue Unexecuted instantiation: proxy.c:b_dequeue Unexecuted instantiation: resolvers.c:b_dequeue Unexecuted instantiation: ring.c:b_dequeue Unexecuted instantiation: sample.c:b_dequeue Unexecuted instantiation: server.c:b_dequeue Unexecuted instantiation: sink.c:b_dequeue Unexecuted instantiation: stats-html.c:b_dequeue Unexecuted instantiation: stats.c:b_dequeue Unexecuted instantiation: stconn.c:b_dequeue Unexecuted instantiation: stick_table.c:b_dequeue Unexecuted instantiation: stream.c:b_dequeue Unexecuted instantiation: tcp_rules.c:b_dequeue Unexecuted instantiation: tcpcheck.c:b_dequeue Unexecuted instantiation: trace.c:b_dequeue Unexecuted instantiation: vars.c:b_dequeue Unexecuted instantiation: activity.c:b_dequeue Unexecuted instantiation: backend.c:b_dequeue Unexecuted instantiation: check.c:b_dequeue Unexecuted instantiation: compression.c:b_dequeue Unexecuted instantiation: dns.c:b_dequeue Unexecuted instantiation: dns_ring.c:b_dequeue Unexecuted instantiation: filters.c:b_dequeue Unexecuted instantiation: flt_http_comp.c:b_dequeue Unexecuted instantiation: haterm.c:b_dequeue Unexecuted instantiation: http_fetch.c:b_dequeue Unexecuted instantiation: mux_spop.c:b_dequeue Unexecuted instantiation: payload.c:b_dequeue Unexecuted instantiation: stats-json.c:b_dequeue Unexecuted instantiation: cache.c:b_dequeue Unexecuted instantiation: fcgi-app.c:b_dequeue Unexecuted instantiation: flt_spoe.c:b_dequeue |
327 | | |
328 | | #endif /* _HAPROXY_DYNBUF_H */ |
329 | | |
330 | | /* |
331 | | * Local variables: |
332 | | * c-indent-level: 8 |
333 | | * c-basic-offset: 8 |
334 | | * End: |
335 | | */ |