time_t mtime;
size_t size; /* In KiB. */
} **files;
-static unsigned allocated;
-static unsigned num_files;
-static size_t total_object_size;
-static size_t total_object_files;
-static size_t object_size_threshold;
-static size_t object_files_threshold;
-
-static int is_object_file(const char *fname)
-{
- int i;
- int len;
-
- len = strlen(fname);
- if (len < 2) {
- return 0;
- }
-
- /* ccache 3.0 and later: */
- if (len >= 2 && fname[len - 2] == '.' && fname[len - 1] == 'o') {
- return 1;
- }
+static unsigned allocated; /* Size of the files array. */
+static unsigned num_files; /* Number of used entries in the files array. */
- /* ccache 2.4 and earlier: */
- for (i = len - 1; i >= 0; i--) {
- if (fname[i] == '.') {
- return 0;
- } else if (fname[i] == '-') {
- return 1;
- }
- }
- return 1;
-}
+static size_t cache_size; /* In KiB. */
+static size_t files_in_cache;
+static size_t cache_size_threshold;
+static size_t files_in_cache_threshold;
/* File comparison function that orders files in mtime order, oldest first. */
static int files_compare(struct files **f1, struct files **f2)
files[num_files]->fname = x_strdup(fname);
files[num_files]->mtime = st->st_mtime;
files[num_files]->size = file_size(st) / 1024;
- if (is_object_file(fname)) {
- total_object_files += 1;
- total_object_size += files[num_files]->size;
- }
+ cache_size += files[num_files]->size;
+ files_in_cache++;
num_files++;
}
static void delete_file(const char *path, size_t size)
{
if (unlink(path) == 0) {
- if (is_object_file(path)) {
- total_object_files -= 1;
- total_object_size -= size;
- }
+ cache_size -= size;
+ files_in_cache--;
} else if (errno != ENOENT) {
cc_log("Failed to unlink %s (%s)", path, strerror(errno));
}
/* delete enough files to bring us below the threshold */
for (i = 0; i < num_files; i++) {
- if ((object_size_threshold == 0
- || total_object_size <= object_size_threshold)
- && (object_files_threshold == 0
- || total_object_files <= object_files_threshold)) {
+ if ((cache_size_threshold == 0
+ || cache_size <= cache_size_threshold)
+ && (files_in_cache_threshold == 0
+ || files_in_cache <= files_in_cache_threshold)) {
break;
}
cc_log("Cleaning up cache directory %s", dir);
- object_size_threshold = maxsize * LIMIT_MULTIPLE;
- object_files_threshold = maxfiles * LIMIT_MULTIPLE;
+ cache_size_threshold = maxsize * LIMIT_MULTIPLE;
+ files_in_cache_threshold = maxfiles * LIMIT_MULTIPLE;
num_files = 0;
- total_object_files = 0;
- total_object_size = 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, total_object_files, total_object_size);
+ stats_set_sizes(dir, files_in_cache, cache_size);
/* free it up */
for (i = 0; i < num_files; i++) {
files = NULL;
num_files = 0;
- total_object_files = 0;
- total_object_size = 0;
+ cache_size = 0;
+ files_in_cache = 0;
}
/* cleanup in all cache subdirs */
prepare_cleanup_test() {
dir=$1
+ rm -rf $dir
mkdir -p $dir
i=0
while [ $i -lt 10 ]; do
- dd if=/dev/zero of=$dir/result$i-4096.o count=1 bs=4096 2>/dev/null
- touch $dir/result$i-4096.stderr
- touch $dir/result$i-4096.d
+ dd if=/dev/zero of=$dir/result$i-4017.o count=1 bs=4017 2>/dev/null
+ touch $dir/result$i-4017.stderr
+ touch $dir/result$i-4017.d
if [ $i -gt 5 ]; then
- backdate $dir/result$i-4096.o
+ backdate $dir/result$i-4017.stderr
fi
i=`expr $i + 1`
done
- # NUMFILES: 10, TOTALSIZE: 10 KiB, MAXFILES: 0, MAXSIZE: 0
- echo "0 0 0 0 0 0 0 0 0 0 0 10 40 0 0" >$dir/stats
+ # NUMFILES: 30, TOTALSIZE: 40 KiB, MAXFILES: 0, MAXSIZE: 0
+ echo "0 0 0 0 0 0 0 0 0 0 0 30 40 0 0" >$dir/stats
}
cleanup_suite() {
checkfilecount 0 '*.o' $CCACHE_DIR
checkfilecount 0 '*.d' $CCACHE_DIR
checkfilecount 0 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 0
testname="forced cleanup, no limits"
$CCACHE -C >/dev/null
checkfilecount 10 '*.o' $CCACHE_DIR
checkfilecount 10 '*.d' $CCACHE_DIR
checkfilecount 10 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 30
testname="forced cleanup, file limit"
$CCACHE -C >/dev/null
prepare_cleanup_test $CCACHE_DIR/a
- # (9/10) * 10 * 16 = 144
- $CCACHE -F 144 -M 0 >/dev/null
+ # (9/10) * 30 * 16 = 432
+ $CCACHE -F 432 -M 0 >/dev/null
$CCACHE -c >/dev/null
# floor(0.8 * 9) = 7
checkfilecount 7 '*.o' $CCACHE_DIR
checkfilecount 7 '*.d' $CCACHE_DIR
checkfilecount 7 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 21
for i in 0 1 2 3 4 5 9; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ ! -f $file ]; then
test_failed "File $file removed when it shouldn't"
fi
done
for i in 6 7 8; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ -f $file ]; then
test_failed "File $file not removed when it should"
fi
checkfilecount 3 '*.o' $CCACHE_DIR
checkfilecount 3 '*.d' $CCACHE_DIR
checkfilecount 3 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 9
for i in 3 4 5; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ ! -f $file ]; then
test_failed "File $file removed when it shouldn't"
fi
done
for i in 0 1 2 6 7 8 9; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ -f $file ]; then
test_failed "File $file not removed when it should"
fi
for x in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
prepare_cleanup_test $CCACHE_DIR/$x
done
- # (9/10) * 10 * 16 = 144
- $CCACHE -F 144 -M 0 >/dev/null
+ # (9/10) * 30 * 16 = 432
+ $CCACHE -F 432 -M 0 >/dev/null
touch empty.c
checkfilecount 160 '*.o' $CCACHE_DIR
- checkstat 'files in cache' 160
+ checkfilecount 160 '*.d' $CCACHE_DIR
+ checkfilecount 160 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 480
$CCACHE $COMPILER -c empty.c -o empty.o
- # floor(0.8 * 10) = 7
+ # floor(0.8 * 9) = 7
checkfilecount 157 '*.o' $CCACHE_DIR
- checkstat 'files in cache' 157
+ checkfilecount 156 '*.d' $CCACHE_DIR
+ checkfilecount 156 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 469
testname="sibling cleanup"
$CCACHE -C >/dev/null
prepare_cleanup_test $CCACHE_DIR/a
- # (9/10) * 10 * 16 = 144
- $CCACHE -F 144 -M 0 >/dev/null
- backdate $CCACHE_DIR/a/result2-4096.stderr
+ # (9/10) * 30 * 16 = 432
+ $CCACHE -F 432 -M 0 >/dev/null
+ backdate $CCACHE_DIR/a/result2-4017.stderr
$CCACHE -c >/dev/null
# floor(0.8 * 9) = 7
checkfilecount 7 '*.o' $CCACHE_DIR
checkfilecount 7 '*.d' $CCACHE_DIR
checkfilecount 7 '*.stderr' $CCACHE_DIR
+ checkstat 'files in cache' 21
for i in 0 1 3 4 5 8 9; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ ! -f $file ]; then
test_failed "File $file removed when it shouldn't"
fi
done
for i in 2 6 7; do
- file=$CCACHE_DIR/a/result$i-4096.o
+ file=$CCACHE_DIR/a/result$i-4017.o
if [ -f $file ]; then
test_failed "File $file not removed when it should"
fi
testname="new unknown file"
$CCACHE -C >/dev/null
prepare_cleanup_test $CCACHE_DIR/a
- # (9/10) * 10 * 16 = 144
- $CCACHE -F 144 -M 0 >/dev/null
touch $CCACHE_DIR/a/abcd.unknown
+ $CCACHE -c >/dev/null # update counters
+ checkstat 'files in cache' 31
+ # (9/10) * 30 * 16 = 432
+ $CCACHE -F 432 -M 0 >/dev/null
$CCACHE -c >/dev/null
if [ ! -f $CCACHE_DIR/a/abcd.unknown ]; then
test_failed "$CCACHE_DIR/a/abcd.unknown removed"
fi
+ checkstat 'files in cache' 19
testname="old unknown file"
$CCACHE -C >/dev/null
prepare_cleanup_test $CCACHE_DIR/a
- # (9/10) * 10 * 16 = 144
- $CCACHE -F 144 -M 0 >/dev/null
+ # (9/10) * 30 * 16 = 432
+ $CCACHE -F 432 -M 0 >/dev/null
touch $CCACHE_DIR/a/abcd.unknown
backdate $CCACHE_DIR/a/abcd.unknown
$CCACHE -c >/dev/null
if [ -f $CCACHE_DIR/a/abcd.unknown ]; then
test_failed "$CCACHE_DIR/a/abcd.unknown not removed"
fi
+
+ testname="cleanup of tmp files"
+ $CCACHE -C >/dev/null
+ touch $CCACHE_DIR/a/abcd.tmp.efgh
+ $CCACHE -c >/dev/null # update counters
+ checkstat 'files in cache' 1
+ backdate $CCACHE_DIR/a/abcd.tmp.efgh
+ $CCACHE -c >/dev/null
+ if [ -f $CCACHE_DIR/a/abcd.tmp.efgh ]; then
+ test_failed "$CCACHE_DIR/a/abcd.tmp.unknown not removed"
+ fi
+ checkstat 'files in cache' 0
}
######################################################################