/* free memory allocated for the global cache */ void destroy_im_hash(void) { if (!IM_HASH) return; if (IM_HASH->entries) free_im_hash(IM_HASH->entries); shm_free(IM_HASH); IM_HASH = NULL; }
/* reload DB cache * return value * 0: success * -1: error */ int reload_im_cache(void) { im_entry_t **hash, **old_hash; int ret; /* make sure that there is no other writer process */ writer_lock_imhash(); if (!(hash = new_im_hash())) { writer_release_imhash(); return -1; } ret = load_db(hash); if (ret == -1) { /* error occured */ LOG(L_ERR, "ERROR: reload_im_cache(): could not reload cache\n"); free_im_hash(hash); /* there can be data in the hash already */ writer_release_imhash(); return -1; } else if (ret == -2) { /* SQL table was empty -- drop hash table */ delete_im_hash(hash); hash = NULL; } old_hash = IM_HASH->entries; /* ask reader processes to stop reading */ set_wd_imhash(); IM_HASH->entries = hash; del_wd_imhash(); if (old_hash) free_im_hash(old_hash); writer_release_imhash(); return 0; }