This closes the door for unneccessary calls to cgit_fill_cache().
Noticed by Linus.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
const int NOLOCK = -1;
-int cache_lookup(struct cacheitem *item)
+void cache_prepare(struct cacheitem *item)
{
if (!cgit_query_repo) {
item->name = xstrdup(fmt("%s/index.html", cgit_cache_root));
else
item->ttl = cgit_cache_repo_ttl;
}
+}
+
+int cache_exist(struct cacheitem *item)
+{
if (stat(item->name, &item->st)) {
item->st.st_mtime = 0;
return 0;
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);
}
}
extern int cgit_read_config(const char *filename, configfn fn);
-extern int cache_lookup(struct cacheitem *item);
+extern void cache_prepare(struct cacheitem *item);
extern int cache_lock(struct cacheitem *item);
extern int cache_unlock(struct cacheitem *item);
+extern int cache_exist(struct cacheitem *item);
extern int cache_expired(struct cacheitem *item);
#endif /* CGIT_H */