From 23d5dd168724fe60c7b00d78f49563a6be05627d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 28 Jul 2019 11:14:46 +0200 Subject: 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. --- src/shared/bitmap.c | 6 ------ src/shared/bitmap.h | 6 +++++- src/shared/exit-status.c | 27 ++++++++++++--------------- src/shared/exit-status.h | 12 ++++++------ 4 files changed, 23 insertions(+), 28 deletions(-) (limited to 'src/shared') diff --git a/src/shared/bitmap.c b/src/shared/bitmap.c index de28b1055a..2eba72dd59 100644 --- a/src/shared/bitmap.c +++ b/src/shared/bitmap.c @@ -12,12 +12,6 @@ #include "macro.h" #include "memory-util.h" -struct Bitmap { - uint64_t *bitmaps; - size_t n_bitmaps; - size_t bitmaps_allocated; -}; - /* Bitmaps are only meant to store relatively small numbers * (corresponding to, say, an enum), so it is ok to limit * the max entry. 64k should be plenty. */ diff --git a/src/shared/bitmap.h b/src/shared/bitmap.h index 611a3e0e9d..f65a050584 100644 --- a/src/shared/bitmap.h +++ b/src/shared/bitmap.h @@ -6,7 +6,11 @@ #include "hashmap.h" #include "macro.h" -typedef struct Bitmap Bitmap; +typedef struct Bitmap { + uint64_t *bitmaps; + size_t n_bitmaps; + size_t bitmaps_allocated; +} Bitmap; Bitmap *bitmap_new(void); Bitmap *bitmap_copy(Bitmap *b); 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; diff --git a/src/shared/exit-status.h b/src/shared/exit-status.h index 24eba79f56..d6da8c19b9 100644 --- a/src/shared/exit-status.h +++ b/src/shared/exit-status.h @@ -3,9 +3,9 @@ #include +#include "bitmap.h" #include "hashmap.h" #include "macro.h" -#include "set.h" /* This defines pretty names for the LSB 'start' verb exit codes. Note that they shouldn't be confused with * the LSB 'status' verb exit codes which are defined very differently. For details see: @@ -83,8 +83,8 @@ typedef enum ExitStatusClass { } ExitStatusClass; typedef struct ExitStatusSet { - Set *status; - Set *signal; + Bitmap status; + Bitmap signal; } ExitStatusSet; const char* exit_status_to_string(int code, ExitStatusClass class) _const_; @@ -103,8 +103,8 @@ typedef enum ExitClean { EXIT_CLEAN_COMMAND, } ExitClean; -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); void exit_status_set_free(ExitStatusSet *x); -bool exit_status_set_is_empty(ExitStatusSet *x); -bool exit_status_set_test(ExitStatusSet *x, int code, int status); +bool exit_status_set_is_empty(const ExitStatusSet *x); +bool exit_status_set_test(const ExitStatusSet *x, int code, int status); -- cgit v1.2.1