about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2008-11-29 16:46:37 +0100
committerLars Hjemli <hjemli@gmail.com>2008-11-29 16:46:37 +0100
commit8813170390f3c3a0f4743afbc92ede42953fa3b0 (patch)
tree39305350baee1eb564aae00294634bbe544983d3
parentui-repolist: sort null values last (diff)
downloadcgit-pink-8813170390f3c3a0f4743afbc92ede42953fa3b0.tar.gz
cgit-pink-8813170390f3c3a0f4743afbc92ede42953fa3b0.zip
ui-repolist: implement lazy caching of repo->mtime
When sorting the list of repositories by their last modification time,
cgit would (in the worst case) invoke fstat(3) four times and open(3)
twice for each callback from qsort(3). This obviously scales very badly.

Now, the calculated modtime for each repo is saved in repo->mtime, thus
keeping the number of stat/open invocations identical for sorted and
unsorted repo-listings.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to '')
-rw-r--r--cgit.h1
-rw-r--r--shared.c1
-rw-r--r--ui-repolist.c16
3 files changed, 14 insertions, 4 deletions
diff --git a/cgit.h b/cgit.h
index ea90833..c99d337 100644
--- a/cgit.h
+++ b/cgit.h
@@ -61,6 +61,7 @@ struct cgit_repo {
 	int snapshots;
 	int enable_log_filecount;
 	int enable_log_linecount;
+	time_t mtime;
 };
 
 struct cgit_repolist {
diff --git a/shared.c b/shared.c
index f5875e4..89d1bab 100644
--- a/shared.c
+++ b/shared.c
@@ -60,6 +60,7 @@ struct cgit_repo *cgit_add_repo(const char *url)
 	ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
 	ret->module_link = ctx.cfg.module_link;
 	ret->readme = NULL;
+	ret->mtime = -1;
 	return ret;
 }
 
diff --git a/ui-repolist.c b/ui-repolist.c
index cf27cb3..aa743bf 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -32,19 +32,27 @@ static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
 {
 	char *path;
 	struct stat s;
+	struct cgit_repo *r = (struct cgit_repo *)repo;
 
+	if (repo->mtime != -1) {
+		*mtime = repo->mtime;
+		return 1;
+	}
 	path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
 	if (stat(path, &s) == 0) {
 		*mtime = read_agefile(path);
+		r->mtime = *mtime;
 		return 1;
 	}
 
 	path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
-	if (stat(path, &s) == 0) {
+	if (stat(path, &s) == 0)
 		*mtime = s.st_mtime;
-		return 1;
-	}
-	return 0;
+	else
+		*mtime = 0;
+
+	r->mtime = *mtime;
+	return (r->mtime != 0);
 }
 
 static void print_modtime(struct cgit_repo *repo)
1&follow=1'>Process htagml file line by lineJune McEnroe This simplifies some things, adds support for line number tag definitions, and should enable combining htagml with other preprocessors in the future. 2021-01-12Split fields by tab onlyJune McEnroe Also don't fail hard on non-forward-search definitions. 2021-01-12List both Makefile and html.sh under README.7June McEnroe 2021-01-12Add htagml exampleJune McEnroe 2021-01-12Use mandoc and htagml for bin htmlJune McEnroe 2021-01-12Add htagmlJune McEnroe 2021-01-12Replace causal.agency with a simple mdoc pageJune McEnroe 2021-01-11Publish "Using vi"June McEnroe 2021-01-11Enable diff.colorMovedJune McEnroe 2021-01-10Set less search case-insensitiveJune McEnroe 2021-01-10Set EXINITJune McEnroe neovim is laggy as hell in my OpenBSD VM, so I switched to vi so I could type without getting frustrated. 2021-01-09Add c -t flag to print expression typeJune McEnroe Also add missing float case. 2021-01-05Update taglineJune McEnroe