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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list