From: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> trace_stats() is intended for GIT_TRACE_*_STATS variable group and GIT_TRACE_PACK_STATS is more like an example how new vars can be added. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/git.txt | 3 +++ cache.h | 2 ++ git.c | 1 + sha1_file.c | 24 ++++++++++++++++++++++++ trace.c | 13 +++++++++++++ trace.h | 1 + 6 files changed, 44 insertions(+) diff --git a/Documentation/git.txt b/Documentation/git.txt index 2754af8..794271e 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -1055,6 +1055,9 @@ of clones and fetches. time of each Git command. See 'GIT_TRACE' for available trace output options. +'GIT_TRACE_PACK_STATS':: + Print various statistics. + 'GIT_TRACE_SETUP':: Enables trace messages printing the .git, working tree and current working directory after Git has completed its setup phase. diff --git a/cache.h b/cache.h index b829410..7e01403 100644 --- a/cache.h +++ b/cache.h @@ -1828,4 +1828,6 @@ void sleep_millisec(int millisec); */ void safe_create_dir(const char *dir, int share); +void report_pack_stats(struct trace_key *key); + #endif /* CACHE_H */ diff --git a/git.c b/git.c index 6cc0c07..a4f6f71 100644 --- a/git.c +++ b/git.c @@ -655,6 +655,7 @@ int main(int argc, char **av) git_setup_gettext(); trace_command_performance(argv); + trace_stats(); /* * "git-xxxx" is the same as "git xxxx", but we obviously: diff --git a/sha1_file.c b/sha1_file.c index d0f2aa0..14cebdf 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -518,6 +518,7 @@ static unsigned int peak_pack_open_windows; static unsigned int pack_open_windows; static unsigned int pack_open_fds; static unsigned int pack_max_fds; +static unsigned int pack_access_nr; static size_t peak_pack_mapped; static size_t pack_mapped; struct packed_git *packed_git; @@ -543,6 +544,28 @@ void pack_report(void) sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped)); } +void report_pack_stats(struct trace_key *key) +{ + trace_printf_key(key, "\n" + "pack_report: getpagesize() = %10" SZ_FMT "\n" + "pack_report: core.packedGitWindowSize = %10" SZ_FMT "\n" + "pack_report: core.packedGitLimit = %10" SZ_FMT "\n" + "pack_report: pack_used_ctr = %10u\n" + "pack_report: pack_mmap_calls = %10u\n" + "pack_report: pack_open_windows = %10u / %10u\n" + "pack_report: pack_mapped = " + "%10" SZ_FMT " / %10" SZ_FMT "\n" + "pack_report: pack accesss = %10u\n", + sz_fmt(getpagesize()), + sz_fmt(packed_git_window_size), + sz_fmt(packed_git_limit), + pack_used_ctr, + pack_mmap_calls, + pack_open_windows, peak_pack_open_windows, + sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped), + pack_access_nr); +} + /* * Open and mmap the index file at path, perform a couple of * consistency checks, then record its information to p. Return 0 on @@ -2238,6 +2261,7 @@ static void write_pack_access_log(struct packed_git *p, off_t obj_offset) static struct trace_key pack_access = TRACE_KEY_INIT(PACK_ACCESS); trace_printf_key(&pack_access, "%s %"PRIuMAX"\n", p->pack_name, (uintmax_t)obj_offset); + pack_access_nr++; } int do_check_packed_object_crc; diff --git a/trace.c b/trace.c index 4aeea60..b1d0885 100644 --- a/trace.c +++ b/trace.c @@ -432,3 +432,16 @@ void trace_command_performance(const char **argv) sq_quote_argv(&command_line, argv, 0); command_start_time = getnanotime(); } + +static struct trace_key trace_pack_stats = TRACE_KEY_INIT(PACK_STATS); + +static void print_stats_atexit(void) +{ + report_pack_stats(&trace_pack_stats); +} + +void trace_stats(void) +{ + if (trace_want(&trace_pack_stats)) + atexit(print_stats_atexit); +} diff --git a/trace.h b/trace.h index 179b249..52bda4e 100644 --- a/trace.h +++ b/trace.h @@ -19,6 +19,7 @@ extern void trace_disable(struct trace_key *key); extern uint64_t getnanotime(void); extern void trace_command_performance(const char **argv); extern void trace_verbatim(struct trace_key *key, const void *buf, unsigned len); +extern void trace_stats(void); #ifndef HAVE_VARIADIC_MACROS -- 2.4.2.767.g62658d5-twtrsrc -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html