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 4585103..1086ced 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -1045,6 +1045,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 3ba0b8f..8791dbc 100644 --- a/cache.h +++ b/cache.h @@ -1747,4 +1747,6 @@ void stat_validity_update(struct stat_validity *sv, int fd); int versioncmp(const char *s1, const char *s2); void sleep_millisec(int millisec); +void report_pack_stats(struct trace_key *key); + #endif /* CACHE_H */ diff --git a/git.c b/git.c index 6ed824c..f4018c5 100644 --- a/git.c +++ b/git.c @@ -644,6 +644,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 c5b31de..1d3508d 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -517,6 +517,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; @@ -542,6 +543,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 @@ -2244,6 +2267,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.2.0.513.g477eb31 -- 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