Changeset: 95fbd5f0b4a0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=95fbd5f0b4a0 Modified Files: gdk/gdk_utils.c gdk/gdk_utils.h monetdb5/mal/mal_instruction.c monetdb5/modules/mal/mal_mapi.c sql/backends/monet5/sql_scenario.c sql/common/sql_list.c sql/common/sql_mem.c sql/server/rel_semantic.c sql/storage/sql_catalog.c sql/test/malloc_fail/Tests/All sql/test/malloc_fail/Tests/setmemorylimit.sql Branch: default Log Message:
changed semantics of memory limit to only fail allocations larger than limit diffs (158 lines): diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -310,7 +310,7 @@ int GDK_vm_trim = 1; * fall-back for other compilers. */ #include "gdk_atomic.h" static volatile ATOMIC_TYPE GDK_mallocedbytes_estimate = 0; -static volatile ATOMIC_TYPE GDK_mallocedbytes_limit = 0; +static volatile lng GDK_mallocedbytes_limit = -1; static volatile ATOMIC_TYPE GDK_vm_cursize = 0; #ifdef GDK_VM_KEEPHISTO volatile ATOMIC_TYPE GDK_vm_nallocs[MAX_BIT] = { 0 }; @@ -1682,7 +1682,7 @@ GDKmalloc_prefixsize(size_t size) return s; } -gdk_export void GDKsetmemorylimit(size_t nbytes) { +gdk_export void GDKsetmemorylimit(lng nbytes) { GDK_mallocedbytes_limit = nbytes; } @@ -1706,8 +1706,7 @@ GDKmallocmax(size_t size, size_t *maxsiz } #ifndef NDEBUG /* fail malloc for testing purposes depending on set limit */ - if (GDK_mallocedbytes_limit > 0 && - (GDK_mallocedbytes_estimate + size + MALLOC_EXTRA_SPACE) > GDK_mallocedbytes_limit) { + if (GDK_mallocedbytes_limit >= 0 && size >(size_t) GDK_mallocedbytes_limit) { return NULL; } #endif diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h --- a/gdk/gdk_utils.h +++ b/gdk/gdk_utils.h @@ -81,7 +81,7 @@ gdk_export void MT_init(void); /* init gdk_export int GDKinit(opt *set, int setlen); /* used for testing only */ -gdk_export void GDKsetmemorylimit(size_t nbytes); +gdk_export void GDKsetmemorylimit(lng nbytes); /* * Upon closing the session, all persistent BATs should be saved and diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c --- a/monetdb5/mal/mal_instruction.c +++ b/monetdb5/mal/mal_instruction.c @@ -1543,6 +1543,8 @@ pushEndInstruction(MalBlkPtr mb) p = newInstruction(mb, ENDsymbol); if (!p) { + mb->errors++; + showException(GDKout, MAL, "pushEndInstruction", "failed to create instruction (out of memory?)"); return; } p->argc = 0; diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -367,8 +367,9 @@ SERVERlistenThread(SOCKET *Sock) data = GDKmalloc(sizeof(*data)); if (!data) { closesocket(msgsock); - msg = "memory allocation failed"; - goto error; + showException(GDKstdout, MAL, "initClient", + "cannot allocate memory"); + continue; } data->in = socket_rastream(msgsock, "Server read"); data->out = socket_wastream(msgsock, "Server write"); diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -936,6 +936,12 @@ SQLparser(Client c) * this point if this is a recursive call. */ if (!m->sa) m->sa = sa_create(); + if (!m->sa) { + mnstr_printf(out, "!Could not create SQL allocator\n"); + mnstr_flush(out); + c->mode = FINISHCLIENT; + throw(SQL, "SQLparser", "Could not create SQL allocator"); + } m->emode = m_normal; m->emod = mod_none; diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -24,6 +24,9 @@ list * list_create(fdestroy destroy) { list *l = MNEW(list); + if (!l) { + return NULL; + } l->sa = NULL; l->destroy = destroy; diff --git a/sql/common/sql_mem.c b/sql/common/sql_mem.c --- a/sql/common/sql_mem.c +++ b/sql/common/sql_mem.c @@ -44,7 +44,9 @@ sql_ref_dec(sql_ref *r) sql_allocator *sa_create(void) { sql_allocator *sa = MNEW(sql_allocator); - + if (!sa) { + return NULL; + } sa->size = 64; sa->nr = 1; sa->blks = NEW_ARRAY(char*,sa->size); diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c --- a/sql/server/rel_semantic.c +++ b/sql/server/rel_semantic.c @@ -43,6 +43,9 @@ rel_parse(mvc *m, sql_schema *s, char *q b = (buffer*)GDKmalloc(sizeof(buffer)); n = GDKmalloc(len + 1 + 1); + if (!b || !n) { + return NULL; + } strncpy(n, query, len); query = n; query[len] = '\n'; diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c --- a/sql/storage/sql_catalog.c +++ b/sql/storage/sql_catalog.c @@ -294,6 +294,9 @@ find_all_sql_func(sql_schema * s, const if (f->type == type && name[0] == b->name[0] && strcmp(name, b->name) == 0) { if (!res) res = list_create((fdestroy)NULL); + if (!res) { + return NULL; + } list_append(res, f); } } diff --git a/sql/test/malloc_fail/Tests/All b/sql/test/malloc_fail/Tests/All --- a/sql/test/malloc_fail/Tests/All +++ b/sql/test/malloc_fail/Tests/All @@ -1,1 +1,3 @@ setmemorylimit +setmemorylimit-fail +setmemorylimit-fail2 diff --git a/sql/test/malloc_fail/Tests/setmemorylimit.sql b/sql/test/malloc_fail/Tests/setmemorylimit.sql --- a/sql/test/malloc_fail/Tests/setmemorylimit.sql +++ b/sql/test/malloc_fail/Tests/setmemorylimit.sql @@ -1,7 +1,4 @@ create procedure setmemorylimit(nbytes BIGINT) external name "io"."setmemorylimit"; -call setmemorylimit(0); call setmemorylimit(100000000); --- this should work fine select name from tables where 1=0; -call setmemorylimit(0); -drop procedure setmemorylimit; +call setmemorylimit(-1); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list