Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/2857

to look at the new patch set (#2).

Add macros to set/get/clear/toggle bit flags

We extensively use bit masks and flags but do not have any convenience
wrappers for it which decrease code readability. Add macros which can
set/get, clear and toggle bits with corresponding doxygen annotations
and use them throughout the code to make sure they are covered by
existing tests.

Change-Id: Ie9d38b837ce84649c2975dbe8b889fe3a769885f
---
M include/osmocom/core/utils.h
M src/bits.c
M src/fsm.c
M src/gb/gprs_bssgp_vty.c
M src/gb/gprs_ns_vty.c
5 files changed, 19 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/57/2857/2

diff --git a/include/osmocom/core/utils.h b/include/osmocom/core/utils.h
index 63a73ab..3b1838e 100644
--- a/include/osmocom/core/utils.h
+++ b/include/osmocom/core/utils.h
@@ -20,6 +20,15 @@
 /*! \brief Make a value_string entry from an enum value name */
 #define OSMO_VALUE_STRING(x) { x, #x }
 
+/*! \brief Set flag bit in x */
+#define OSMO_BIT_SET(x, flag) ((x) |= 1 << (flag))
+/*! \brief Get flag bit in x */
+#define OSMO_BIT_GET(x, flag) ((x) & (1 << (flag)))
+/*! \brief Clear flag bit in x */
+#define OSMO_BIT_CLEAR(x, flag) ((x) &= ~(1 << (flag)))
+/*! \brief Toggle flag bit in x */
+#define OSMO_BIT_TOGGLE(x, flag) ((x) ^= (1 << (flag)))
+
 #include <stdint.h>
 #include <stdio.h>
 
diff --git a/src/bits.c b/src/bits.c
index 0c77b27..37c98f0 100644
--- a/src/bits.c
+++ b/src/bits.c
@@ -23,6 +23,7 @@
 #include <stdint.h>
 
 #include <osmocom/core/bits.h>
+#include <osmocom/core/utils.h>
 
 /*! \addtogroup bits
  *  @{
@@ -193,9 +194,9 @@
                op = out_ofs + i;
                bn = lsb_mode ? (op&7) : (7-(op&7));
                if (in[in_ofs+i])
-                       out[op>>3] |= 1 << bn;
+                       OSMO_BIT_SET(out[op>>3], bn);
                else
-                       out[op>>3] &= ~(1 << bn);
+                       OSMO_BIT_CLEAR(out[op>>3], bn);
        }
        return ((out_ofs + num_bits - 1) >> 3) + 1;
 }
diff --git a/src/fsm.c b/src/fsm.c
index 5e74482..333f9e9 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -355,7 +355,7 @@
        const struct osmo_fsm_state *st = &fsm->states[fi->state];
 
        /* validate if new_state is a valid state */
-       if (!(st->out_state_mask & (1 << new_state))) {
+       if (!OSMO_BIT_GET(st->out_state_mask, new_state)) {
                LOGPFSMLSRC(fi, LOGL_ERROR, file, line,
                            "transition to state %s not permitted!\n",
                            osmo_fsm_state_name(fsm, new_state));
@@ -423,12 +423,12 @@
        LOGPFSMSRC(fi, file, line,
                   "Received Event %s\n", osmo_fsm_event_name(fsm, event));
 
-       if (((1 << event) & fsm->allstate_event_mask) && fsm->allstate_action) {
+       if (OSMO_BIT_GET(fsm->allstate_event_mask, event) && 
fsm->allstate_action) {
                fsm->allstate_action(fi, event, data);
                return 0;
        }
 
-       if (!((1 << event) & fs->in_event_mask)) {
+       if (!OSMO_BIT_GET(fs->in_event_mask, event)) {
                LOGPFSMLSRC(fi, LOGL_ERROR, file, line,
                            "Event %s not permitted\n",
                            osmo_fsm_event_name(fsm, event));
diff --git a/src/gb/gprs_bssgp_vty.c b/src/gb/gprs_bssgp_vty.c
index f3f354c..7501b00 100644
--- a/src/gb/gprs_bssgp_vty.c
+++ b/src/gb/gprs_bssgp_vty.c
@@ -34,7 +34,7 @@
 #include <osmocom/gprs/gprs_ns.h>
 #include <osmocom/gprs/gprs_bssgp.h>
 #include <osmocom/gprs/gprs_bssgp_bss.h>
-
+#include <osmocom/core/utils.h>
 #include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/logging.h>
@@ -47,7 +47,7 @@
                                struct bssgp_bvc_ctx *bctx)
 {
        if (bctx) {
-               target->filter_map |= (1 << LOG_FLT_GB_BVC);
+               OSMO_BIT_SET(target->filter_map, LOG_FLT_GB_BVC);
                target->filter_data[LOG_FLT_GB_BVC] = bctx;
        } else if (target->filter_data[LOG_FLT_GB_BVC]) {
                target->filter_map = ~(1 << LOG_FLT_GB_BVC);
diff --git a/src/gb/gprs_ns_vty.c b/src/gb/gprs_ns_vty.c
index bdccb3f..e8d7a1b 100644
--- a/src/gb/gprs_ns_vty.c
+++ b/src/gb/gprs_ns_vty.c
@@ -34,7 +34,7 @@
 #include <osmocom/core/rate_ctr.h>
 #include <osmocom/gprs/gprs_ns.h>
 #include <osmocom/gprs/gprs_bssgp.h>
-
+#include <osmocom/core/utils.h>
 #include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/logging.h>
@@ -62,7 +62,7 @@
                                struct gprs_nsvc *nsvc)
 {
        if (nsvc) {
-               target->filter_map |= (1 << LOG_FLT_GB_NSVC);
+               OSMO_BIT_SET(target->filter_map, LOG_FLT_GB_NSVC);
                target->filter_data[LOG_FLT_GB_NSVC] = nsvc;
        } else if (target->filter_data[LOG_FLT_GB_NSVC]) {
                target->filter_map = ~(1 << LOG_FLT_GB_NSVC);

-- 
To view, visit https://gerrit.osmocom.org/2857
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ie9d38b837ce84649c2975dbe8b889fe3a769885f
Gerrit-PatchSet: 2
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Max <msur...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Pau Espin Pedrol <pes...@sysmocom.de>

Reply via email to