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