summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cache.c6
-rw-r--r--cgit.c18
-rw-r--r--cgit.h3
3 files changed, 16 insertions, 11 deletions
diff --git a/cache.c b/cache.c
index b034c48..0ffa502 100644
--- a/cache.c
+++ b/cache.c
@@ -7,13 +7,13 @@
*/
#include "cgit.h"
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));
item->ttl = cgit_cache_root_ttl;
} else if (!cgit_query_page) {
item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root,
@@ -27,12 +27,16 @@ int cache_lookup(struct cacheitem *item)
item->ttl = cgit_cache_dynamic_ttl;
else if (cgit_query_has_sha1)
item->ttl = cgit_cache_static_ttl;
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;
}
return 1;
}
diff --git a/cgit.c b/cgit.c
index 110face..7f14016 100644
--- a/cgit.c
+++ b/cgit.c
@@ -462,26 +462,26 @@ static void cgit_fill_cache(struct cacheitem *item)
else
cgit_print_repolist();
}
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);
}
}
static void cgit_print_cache(struct cacheitem *item)
{
static char buf[4096];
diff --git a/cgit.h b/cgit.h
index 1e084d4..3b0994a 100644
--- a/cgit.h
+++ b/cgit.h
@@ -53,12 +53,13 @@ extern void html_attr(char *txt);
extern void html_link_open(char *url, char *title, char *class);
extern void html_link_close(void);
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 */