X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/25105d7ecaba474d4b7c364ebb586aac3dfc5abb..51ada4fda2b47710351e6e4da8a95807d6d9f729:/cgit.c
diff --git a/cgit.c b/cgit.c
index 09c857c..5567859 100644
--- a/cgit.c
+++ b/cgit.c
@@ -1,13 +1,23 @@
+/* cgit.c: cgi for the git scm
+ *
+ * Copyright (C) 2006 Lars Hjemli
+ *
+ * Licensed under GNU General Public License v2
+ * (see COPYING for full license text)
+ */
+
#include "cgit.h"
-static const char cgit_doctype[] =
+const char cgit_version[] = CGIT_VERSION;
+
+const char cgit_doctype[] =
"\n";
-static const char cgit_error[] =
+const char cgit_error[] =
"
%s
";
-static const char cgit_lib_error[] =
+const char cgit_lib_error[] =
"%s: %s
";
int htmlfd = 0;
@@ -21,6 +31,7 @@ char *cgit_virtual_root = NULL;
char *cgit_cache_root = "/var/cache/cgit";
+int cgit_max_lock_attempts = 5;
int cgit_cache_root_ttl = 5;
int cgit_cache_repo_ttl = 5;
int cgit_cache_dynamic_ttl = 5;
@@ -42,32 +53,6 @@ char *cgit_query_sha1 = NULL;
struct cacheitem cacheitem;
-int cgit_parse_query(char *txt, configfn fn)
-{
- char *t, *value = NULL, c;
-
- if (!txt)
- return 0;
-
- t = txt = xstrdup(txt);
-
- while((c=*t) != '\0') {
- if (c=='=') {
- *t = '\0';
- value = t+1;
- } else if (c=='&') {
- *t = '\0';
- (*fn)(txt, value);
- txt = t+1;
- value = NULL;
- }
- t++;
- }
- if (t!=txt)
- (*fn)(txt, value);
- return 0;
-}
-
void cgit_global_config_cb(const char *name, const char *value)
{
if (!strcmp(name, "root"))
@@ -192,6 +177,7 @@ static void cgit_print_docstart(char *title)
html("");
html_txt(title);
html("\n");
+ htmlf("\n", cgit_version);
html("\n");
@@ -454,20 +440,26 @@ static void cgit_fill_cache(struct cacheitem *item)
static void cgit_refresh_cache(struct cacheitem *item)
{
+ int i = 0;
+
+ cache_prepare(item);
top:
- if (!cache_lookup(item)) {
- if (cache_lock(item)) {
- cgit_fill_cache(item);
- cache_unlock(item);
- } else {
- sched_yield();
+ if (++i > cgit_max_lock_attempts) {
+ die("cgit_refresh_cache: unable to lock %s: %s",
+ item->name, strerror(errno));
+ }
+ if (!cache_exist(item)) {
+ if (!cache_lock(item)) {
+ sleep(1);
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);
}
}