Changeset: 6d53fa36fd1d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6d53fa36fd1d Modified Files: gdk/gdk_logger.c monetdb5/optimizer/opt_dataflow.c monetdb5/optimizer/opt_reorder.c Branch: Jul2021 Log Message:
use smaller chunks (if possible without additional malloc/frees) too write/read strings in the logger cleanup some comments in dataflow/reorder diffs (180 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -335,26 +335,28 @@ string_reader(logger *lg, BAT *b, lng nr lng SZ = 0; log_return res = LOG_OK; - if (mnstr_readLng(lg->input_log, &SZ) != 1) - return LOG_EOF; - sz = (size_t)SZ; - char *buf = GDKmalloc(sz); + for (; nr && res == LOG_OK; ) { + if (mnstr_readLng(lg->input_log, &SZ) != 1) + return LOG_EOF; + sz = (size_t)SZ; + char *buf = lg->buf; + if (lg->bufsize < sz) { + lg->buf = buf = GDKrealloc(buf, sz); + lg->bufsize = sz; + } - if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) { - GDKfree(buf); - return LOG_EOF; - } - /* handle strings */ - if (b) { + if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) + return LOG_EOF; + /* handle strings */ char *t = buf; /* chunked */ #define CHUNK_SIZE 1024 char *strings[CHUNK_SIZE]; int cur = 0; - for(int i=0; i<nr && res == LOG_OK; i++) { + for(; nr>0 && res == LOG_OK && t < (buf+sz); nr--) { strings[cur++] = t; - if (cur == CHUNK_SIZE && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED) + if (cur == CHUNK_SIZE && b && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED) res = LOG_ERR; if (cur == CHUNK_SIZE) cur = 0; @@ -363,10 +365,9 @@ string_reader(logger *lg, BAT *b, lng nr t++; t++; } - if (cur && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED) + if (cur && b && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED) res = LOG_ERR; } - GDKfree(buf); return res; } @@ -2357,27 +2358,43 @@ log_constant(logger *lg, int type, ptr v static gdk_return string_writer(logger *lg, BAT *b, lng offset, lng nr) { - size_t sz = 0; + size_t bufsz = lg->bufsize, resize = 0; BUN end = (BUN)(offset + nr); + char *buf = lg->buf; + gdk_return res = GDK_FAIL; + if (!buf) + return GDK_FAIL; BATiter bi = bat_iterator(b); - for(BUN p = (BUN)offset; p < end; p++) { - char *s = BUNtail(bi, p); - sz += strlen(s)+1; /* we need a seperator */ - } - char *buf = GDKmalloc(sz), *dst = buf; - if (buf) { - for(BUN p = (BUN)offset; p < end; p++) { + BUN p = (BUN)offset; + for ( ; p < end; ) { + size_t sz = 0; + if (resize) { + lg->buf = buf = GDKrealloc(buf, resize); + if (!buf) { + res = GDK_FAIL; + break; + } + lg->bufsize = bufsz = resize; + resize = 0; + } + char *dst = buf; + for(; p < end && sz < bufsz; p++) { char *s = BUNtail(bi, p); size_t len = strlen(s)+1; - memcpy(dst, s, len); - dst += len; + if ((sz+len) > bufsz) { + if (len > bufsz) + resize = len+bufsz; + break; + } else { + memcpy(dst, s, len); + dst += len; + sz += len; + } } + if (sz && buf && mnstr_writeLng(lg->output_log, (lng) sz) && mnstr_write(lg->output_log, buf, sz, 1) == 1) + res = GDK_SUCCEED; } - gdk_return res = GDK_FAIL; - if (buf && mnstr_writeLng(lg->output_log, (lng) sz) && mnstr_write(lg->output_log, buf, sz, 1) == 1) - res = GDK_SUCCEED; - GDKfree(buf); bat_iterator_end(&bi); return res; } diff --git a/monetdb5/optimizer/opt_dataflow.c b/monetdb5/optimizer/opt_dataflow.c --- a/monetdb5/optimizer/opt_dataflow.c +++ b/monetdb5/optimizer/opt_dataflow.c @@ -205,20 +205,21 @@ isSqlAppendUpdate(MalBlkPtr mb, InstrPtr return false; // pattern("sql", "append", mvc_append_wrap, false, "...", args(1,8, arg("",int), - // arg("mvc",int - // arg("sname",str - // arg("tname",str - // arg("cname",str - // arg("offset",lng + // arg("mvc",int), + // arg("sname",str), + // arg("tname",str), + // arg("cname",str), + // arg("offset",lng), + // batarg("pos",oid), // argany("ins",0))), - // pattern("sql", "update", mvc_update_wrap, false, "...", args(1,7, arg("",int + // pattern("sql", "update", mvc_update_wrap, false, "...", args(1,7, arg("",int), // arg("mvc",int), - // arg("sname",str - // arg("tname",str - // arg("cname",str - // argany("rids",0 - // argany("upd",0)) + // arg("sname",str), + // arg("tname",str), + // arg("cname",str), + // argany("rids",0), + // argany("upd",0))) if ((p->fcnname == appendRef && p->argc != 8) || (p->fcnname == updateRef && p->argc != 7)) return false; diff --git a/monetdb5/optimizer/opt_reorder.c b/monetdb5/optimizer/opt_reorder.c --- a/monetdb5/optimizer/opt_reorder.c +++ b/monetdb5/optimizer/opt_reorder.c @@ -53,7 +53,7 @@ * for a linear plan. Future extensions could consider * re-ordering basic blocks only. * - * For this purpose this optimizer should be run before + * For this purpose this optimizer should be run before * the dataflow optimizer, because it adds barriers. */ typedef struct{ @@ -111,7 +111,7 @@ OPTdependencies(Client cntxt, MalBlkPtr list[i]->stmt[j] = var[getArg(p,j)]; list[var[getArg(p,j)]]->used++; } - /* keep the assignment order + /* keep the assignment order * Duplicate assignment of a variable is not wanted * but can not be avoided when loops are involved * In this case we bail out*/ @@ -217,7 +217,7 @@ OPTbreadthfirst(Client cntxt, MalBlkPtr } /* SQL appends are collected to create a better dataflow block */ -/* alternatively, we should postpone all mcv-chained actions */ +/* alternatively, we should postpone all mvc-chained actions */ static int OPTpostponeAppends(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list