зеркало из https://github.com/microsoft/git.git
common-main.c: move non-trace2 exit() behavior out of trace2.c
Change the exit() wrapper added inee4512ed48
(trace2: create new combined trace facility, 2019-02-22) so that we'll split up the trace2 logging concerns from wanting to wrap the "exit()" function itself for other purposes. This makes more sense structurally, as we won't seem to conflate non-trace2 behavior with the trace2 code. I'd previously added an explanation for this in368b584315
(common-main.c: call exit(), don't return, 2021-12-07), that comment is being adjusted here. Now the only thing we'll do if we're not using trace2 is to truncate the "code" argument to the lowest 8 bits. We only need to do that truncation on non-POSIX systems, but inee4512ed48
that "if defined(__MINGW32__)" code added in47e3de0e79
(MinGW: truncate exit()'s argument to lowest 8 bits, 2009-07-05) was made to run everywhere. It might be good for clarify to narrow that down by an "ifdef" again, but I'm not certain that in the interim we haven't had some other non-POSIX systems rely the behavior. On a POSIX system taking the lowest 8 bits is implicit, see exit(3)[1] and wait(2)[2]. Let's leave a comment about that instead. 1. https://man7.org/linux/man-pages/man3/exit.3.html 2. https://man7.org/linux/man-pages/man2/wait.2.html Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
2668e3608e
Коммит
19d75948ef
|
@ -55,10 +55,22 @@ int main(int argc, const char **argv)
|
|||
|
||||
result = cmd_main(argc, argv);
|
||||
|
||||
/*
|
||||
* We define exit() to call trace2_cmd_exit_fl() in
|
||||
* git-compat-util.h. Whether we reach this or exit()
|
||||
* elsewhere we'll always run our trace2 exit handler.
|
||||
*/
|
||||
/* Not exit(3), but a wrapper calling our common_exit() */
|
||||
exit(result);
|
||||
}
|
||||
|
||||
/* We wrap exit() to call common_exit() in git-compat-util.h */
|
||||
int common_exit(const char *file, int line, int code)
|
||||
{
|
||||
/*
|
||||
* For non-POSIX systems: Take the lowest 8 bits of the "code"
|
||||
* to e.g. turn -1 into 255. On a POSIX system this is
|
||||
* redundant, see exit(3) and wait(2), but as it doesn't harm
|
||||
* anything there we don't need to guard this with an "ifdef".
|
||||
*/
|
||||
code &= 0xff;
|
||||
|
||||
trace2_cmd_exit_fl(file, line, code);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
|
|
@ -1451,8 +1451,8 @@ int cmd_main(int, const char **);
|
|||
* Intercept all calls to exit() and route them to trace2 to
|
||||
* optionally emit a message before calling the real exit().
|
||||
*/
|
||||
int trace2_cmd_exit_fl(const char *file, int line, int code);
|
||||
#define exit(code) exit(trace2_cmd_exit_fl(__FILE__, __LINE__, (code)))
|
||||
int common_exit(const char *file, int line, int code);
|
||||
#define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))
|
||||
|
||||
/*
|
||||
* You can mark a stack variable with UNLEAK(var) to avoid it being
|
||||
|
|
8
trace2.c
8
trace2.c
|
@ -202,17 +202,15 @@ void trace2_cmd_start_fl(const char *file, int line, const char **argv)
|
|||
argv);
|
||||
}
|
||||
|
||||
int trace2_cmd_exit_fl(const char *file, int line, int code)
|
||||
void trace2_cmd_exit_fl(const char *file, int line, int code)
|
||||
{
|
||||
struct tr2_tgt *tgt_j;
|
||||
int j;
|
||||
uint64_t us_now;
|
||||
uint64_t us_elapsed_absolute;
|
||||
|
||||
code &= 0xff;
|
||||
|
||||
if (!trace2_enabled)
|
||||
return code;
|
||||
return;
|
||||
|
||||
trace_git_fsync_stats();
|
||||
trace2_collect_process_info(TRACE2_PROCESS_INFO_EXIT);
|
||||
|
@ -226,8 +224,6 @@ int trace2_cmd_exit_fl(const char *file, int line, int code)
|
|||
if (tgt_j->pfn_exit_fl)
|
||||
tgt_j->pfn_exit_fl(file, line, us_elapsed_absolute,
|
||||
code);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
void trace2_cmd_error_va_fl(const char *file, int line, const char *fmt,
|
||||
|
|
8
trace2.h
8
trace2.h
|
@ -101,14 +101,8 @@ void trace2_cmd_start_fl(const char *file, int line, const char **argv);
|
|||
|
||||
/*
|
||||
* Emit an 'exit' event.
|
||||
*
|
||||
* Write the exit-code that will be passed to exit() or returned
|
||||
* from main().
|
||||
*
|
||||
* Use this prior to actually calling exit().
|
||||
* See "#define exit()" in git-compat-util.h
|
||||
*/
|
||||
int trace2_cmd_exit_fl(const char *file, int line, int code);
|
||||
void trace2_cmd_exit_fl(const char *file, int line, int code);
|
||||
|
||||
#define trace2_cmd_exit(code) (trace2_cmd_exit_fl(__FILE__, __LINE__, (code)))
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче