blob: 53fd41ffcf1b60dbe45f5dc7b76e15ed36b5be02 [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/proto/buffers.h
3 Buffer management definitions, macros and inline functions.
4
Willy Tarreauba392ce2008-08-16 21:13:23 +02005 Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +01006
Willy Tarreaubaaee002006-06-26 02:48:02 +02007 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 _PROTO_BUFFERS_H
23#define _PROTO_BUFFERS_H
24
Willy Tarreau7341d942007-05-13 19:56:02 +020025#include <stdio.h>
Willy Tarreau0f772532006-12-23 20:51:41 +010026#include <stdlib.h>
Willy Tarreau7341d942007-05-13 19:56:02 +020027#include <string.h>
Willy Tarreau0f772532006-12-23 20:51:41 +010028
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020029#include <common/config.h>
Willy Tarreau7341d942007-05-13 19:56:02 +020030#include <common/memory.h>
Willy Tarreau0c303ee2008-07-07 00:09:58 +020031#include <common/ticks.h>
Willy Tarreaufa645582007-06-03 15:59:52 +020032#include <common/time.h>
33
Willy Tarreaubaaee002006-06-26 02:48:02 +020034#include <types/buffers.h>
35
Willy Tarreau7341d942007-05-13 19:56:02 +020036extern struct pool_head *pool2_buffer;
37
38/* perform minimal intializations, report 0 in case of error, 1 if OK. */
39int init_buffer();
40
Willy Tarreau03d60bb2009-01-09 11:13:00 +010041/* Initializes all fields in the buffer. The ->max_len field is initialized last
Willy Tarreau54469402006-07-29 16:59:06 +020042 * so that the compiler can optimize it away if changed immediately after the
Willy Tarreaue393fe22008-08-16 22:18:07 +020043 * call to this function. By default, it is set to the full size of the buffer.
Willy Tarreaua07a34e2009-08-16 23:27:46 +020044 * This implies that buffer_init() must only be called once ->size is set !
Willy Tarreaue393fe22008-08-16 22:18:07 +020045 * The BF_EMPTY flags is set.
Willy Tarreau54469402006-07-29 16:59:06 +020046 */
47static inline void buffer_init(struct buffer *buf)
48{
Willy Tarreauf890dc92008-12-13 21:12:26 +010049 buf->send_max = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +010050 buf->to_forward = 0;
Willy Tarreaue393fe22008-08-16 22:18:07 +020051 buf->l = buf->total = 0;
Willy Tarreau3eba98a2009-01-25 13:56:13 +010052 buf->pipe = NULL;
Willy Tarreau2df28e82008-08-17 15:20:19 +020053 buf->analysers = 0;
Willy Tarreaufa7e1022008-10-19 07:30:41 +020054 buf->cons = NULL;
Willy Tarreaue393fe22008-08-16 22:18:07 +020055 buf->flags = BF_EMPTY;
Willy Tarreau2df28e82008-08-17 15:20:19 +020056 buf->r = buf->lr = buf->w = buf->data;
Willy Tarreaua07a34e2009-08-16 23:27:46 +020057 buf->max_len = buf->size;
Willy Tarreau54469402006-07-29 16:59:06 +020058}
59
Willy Tarreaubaaee002006-06-26 02:48:02 +020060/* returns 1 if the buffer is empty, 0 otherwise */
Willy Tarreaub17916e2006-10-15 15:17:57 +020061static inline int buffer_isempty(const struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +020062{
63 return buf->l == 0;
64}
65
66/* returns 1 if the buffer is full, 0 otherwise */
Willy Tarreaub17916e2006-10-15 15:17:57 +020067static inline int buffer_isfull(const struct buffer *buf) {
Willy Tarreaua07a34e2009-08-16 23:27:46 +020068 return buf->l == buf->size;
Willy Tarreaubaaee002006-06-26 02:48:02 +020069}
70
Willy Tarreau2eb52f02008-09-04 09:14:08 +020071/* Check buffer timeouts, and set the corresponding flags. The
72 * likely/unlikely have been optimized for fastest normal path.
Willy Tarreaudd80c6f2008-12-13 22:25:59 +010073 * The read/write timeouts are not set if there was activity on the buffer.
74 * That way, we don't have to update the timeout on every I/O. Note that the
75 * analyser timeout is always checked.
Willy Tarreau2eb52f02008-09-04 09:14:08 +020076 */
77static inline void buffer_check_timeouts(struct buffer *b)
78{
Willy Tarreau86491c32008-12-14 09:04:47 +010079 if (likely(!(b->flags & (BF_SHUTR|BF_READ_TIMEOUT|BF_READ_ACTIVITY|BF_READ_NOEXP))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +020080 unlikely(tick_is_expired(b->rex, now_ms)))
81 b->flags |= BF_READ_TIMEOUT;
82
Willy Tarreaudd80c6f2008-12-13 22:25:59 +010083 if (likely(!(b->flags & (BF_SHUTW|BF_WRITE_TIMEOUT|BF_WRITE_ACTIVITY))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +020084 unlikely(tick_is_expired(b->wex, now_ms)))
85 b->flags |= BF_WRITE_TIMEOUT;
86
87 if (likely(!(b->flags & BF_ANA_TIMEOUT)) &&
88 unlikely(tick_is_expired(b->analyse_exp, now_ms)))
89 b->flags |= BF_ANA_TIMEOUT;
90}
91
Willy Tarreau0abebcc2009-01-08 00:09:41 +010092/* Schedule <bytes> more bytes to be forwarded by the buffer without notifying
93 * the task. Any pending data in the buffer is scheduled to be sent as well,
94 * in the limit of the number of bytes to forward. This must be the only method
95 * to use to schedule bytes to be sent. Directly touching ->to_forward will
96 * cause lockups when send_max goes down to zero if nobody is ready to push the
97 * remaining data.
98 */
99static inline void buffer_forward(struct buffer *buf, unsigned int bytes)
100{
101 unsigned int data_left;
102
103 buf->to_forward += bytes;
104 data_left = buf->l - buf->send_max;
105 if (data_left > buf->to_forward)
106 data_left = buf->to_forward;
107
108 buf->to_forward -= data_left;
109 buf->send_max += data_left;
110}
111
Willy Tarreaue8a28bf2009-03-08 21:12:04 +0100112/* Schedule all remaining buffer data to be sent. send_max is not touched if it
113 * already covers those data. That permits doing a flush even after a forward,
114 * although not recommended.
115 */
116static inline void buffer_flush(struct buffer *buf)
117{
118 if (buf->send_max < buf->l)
119 buf->send_max = buf->l;
120}
121
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100122/* Erase any content from buffer <buf> and adjusts flags accordingly. Note
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100123 * that any spliced data is not affected since we may not have any access to
124 * it.
Willy Tarreaue393fe22008-08-16 22:18:07 +0200125 */
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100126static inline void buffer_erase(struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200127{
Willy Tarreauf890dc92008-12-13 21:12:26 +0100128 buf->send_max = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +0100129 buf->to_forward = 0;
Willy Tarreaue09e0ce2007-03-18 16:31:29 +0100130 buf->r = buf->lr = buf->w = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200131 buf->l = 0;
Willy Tarreaue393fe22008-08-16 22:18:07 +0200132 buf->flags |= BF_EMPTY | BF_FULL;
Willy Tarreau03d60bb2009-01-09 11:13:00 +0100133 if (buf->max_len)
Willy Tarreaue393fe22008-08-16 22:18:07 +0200134 buf->flags &= ~BF_FULL;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200135}
136
Willy Tarreauba392ce2008-08-16 21:13:23 +0200137/* marks the buffer as "shutdown" for reads and cancels the timeout */
Willy Tarreaufa645582007-06-03 15:59:52 +0200138static inline void buffer_shutr(struct buffer *buf)
139{
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200140 buf->rex = TICK_ETERNITY;
Willy Tarreauba392ce2008-08-16 21:13:23 +0200141 buf->flags |= BF_SHUTR;
Willy Tarreaufa645582007-06-03 15:59:52 +0200142}
143
Willy Tarreauba392ce2008-08-16 21:13:23 +0200144/* marks the buffer as "shutdown" for writes and cancels the timeout */
Willy Tarreaufa645582007-06-03 15:59:52 +0200145static inline void buffer_shutw(struct buffer *buf)
146{
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200147 buf->wex = TICK_ETERNITY;
Willy Tarreauba392ce2008-08-16 21:13:23 +0200148 buf->flags |= BF_SHUTW;
Willy Tarreaufa645582007-06-03 15:59:52 +0200149}
150
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200151/* marks the buffer as "shutdown" ASAP for reads */
152static inline void buffer_shutr_now(struct buffer *buf)
153{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100154 buf->flags |= BF_SHUTR_NOW;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200155}
156
157/* marks the buffer as "shutdown" ASAP for writes */
158static inline void buffer_shutw_now(struct buffer *buf)
159{
160 buf->flags |= BF_SHUTW_NOW;
161}
162
163/* marks the buffer as "shutdown" ASAP in both directions */
164static inline void buffer_abort(struct buffer *buf)
165{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100166 buf->flags |= BF_SHUTR_NOW | BF_SHUTW_NOW;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200167}
168
Willy Tarreau01bf8672008-12-07 18:03:29 +0100169/* Installs <func> as a hijacker on the buffer <b> for session <s>. The hijack
170 * flag is set, and the function called once. The function is responsible for
171 * clearing the hijack bit. It is possible that the function clears the flag
172 * during this first call.
173 */
174static inline void buffer_install_hijacker(struct session *s,
175 struct buffer *b,
176 void (*func)(struct session *, struct buffer *))
Willy Tarreau72b179a2008-08-28 16:01:32 +0200177{
Willy Tarreau01bf8672008-12-07 18:03:29 +0100178 b->hijacker = func;
179 b->flags |= BF_HIJACK;
180 func(s, b);
Willy Tarreau72b179a2008-08-28 16:01:32 +0200181}
182
Willy Tarreau01bf8672008-12-07 18:03:29 +0100183/* Releases the buffer from hijacking mode. Often used by the hijack function */
Willy Tarreau72b179a2008-08-28 16:01:32 +0200184static inline void buffer_stop_hijack(struct buffer *buf)
185{
186 buf->flags &= ~BF_HIJACK;
187}
188
Willy Tarreau3da77c52008-08-29 09:58:42 +0200189/* allows the consumer to send the buffer contents */
190static inline void buffer_write_ena(struct buffer *buf)
191{
192 buf->flags |= BF_WRITE_ENA;
193}
194
195/* prevents the consumer from sending the buffer contents */
196static inline void buffer_write_dis(struct buffer *buf)
197{
198 buf->flags &= ~BF_WRITE_ENA;
199}
200
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100201/* check if the buffer needs to be shut down for read, and perform the shutdown
202 * at the stream_interface level if needed. This must not be used with a buffer
203 * for which a connection is currently in queue or turn-around.
204 */
205static inline void buffer_check_shutr(struct buffer *b)
206{
207 if (b->flags & BF_SHUTR)
208 return;
209
210 if (!(b->flags & (BF_SHUTR_NOW|BF_SHUTW)))
211 return;
212
213 /* Last read, forced read-shutdown, or other end closed. We have to
214 * close our read side and inform the stream_interface.
215 */
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100216 b->prod->shutr(b->prod);
217}
218
219/* check if the buffer needs to be shut down for write, and perform the shutdown
220 * at the stream_interface level if needed. This must not be used with a buffer
221 * for which a connection is currently in queue or turn-around.
222 */
223static inline void buffer_check_shutw(struct buffer *b)
224{
225 if (b->flags & BF_SHUTW)
226 return;
227
228 if ((b->flags & BF_SHUTW_NOW) ||
229 (b->flags & (BF_EMPTY|BF_HIJACK|BF_WRITE_ENA|BF_SHUTR)) ==
230 (BF_EMPTY|BF_WRITE_ENA|BF_SHUTR)) {
231 /* Application requested write-shutdown, or other end closed
232 * with empty buffer. We have to close our write side and
233 * inform the stream_interface.
234 */
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100235 b->cons->shutw(b->cons);
236 }
237}
238
Willy Tarreaubaaee002006-06-26 02:48:02 +0200239/* returns the maximum number of bytes writable at once in this buffer */
Willy Tarreaub17916e2006-10-15 15:17:57 +0200240static inline int buffer_max(const struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200241{
Willy Tarreaua07a34e2009-08-16 23:27:46 +0200242 if (buf->l == buf->size)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200243 return 0;
244 else if (buf->r >= buf->w)
Willy Tarreaua07a34e2009-08-16 23:27:46 +0200245 return buf->data + buf->size - buf->r;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200246 else
247 return buf->w - buf->r;
248}
249
Willy Tarreaue393fe22008-08-16 22:18:07 +0200250/* sets the buffer read limit to <size> bytes, and adjusts the FULL
251 * flag accordingly.
252 */
253static inline void buffer_set_rlim(struct buffer *buf, int size)
254{
Willy Tarreau03d60bb2009-01-09 11:13:00 +0100255 buf->max_len = size;
Willy Tarreaue393fe22008-08-16 22:18:07 +0200256 if (buf->l < size)
257 buf->flags &= ~BF_FULL;
258 else
259 buf->flags |= BF_FULL;
260}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200261
262/*
263 * Tries to realign the given buffer, and returns how many bytes can be written
264 * there at once without overwriting anything.
265 */
266static inline int buffer_realign(struct buffer *buf)
267{
268 if (buf->l == 0) {
269 /* let's realign the buffer to optimize I/O */
Willy Tarreaue09e0ce2007-03-18 16:31:29 +0100270 buf->r = buf->w = buf->lr = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200271 }
272 return buffer_max(buf);
273}
274
275
276int buffer_write(struct buffer *buf, const char *msg, int len);
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100277int buffer_write_chunk(struct buffer *buf, struct chunk *chunk);
Willy Tarreau4af6f3a2007-03-18 22:36:26 +0100278int buffer_replace(struct buffer *b, char *pos, char *end, const char *str);
279int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len);
280int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len);
Willy Tarreau40d25162009-04-03 12:01:47 +0200281int chunk_printf(struct chunk *chk, int size, const char *fmt, ...)
282 __attribute__ ((format(printf, 3, 4)));
Willy Tarreau8d5d7f22007-01-21 19:16:41 +0100283void buffer_dump(FILE *o, struct buffer *b, int from, int to);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200284
Willy Tarreau0f772532006-12-23 20:51:41 +0100285/*
286 * frees the destination chunk if already allocated, allocates a new string,
287 * and copies the source into it. The pointer to the destination string is
288 * returned, or NULL if the allocation fails or if any pointer is NULL..
289 */
290static inline char *chunk_dup(struct chunk *dst, const struct chunk *src) {
291 if (!dst || !src || !src->str)
292 return NULL;
293 if (dst->str)
294 free(dst->str);
295 dst->len = src->len;
296 dst->str = (char *)malloc(dst->len);
297 memcpy(dst->str, src->str, dst->len);
298 return dst->str;
299}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200300
301#endif /* _PROTO_BUFFERS_H */
302
303/*
304 * Local variables:
305 * c-indent-level: 8
306 * c-basic-offset: 8
307 * End:
308 */