Fix cache algorithm loophole

This closes the door for unneccessary calls to cgit_fill_cache().

Noticed by Linus.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2006-12-11 09:57:58 +01:00
parent 76827d8679
commit f5069d88df
3 changed files with 16 additions and 11 deletions

18
cgit.c
View file

@ -465,20 +465,20 @@ static void cgit_fill_cache(struct cacheitem *item)
static void cgit_refresh_cache(struct cacheitem *item)
{
cache_prepare(item);
top:
if (!cache_lookup(item)) {
if (cache_lock(item)) {
cgit_fill_cache(item);
cache_unlock(item);
} else {
if (!cache_exist(item)) {
if (!cache_lock(item)) {
sched_yield();
goto top;
}
} else if (cache_expired(item)) {
if (cache_lock(item)) {
if (!cache_exist(item))
cgit_fill_cache(item);
cache_unlock(item);
}
cache_unlock(item);
} else if (cache_expired(item) && cache_lock(item)) {
if (cache_expired(item))
cgit_fill_cache(item);
cache_unlock(item);
}
}