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>
这个提交包含在:
@ -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)
|
||||
|
在新工单中引用
屏蔽一个用户