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

Reply via email to