// Clean up one cache subdirectory. void clean_up_dir(struct conf *conf, const char *dir, double limit_multiple) { cc_log("Cleaning up cache directory %s", dir); // When "max files" or "max cache size" is reached, one of the 16 cache // subdirectories is cleaned up. When doing so, files are deleted (in LRU // order) until the levels are below limit_multiple. cache_size_threshold = (uint64_t)round(conf->max_size * limit_multiple / 16); files_in_cache_threshold = (size_t)round(conf->max_files * limit_multiple / 16); num_files = 0; cache_size = 0; files_in_cache = 0; // Build a list of files. traverse(dir, traverse_fn); // Clean the cache. cc_log("Before cleanup: %.0f KiB, %.0f files", (double)cache_size / 1024, (double)files_in_cache); bool cleaned = sort_and_clean(); cc_log("After cleanup: %.0f KiB, %.0f files", (double)cache_size / 1024, (double)files_in_cache); if (cleaned) { cc_log("Cleaned up cache directory %s", dir); stats_add_cleanup(dir, 1); } stats_set_sizes(dir, files_in_cache, cache_size); // Free it up. for (unsigned i = 0; i < num_files; i++) { free(files[i]->fname); free(files[i]); files[i] = NULL; } if (files) { free(files); } allocated = 0; files = NULL; num_files = 0; cache_size = 0; files_in_cache = 0; }
/* cleanup in one cache subdir */ void cleanup_dir(const char *dir, size_t maxfiles, size_t maxsize) { unsigned i; cc_log("Cleaning up cache directory %s", dir); cache_size_threshold = maxsize * LIMIT_MULTIPLE; files_in_cache_threshold = maxfiles * LIMIT_MULTIPLE; num_files = 0; cache_size = 0; files_in_cache = 0; /* build a list of files */ traverse(dir, traverse_fn); /* clean the cache */ sort_and_clean(); stats_set_sizes(dir, files_in_cache, cache_size); /* free it up */ for (i = 0; i < num_files; i++) { free(files[i]->fname); free(files[i]); files[i] = NULL; } if (files) { free(files); } allocated = 0; files = NULL; num_files = 0; cache_size = 0; files_in_cache = 0; }