Changeset: fab18e6f10ec for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fab18e6f10ec Modified Files: sql/common/sql_hash.c sql/storage/objectset.c Branch: nospare Log Message:
Add memory cleanups... diffs (179 lines): diff --git a/sql/common/sql_hash.c b/sql/common/sql_hash.c --- a/sql/common/sql_hash.c +++ b/sql/common/sql_hash.c @@ -30,7 +30,11 @@ hash_new(sql_allocator *sa, int size, fk ht->sa = sa; ht->size = (1<<log_base2(size-1)); ht->key = key; - ht->buckets = (ht->sa)?SA_NEW_ARRAY(sa, sql_hash_e*, ht->size):NEW_ARRAY(sql_hash_e*, ht->size); + ht->buckets = (ht->sa)?SA_NEW_ARRAY(sa, sql_hash_e*, ht->size):NEW_ARRAY(sql_hash_e*, ht->size); // TODO: can fail + if (ht->buckets == NULL) { + _DELETE(ht); + return NULL; + } for (int i = 0; i < ht->size; i++) ht->buckets[i] = NULL; return ht; diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -76,7 +76,7 @@ find_id(objectset *os, sqlid id) if (os) { MT_lock_set(&os->ht_lock); if ((!os->id_map || os->id_map->size*16 < os->id_based_cnt) && os->id_based_cnt > HASH_MIN_SIZE && os->sa) { - // TODO: This leaks the old map + hash_destroy(os->id_map); os->id_map = hash_new(os->sa, os->id_based_cnt, (fkeyvalue)&os_id_key); if (os->id_map == NULL) { MT_lock_unset(&os->ht_lock); @@ -225,8 +225,18 @@ node_create(sql_allocator *sa, objectver } static objectset * + os_append_node_name(objectset *os, versionhead *n) { + MT_lock_set(&os->ht_lock); + if (os->name_map) { + int key = os->name_map->key(n); + + if (hash_add(os->name_map, key, n) == NULL) { + MT_lock_unset(&os->ht_lock); + return NULL; + } + } if (os->name_based_t) { os->name_based_t->next = n; } else { @@ -234,18 +244,7 @@ os_append_node_name(objectset *os, versi } n->prev = os->name_based_t; // aka the double linked list. os->name_based_t = n; - if (n->ov) { - MT_lock_set(&os->ht_lock); - if (os->name_map) { - int key = os->name_map->key(n); - - if (hash_add(os->name_map, key, n) == NULL) { - MT_lock_unset(&os->ht_lock); - return NULL; - } - } - MT_lock_unset(&os->ht_lock); - } + MT_lock_unset(&os->ht_lock); os->name_based_cnt++; return os; } @@ -259,12 +258,26 @@ os_append_name(objectset *os, objectvers return NULL; ov->name_based_head = n; - return os_append_node_name(os, n); + if (!(os = os_append_node_name(os, n))){ + _DELETE(n); + return NULL; + } + + return os; } static objectset * os_append_node_id(objectset *os, versionhead *n) { + MT_lock_set(&os->ht_lock); + if (os->id_map) { + int key = os->id_map->key(n); + + if (hash_add(os->id_map, key, n) == NULL) { + MT_lock_unset(&os->ht_lock); + return NULL; + } + } if (os->id_based_t) { os->id_based_t->next = n; } else { @@ -272,18 +285,7 @@ os_append_node_id(objectset *os, version } n->prev = os->id_based_t; // aka the double linked list. os->id_based_t = n; - if (n->ov) { - MT_lock_set(&os->ht_lock); - if (os->id_map) { - int key = os->id_map->key(n); - - if (hash_add(os->id_map, key, n) == NULL) { - MT_lock_unset(&os->ht_lock); - return NULL; - } - } - MT_lock_unset(&os->ht_lock); - } + MT_lock_unset(&os->ht_lock); os->id_based_cnt++; return os; } @@ -296,7 +298,12 @@ os_append_id(objectset *os, objectversio if (n == NULL) return NULL; ov->id_based_head = n; - return os_append_node_id(os, n); + if (!(os = os_append_node_id(os, n))){ + _DELETE(n); + return NULL; + } + + return os; } static versionhead * find_name(objectset *os, const char *name); @@ -610,7 +617,7 @@ find_name(objectset *os, const char *nam if (os) { MT_lock_set(&os->ht_lock); if ((!os->name_map || os->name_map->size*16 < os->name_based_cnt) && os->name_based_cnt > HASH_MIN_SIZE && os->sa) { - // TODO: This leaks the old map + hash_destroy(os->name_map); os->name_map = hash_new(os->sa, os->name_based_cnt, (fkeyvalue)&os_name_key); if (os->name_map == NULL) { MT_lock_unset(&os->ht_lock); @@ -732,8 +739,8 @@ os_add_name_based(objectset *os, struct MT_lock_unset(&os->ht_lock); return 0; } else { /* new */ - // TODO: can fail i.e. returns NULL - os_append_name(os, ov); + if (os_append_name(os, ov) == NULL) + return -1; // MALLOC_FAIL return 0; } } @@ -788,9 +795,8 @@ os_add_id_based(objectset *os, struct sq MT_lock_unset(&os->ht_lock); return 0; } else { /* new */ - - // TODO: can fail i.e. returns NULL - os_append_id(os, ov); + if (os_append_id(os, ov) == NULL) + return -1; // MALLOC_FAIL return 0; } @@ -805,7 +811,7 @@ os_add(objectset *os, struct sql_trans * ov->os = os; if (os_add_id_based(os, tr, b->id, ov)) { - // TODO clean up ov + _DELETE(ov); return -1; } @@ -893,7 +899,7 @@ os_del(objectset *os, struct sql_trans * ov->os = os; if (os_del_id_based(os, tr, b->id, ov)) { - // TODO clean up ov + _DELETE(ov); return -1; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list