/** Return a pointer to the microdescriptor cache, creating (but not loading) * it if necessary. */ static microdesc_cache_t * get_microdesc_cache_noload(void) { if (PREDICT_UNLIKELY(the_microdesc_cache==NULL)) { microdesc_cache_t *cache = tor_malloc_zero(sizeof(*cache)); HT_INIT(microdesc_map, &cache->map); cache->cache_fname = get_cachedir_fname("cached-microdescs"); cache->journal_fname = get_cachedir_fname("cached-microdescs.new"); the_microdesc_cache = cache; } return the_microdesc_cache; }
/** * Helper: Open a consensus cache in subdirectory <b>subdir</b> of the * data directory, to hold up to <b>max_entries</b> of data. */ consensus_cache_t * consensus_cache_open(const char *subdir, int max_entries) { int storagedir_max_entries; consensus_cache_t *cache = tor_malloc_zero(sizeof(consensus_cache_t)); char *directory = get_cachedir_fname(subdir); cache->max_entries = max_entries; #ifdef MUST_UNMAP_TO_UNLINK /* If we can't unlink the files that we're still using, then we need to * tell the storagedir backend to allow far more files than this consensus * cache actually wants, so that it can hold files which, from this cache's * perspective, have become useless. */ #define VERY_LARGE_STORAGEDIR_LIMIT (1000*1000) storagedir_max_entries = VERY_LARGE_STORAGEDIR_LIMIT; #else /* !(defined(MUST_UNMAP_TO_UNLINK)) */ /* Otherwise, we can just tell the storagedir to use the same limits * as this cache. */ storagedir_max_entries = max_entries; #endif /* defined(MUST_UNMAP_TO_UNLINK) */ cache->dir = storage_dir_new(directory, storagedir_max_entries); tor_free(directory); if (!cache->dir) { tor_free(cache); return NULL; } consensus_cache_rescan(cache); return cache; }