[PATCH/RFC v3 3/6] reflog: make for_each_reflog_ent use mmap
From: Thomas Rast <hidden>
Date: 2016-06-15 22:45:58
Subsystem:
the rest · Maintainer:
Linus Torvalds
Now that all building blocks have been refactored, we can implement for_each_reflog_ent in terms of them, so that it uses mmap. Signed-off-by: Thomas Rast <redacted> --- refs.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/refs.c b/refs.c
index 0a57896..3848aa0 100644
--- a/refs.c
+++ b/refs.c@@ -1478,22 +1478,28 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) { - const char *logfile; - FILE *logfp; - char buf[1024]; + const char *log_mapped, *buf, *log_end, *logfile; + size_t mapsz; int ret = 0; - logfile = git_path("logs/%s", ref); - logfp = fopen(logfile, "r"); - if (!logfp) + buf = log_mapped = open_reflog(ref, &mapsz, &logfile); + if (!log_mapped) return -1; - while (fgets(buf, sizeof(buf), logfp)) { + log_end = buf + mapsz; + + while (buf < log_end) { unsigned char osha1[20], nsha1[20]; char *email, *message; + const char *next; unsigned long timestamp; int len, tz; - len = strlen(buf); + next = memchr(buf, '\n', log_end - buf); + if (next) + next++; + else + next = log_end; + len = next - buf; parse_reflog_line(buf, len, osha1, nsha1, &email, ×tamp, &tz, &message,
@@ -1501,8 +1507,9 @@ int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) ret = fn(osha1, nsha1, email, timestamp, tz, message, cb_data); if (ret) break; + buf = next; } - fclose(logfp); + munmap((void*) log_mapped, mapsz); return ret; }
--
1.6.1.315.g92577