Changeset: d5069090bc64 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5069090bc64
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/common/sql_mem.c
        sql/include/sql_mem.h
        sql/server/sql_mvc.c
Branch: Dec2016
Log Message:

Destroy sql allocators for sql function bodies when exiting.
The memory sanitizer and valgrind indicated memory leaks for these
allocators.


diffs (110 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -3232,6 +3232,7 @@ backend_create_sql_func(backend *be, sql
        if (sideeffects)
                curBlk->unsafeProp = 1;
        f->sa = sa;
+       sa_register(sa);
        /* optimize the code */
        SQLaddQueryToCache(c);
        if( curBlk->inlineProp == 0)
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
@@ -47,6 +47,8 @@ sql_allocator *sa_create(void)
        if (sa == NULL) {
                return NULL;
        }
+       sa->prev = NULL;
+       sa->next = NULL;
        sa->size = 64;
        sa->nr = 1;
        sa->blks = NEW_ARRAY(char*,sa->size);
@@ -131,10 +133,25 @@ char *sa_zalloc( sql_allocator *sa, size
        return r;
 }      
 
+/* We maintain a doubly linked list (for easy element removal) of
+ * allocators that are to be destroyed on program end.
+ * Enter into list by calling sa_register; allocators are
+ * automatically removed in sa_destroy. */
+static MT_Lock listlock MT_LOCK_INITIALIZER("listlock");
+static sql_allocator *list;
+
 void sa_destroy( sql_allocator *sa ) 
 {
        size_t i ;
 
+       MT_lock_set(&listlock);
+       if (sa->next)
+               sa->next->prev = sa->prev;
+       if (sa->prev)
+               sa->prev->next = sa->next;
+       if (list == sa)
+               list = sa->next;
+       MT_lock_unset(&listlock);
        for (i = 0; i<sa->nr; i++) {
                GDKfree(sa->blks[i]);
        }
@@ -142,6 +159,34 @@ void sa_destroy( sql_allocator *sa )
        GDKfree(sa);
 }
 
+void sa_register(sql_allocator *sa)
+{
+       MT_lock_set(&listlock);
+       sa->next = list;
+       if (list)
+               list->prev = sa;
+       list = sa;
+       MT_lock_unset(&listlock);
+}
+
+void sa_exit(void)
+{
+       sql_allocator *sa;
+       size_t i;
+
+       MT_lock_set(&listlock);
+       while (list) {
+               sa = list;
+               list = sa->next;
+               for (i = 0; i<sa->nr; i++) {
+                       GDKfree(sa->blks[i]);
+               }
+               GDKfree(sa->blks);
+               GDKfree(sa);
+       }
+       MT_lock_unset(&listlock);
+}
+
 char *sa_strndup( sql_allocator *sa, const char *s, size_t l) 
 { 
        char *r = sa_alloc(sa, l+1); 
diff --git a/sql/include/sql_mem.h b/sql/include/sql_mem.h
--- a/sql/include/sql_mem.h
+++ b/sql/include/sql_mem.h
@@ -58,8 +58,11 @@ typedef struct sql_allocator {
        char **blks;
        size_t used;    /* memory used in last block */
        size_t usedmem; /* used memory */
+       struct sql_allocator *prev, *next;
 } sql_allocator;
 
+extern void sa_exit(void);
+extern void sa_register(sql_allocator *sa);
 extern sql_allocator *sa_create(void);
 extern sql_allocator *sa_reset( sql_allocator *sa );
 extern char *sa_alloc( sql_allocator *sa,  size_t sz );
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -167,6 +167,7 @@ mvc_exit(void)
 
        store_exit();
        keyword_exit();
+       sa_exit();
 }
 
 void
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to