annotate src/lib/ostream-buffer.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents e3ba9312f75b
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20861
diff changeset
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
13529
cf77e448295c Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
5 #include "ostream-private.h"
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 struct buffer_ostream {
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 struct ostream_private ostream;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 buffer_t *buf;
17703
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
10 bool seeked;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 };
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 static int o_stream_buffer_seek(struct ostream_private *stream, uoff_t offset)
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
17703
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
15 struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
16
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
17 bstream->seeked = TRUE;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 stream->ostream.offset = offset;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 return 1;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 }
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 static int
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 o_stream_buffer_write_at(struct ostream_private *stream,
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 const void *data, size_t size, uoff_t offset)
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 {
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 buffer_write(bstream->buf, offset, data, size);
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 return 0;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 }
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 static ssize_t
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 o_stream_buffer_sendv(struct ostream_private *stream,
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 const struct const_iovec *iov, unsigned int iov_count)
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 {
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
17703
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
37 size_t left, n, offset;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 ssize_t ret = 0;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 unsigned int i;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
17703
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
41 offset = bstream->seeked ? stream->ostream.offset : bstream->buf->used;
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
42
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 for (i = 0; i < iov_count; i++) {
10083
bad043de6a7a ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents: 9766
diff changeset
44 left = bstream->ostream.max_buffer_size -
bad043de6a7a ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents: 9766
diff changeset
45 stream->ostream.offset;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 n = I_MIN(left, iov[i].iov_len);
17703
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
47 buffer_write(bstream->buf, offset, iov[i].iov_base, n);
4968b36d9ac8 ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
48 stream->ostream.offset += n; offset += n;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 ret += n;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 if (n != iov[i].iov_len)
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 break;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 }
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 return ret;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 }
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
22410
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
56 static size_t
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
57 o_stream_buffer_get_used_size(const struct ostream_private *stream)
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
58 {
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
59 struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
60
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
61 return bstream->buf->used;
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
62 }
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
63
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 struct ostream *o_stream_create_buffer(buffer_t *buf)
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 {
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 struct buffer_ostream *bstream;
14697
69334bf138cf istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
67 struct ostream *output;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 bstream = i_new(struct buffer_ostream, 1);
20861
ddae63d7bc9c lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20860
diff changeset
70 /* we don't set buffer as blocking, because if max_buffer_size is
ddae63d7bc9c lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20860
diff changeset
71 changed it can get truncated. this is used in various places in
ddae63d7bc9c lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20860
diff changeset
72 unit tests. */
10083
bad043de6a7a ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents: 9766
diff changeset
73 bstream->ostream.max_buffer_size = (size_t)-1;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 bstream->ostream.seek = o_stream_buffer_seek;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 bstream->ostream.sendv = o_stream_buffer_sendv;
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 bstream->ostream.write_at = o_stream_buffer_write_at;
22410
e3ba9312f75b lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
77 bstream->ostream.get_used_size = o_stream_buffer_get_used_size;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 bstream->buf = buf;
14851
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14697
diff changeset
80 output = o_stream_create(&bstream->ostream, NULL, -1);
14697
69334bf138cf istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
81 o_stream_set_name(output, "(buffer)");
69334bf138cf istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
82 return output;
9558
320d2164bc17 Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }