@@ -86,6 +86,15 @@ db_details* db_get_details() {
8686 return &db;
8787}
8888
89+ static khiter_t db_table_find_slot (const db_table* target) {
90+ for (khiter_t k = kh_begin (db.tables ); k != kh_end (db.tables ); ++k) {
91+ if (kh_exist (db.tables , k) && kh_val (db.tables , k) == target) {
92+ return k;
93+ }
94+ }
95+ return kh_end (db.tables );
96+ }
97+
8998#ifdef DEBUG_BUILD
9099void db_validate_lru_flags () {
91100 for (khiter_t k = kh_begin (db.tables ); k != kh_end (db.tables ); ++k) {
@@ -269,11 +278,16 @@ void db_table_actually_delete(db_table* entry) {
269278 DEBUG (" [#] Cleaning up table due to refcount == 0\n " );
270279
271280 // Remove table from database
272- khiter_t k = kh_get (table, db. tables , entry-> hash );
281+ khiter_t k = db_table_find_slot ( entry);
273282 if (k != kh_end (db.tables )) {
274283 kh_del (table, db.tables , k);
275284 }
276285
286+ if (entry->cache_hash_set != NULL ) {
287+ kh_destroy (entry, entry->cache_hash_set );
288+ entry->cache_hash_set = NULL ;
289+ }
290+
277291 // Free key
278292 free (entry->key );
279293 free (entry);
@@ -703,18 +717,20 @@ static bool db_load_from_save(){
703717 // Test file existance
704718 get_key_path (entry, buffer);
705719
706- if ( access ( buffer, F_OK ) == -1 ) {
707- DEBUG (" skipping as file %s does not exist\n " , buffer);
708- free (entry);
709- continue ;
710- }
711- }else {
720+ if ( access ( buffer, F_OK ) == -1 ) {
721+ DEBUG (" skipping as file %s does not exist\n " , buffer);
722+ free (entry->key );
723+ free (entry);
724+ continue ;
725+ }
726+ }else {
712727 // Test size of blockfile
713- if ((uint32_t )d1 >= db.blocks_exist ){
714- DEBUG (" skipping as block %d does not exist\n " , d1);
715- free (entry);
716- continue ;
717- }
728+ if ((uint32_t )d1 >= db.blocks_exist ){
729+ DEBUG (" skipping as block %d does not exist\n " , d1);
730+ free (entry->key );
731+ free (entry);
732+ continue ;
733+ }
718734 // Mark this block as in-use
719735 if (block_in_use != NULL ) {
720736 block_in_use[d1 / 8 ] |= (1 << (d1 % 8 ));
@@ -1274,6 +1290,7 @@ bool db_entry_handle_delete(cache_entry* entry) {
12741290void db_delete_table_entry (db_table* table, khiter_t k, bool actually_delete = true ) {
12751291 // Clear key hash table
12761292 kh_destroy (entry, table->cache_hash_set );
1293+ table->cache_hash_set = NULL ;
12771294
12781295 // If not fully de-refed remove now, not later
12791296 if (table->refs != 0 ) {
@@ -1309,7 +1326,7 @@ void db_table_handle_delete(db_table* table, khiter_t k) {
13091326
13101327
13111328void db_table_handle_delete (db_table* table) {
1312- khiter_t k = kh_get (table, db. tables , table-> hash );
1329+ khiter_t k = db_table_find_slot (table);
13131330
13141331 return db_table_handle_delete (table, k);
13151332}
@@ -1339,15 +1356,15 @@ bool db_entry_handle_delete(cache_entry* entry, khiter_t k) {
13391356 // If table entry, cleanup table
13401357 if (kh_size (entry->table ->cache_hash_set ) == 0 ) {
13411358 // Release the reference taken when the table transitioned from empty
1342- // to non-empty. db_delete_table_entry() will release the remaining
1343- // table ownership reference.
1344- db_table_deref (entry->table );
1345- assert (!entry->table ->deleted );
1346- entry->table ->deleted = true ;
1347- k = kh_get (table, db. tables , entry->table -> hash );
1348- assert (k != kh_end (db.tables ));
1349- db_delete_table_entry (entry->table , k, true );
1350- entry->table = NULL ;
1359+ // to non-empty. db_delete_table_entry() will release the remaining
1360+ // table ownership reference.
1361+ db_table_deref (entry->table );
1362+ assert (!entry->table ->deleted );
1363+ entry->table ->deleted = true ;
1364+ k = db_table_find_slot ( entry->table );
1365+ assert (k != kh_end (db.tables ));
1366+ db_delete_table_entry (entry->table , k, true );
1367+ entry->table = NULL ;
13511368 db_entry_deref (entry, false );
13521369 return true ;
13531370 }
0 commit comments