diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-07-28 11:14:46 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-07-29 15:54:53 +0200 |
commit | 23d5dd168724fe60c7b00d78f49563a6be05627d (patch) | |
tree | 3bd28cf74b34f04e0cc6f355c859fff36c63e186 /src/shared/exit-status.c | |
parent | 8594c8a552c02fb6fa2bf569e68aa73b739e8da6 (diff) | |
download | systemd-23d5dd168724fe60c7b00d78f49563a6be05627d.tar.gz |
shared/exit-status: use Bitmap instead of Sets
I opted to embed the Bitmap structure directly in the ExitStatusSet.
This means that memory usage is a bit higher for units which don't define
this setting:
Service changes:
/* size: 2720, cachelines: 43, members: 73 */
/* sum members: 2680, holes: 9, sum holes: 39 */
/* sum bitfield members: 7 bits, bit holes: 1, sum bit holes: 1 bits */
/* last cacheline: 32 bytes */
/* size: 2816, cachelines: 44, members: 73 */
/* sum members: 2776, holes: 9, sum holes: 39 */
/* sum bitfield members: 7 bits, bit holes: 1, sum bit holes: 1 bits */
But this way the code is simpler and we do less pointer chasing.
Diffstat (limited to 'src/shared/exit-status.c')
-rw-r--r-- | src/shared/exit-status.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/shared/exit-status.c b/src/shared/exit-status.c index 12880f805e..80ac4868cb 100644 --- a/src/shared/exit-status.c +++ b/src/shared/exit-status.c @@ -134,18 +134,19 @@ int exit_status_from_string(const char *s) { return val; } -bool is_clean_exit(int code, int status, ExitClean clean, ExitStatusSet *success_status) { +bool is_clean_exit(int code, int status, ExitClean clean, const ExitStatusSet *success_status) { if (code == CLD_EXITED) return status == 0 || (success_status && - set_contains(success_status->status, INT_TO_PTR(status))); + bitmap_isset(&success_status->status, status)); - /* If a daemon does not implement handlers for some of the signals that's not considered an unclean shutdown */ + /* If a daemon does not implement handlers for some of the signals, we do not consider this an + unclean shutdown */ if (code == CLD_KILLED) return (clean == EXIT_CLEAN_DAEMON && IN_SET(status, SIGHUP, SIGINT, SIGTERM, SIGPIPE)) || (success_status && - set_contains(success_status->signal, INT_TO_PTR(status))); + bitmap_isset(&success_status->signal, status)); return false; } @@ -153,26 +154,22 @@ bool is_clean_exit(int code, int status, ExitClean clean, ExitStatusSet *success void exit_status_set_free(ExitStatusSet *x) { assert(x); - x->status = set_free(x->status); - x->signal = set_free(x->signal); + bitmap_clear(&x->status); + bitmap_clear(&x->signal); } -bool exit_status_set_is_empty(ExitStatusSet *x) { +bool exit_status_set_is_empty(const ExitStatusSet *x) { if (!x) return true; - return set_isempty(x->status) && set_isempty(x->signal); + return bitmap_isclear(&x->status) && bitmap_isclear(&x->signal); } -bool exit_status_set_test(ExitStatusSet *x, int code, int status) { - - if (exit_status_set_is_empty(x)) - return false; - - if (code == CLD_EXITED && set_contains(x->status, INT_TO_PTR(status))) +bool exit_status_set_test(const ExitStatusSet *x, int code, int status) { + if (code == CLD_EXITED && bitmap_isset(&x->status, status)) return true; - if (IN_SET(code, CLD_KILLED, CLD_DUMPED) && set_contains(x->signal, INT_TO_PTR(status))) + if (IN_SET(code, CLD_KILLED, CLD_DUMPED) && bitmap_isset(&x->signal, status)) return true; return false; |