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