Changeset: 398e7bbb5056 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=398e7bbb5056
Modified Files:
common/stream/stream.c
Branch: default
Log Message:
Before reallocating more space for a bstream, check whether it's needed.
diffs (67 lines):
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -5207,7 +5207,7 @@ bstream_create(stream *s, size_t size)
ssize_t
bstream_read(bstream *s, size_t size)
{
- ssize_t rd;
+ ssize_t rd, rd1 = 0;
if (s == NULL)
return -1;
@@ -5215,6 +5215,8 @@ bstream_read(bstream *s, size_t size)
if (s->eof)
return 0;
+ assert(s->buf != NULL);
+
if (s->pos > 0) {
if (s->pos < s->len) {
/* move all data and end of string marker */
@@ -5225,15 +5227,29 @@ bstream_read(bstream *s, size_t size)
s->pos = 0;
}
- assert(s->buf != NULL);
if (s->len == s->size) {
+ size_t sz = size > 8192 ? 8192 : size;
+ char tmpbuf[8192];
+
+ /* before we realloc more space, see if there is a need */
+ if ((rd1 = s->s->read(s->s, tmpbuf, 1, sz)) == 0) {
+ s->eof = true;
+ return 0;
+ }
+ if (rd1 < 0)
+ return rd1;
char *p;
- size_t ns = s->size + size + 8192;
+ size_t ns = s->size + size;
if ((p = realloc(s->buf, ns + 1)) == NULL) {
return -1;
}
s->size = ns;
s->buf = p;
+ memcpy(s->buf + s->len, tmpbuf, rd1);
+ s->len += rd1;
+ size -= rd1;
+ if (size == 0)
+ return rd1;
}
if (s->len + size > s->size)
@@ -5246,11 +5262,11 @@ bstream_read(bstream *s, size_t size)
if (rd == 0) {
s->eof = true;
- return 0;
+ return rd1;
}
s->len += (size_t) rd;
s->buf[s->len] = 0; /* fill in the spare with EOS */
- return rd;
+ return rd + rd1;
}
#ifdef _POSIX2_LINE_MAX
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list