|
diff --git a/cache.c b/cache.c index b034c48..0ffa502 100644 --- a/ cache.c+++ b/ cache.c |
|
@@ -9,9 +9,9 @@ |
9 | #include "cgit.h" |
9 | #include "cgit.h" |
10 | |
10 | |
11 | const int NOLOCK = -1; |
11 | const int NOLOCK = -1; |
12 | |
12 | |
13 | int cache_lookup(struct cacheitem *item) |
13 | void cache_prepare(struct cacheitem *item) |
14 | { |
14 | { |
15 | if (!cgit_query_repo) { |
15 | if (!cgit_query_repo) { |
16 | item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); |
16 | item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); |
17 | item->ttl = cgit_cache_root_ttl; |
17 | item->ttl = cgit_cache_root_ttl; |
@@ -29,8 +29,12 @@ int cache_lookup(struct cacheitem *item) |
29 | item->ttl = cgit_cache_static_ttl; |
29 | item->ttl = cgit_cache_static_ttl; |
30 | else |
30 | else |
31 | item->ttl = cgit_cache_repo_ttl; |
31 | item->ttl = cgit_cache_repo_ttl; |
32 | } |
32 | } |
| |
33 | } |
| |
34 | |
| |
35 | int cache_exist(struct cacheitem *item) |
| |
36 | { |
33 | if (stat(item->name, &item->st)) { |
37 | if (stat(item->name, &item->st)) { |
34 | item->st.st_mtime = 0; |
38 | item->st.st_mtime = 0; |
35 | return 0; |
39 | return 0; |
36 | } |
40 | } |
|
|
diff --git a/cgit.c b/cgit.c index 110face..7f14016 100644 --- a/ cgit.c+++ b/ cgit.c |
|
@@ -464,22 +464,22 @@ static void cgit_fill_cache(struct cacheitem *item) |
464 | } |
464 | } |
465 | |
465 | |
466 | static void cgit_refresh_cache(struct cacheitem *item) |
466 | static void cgit_refresh_cache(struct cacheitem *item) |
467 | { |
467 | { |
| |
468 | cache_prepare(item); |
468 | top: |
469 | top: |
469 | if (!cache_lookup(item)) { |
470 | if (!cache_exist(item)) { |
470 | if (cache_lock(item)) { |
471 | if (!cache_lock(item)) { |
471 | cgit_fill_cache(item); |
| |
472 | cache_unlock(item); |
| |
473 | } else { |
| |
474 | sched_yield(); |
472 | sched_yield(); |
475 | goto top; |
473 | goto top; |
476 | } |
474 | } |
477 | } else if (cache_expired(item)) { |
475 | if (!cache_exist(item)) |
478 | if (cache_lock(item)) { |
| |
479 | cgit_fill_cache(item); |
476 | cgit_fill_cache(item); |
480 | cache_unlock(item); |
477 | cache_unlock(item); |
481 | } |
478 | } else if (cache_expired(item) && cache_lock(item)) { |
| |
479 | if (cache_expired(item)) |
| |
480 | cgit_fill_cache(item); |
| |
481 | cache_unlock(item); |
482 | } |
482 | } |
483 | } |
483 | } |
484 | |
484 | |
485 | static void cgit_print_cache(struct cacheitem *item) |
485 | static void cgit_print_cache(struct cacheitem *item) |
|
|
diff --git a/cgit.h b/cgit.h index 1e084d4..3b0994a 100644 --- a/ cgit.h+++ b/ cgit.h |
|
@@ -55,10 +55,11 @@ extern void html_link_close(void); |
55 | |
55 | |
56 | |
56 | |
57 | extern int cgit_read_config(const char *filename, configfn fn); |
57 | extern int cgit_read_config(const char *filename, configfn fn); |
58 | |
58 | |
59 | extern int cache_lookup(struct cacheitem *item); |
59 | extern void cache_prepare(struct cacheitem *item); |
60 | extern int cache_lock(struct cacheitem *item); |
60 | extern int cache_lock(struct cacheitem *item); |
61 | extern int cache_unlock(struct cacheitem *item); |
61 | extern int cache_unlock(struct cacheitem *item); |
| |
62 | extern int cache_exist(struct cacheitem *item); |
62 | extern int cache_expired(struct cacheitem *item); |
63 | extern int cache_expired(struct cacheitem *item); |
63 | |
64 | |
64 | #endif /* CGIT_H */ |
65 | #endif /* CGIT_H */ |
|