⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cleanup.c

📁 ccache 是一个快速的编译器缓存。当您编译一个程序的时候
💻 C
字号:
/*   Copyright (C) Andrew Tridgell 2002      This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.      This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.      You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*//*  functions to cleanup the cache directory when it gets too large  */#include "ccache.h"static struct files {	char *fname;	time_t mtime;	size_t size;} **files;static unsigned allocated;static unsigned num_files;static size_t total_size;static size_t total_files;static size_t size_threshold;static size_t files_threshold;/* file comparison function to try to delete the oldest files first */static int files_compare(struct files **f1, struct files **f2){	if ((*f2)->mtime == (*f1)->mtime) {		return strcmp((*f2)->fname, (*f1)->fname);	}	if ((*f2)->mtime > (*f1)->mtime) {		return -1;	}	return 1;}/* this builds the list of files in the cache */static void traverse_fn(const char *fname, struct stat *st){	char *p;	if (!S_ISREG(st->st_mode)) return;	p = str_basename(fname);	if (strcmp(p, "stats") == 0) {		free(p);		return;	}	free(p);	if (num_files == allocated) {		allocated = 10000 + num_files*2;		files = (struct files **)x_realloc(files, 						   sizeof(struct files *)*allocated);	}	files[num_files] = (struct files *)x_malloc(sizeof(struct files));	files[num_files]->fname = x_strdup(fname);	files[num_files]->mtime = st->st_mtime;	files[num_files]->size = file_size(st) / 1024;	total_size += files[num_files]->size;	num_files++;}/* sort the files we've found and delete the oldest ones until we are   below the thresholds */static void sort_and_clean(void){	unsigned i;	if (num_files > 1) {		/* sort in ascending data order */		qsort(files, num_files, sizeof(struct files *), 		      (COMPAR_FN_T)files_compare);	}		/* delete enough files to bring us below the threshold */	for (i=0;i<num_files; i++) {		if ((size_threshold==0 || total_size < size_threshold) &&		    (files_threshold==0 || (num_files-i) < files_threshold)) break;		if (unlink(files[i]->fname) != 0 && errno != ENOENT) {			fprintf(stderr, "unlink %s - %s\n", 				files[i]->fname, strerror(errno));			continue;		}				total_size -= files[i]->size;	}		total_files = num_files - i;}/* cleanup in one cache subdir */void cleanup_dir(const char *dir, size_t maxfiles, size_t maxsize){	unsigned i;	size_threshold = maxsize * LIMIT_MULTIPLE;	files_threshold = maxfiles * LIMIT_MULTIPLE;	num_files = 0;	total_size = 0;	/* build a list of files */	traverse(dir, traverse_fn);	/* clean the cache */	sort_and_clean();	stats_set_sizes(dir, total_files, total_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;	total_size = 0;}/* cleanup in all cache subdirs */void cleanup_all(const char *dir){	unsigned counters[STATS_END];	char *dname, *sfile;	int i;		for (i=0;i<=0xF;i++) {		x_asprintf(&dname, "%s/%1x", dir, i);		x_asprintf(&sfile, "%s/%1x/stats", dir, i);		memset(counters, 0, sizeof(counters));		stats_read(sfile, counters);		cleanup_dir(dname, 			    counters[STATS_MAXFILES], 			    counters[STATS_MAXSIZE]);		free(dname);		free(sfile);	}}/* traverse function for wiping files */static void wipe_fn(const char *fname, struct stat *st){	char *p;	if (!S_ISREG(st->st_mode)) return;	p = str_basename(fname);	if (strcmp(p, "stats") == 0) {		free(p);		return;	}	free(p);	unlink(fname);}/* wipe all cached files in all subdirs */void wipe_all(const char *dir){	char *dname;	int i;		for (i=0;i<=0xF;i++) {		x_asprintf(&dname, "%s/%1x", dir, i);		traverse(dir, wipe_fn);		free(dname);	}	/* and fix the counters */	cleanup_all(dir);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -