aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Loparco (eloparco) <eloparco@cisco.com>2021-04-05 12:10:45 +0200
committerEnrico Loparco (eloparco) <eloparco@cisco.com>2021-06-24 09:20:11 +0200
commit1c37763975af0a6c89a9089aa606155227e67d41 (patch)
tree4722a4abeda4cdf188a512a6508d0d79d1fda330
parent229385955109b866a23c4ac2aa03d4d11044c39d (diff)
[HICN-555, HICN-556] Add loop utility function and fix memory bug in bitmap
A helper function is added to the loop class to allow loop exit after empty event queue. This function is used when running tests. Signed-off-by: Enrico Loparco (eloparco) <eloparco@cisco.com> Change-Id: I7bbab32a7d7f53365439f0fba2b9a030d34ac823
-rw-r--r--hicn-light/src/hicn/base/bitmap.h17
-rw-r--r--hicn-light/src/hicn/base/loop.c9
-rw-r--r--hicn-light/src/hicn/base/loop.h10
-rw-r--r--hicn-light/src/hicn/base/test/test-loop.cc4
4 files changed, 32 insertions, 8 deletions
diff --git a/hicn-light/src/hicn/base/bitmap.h b/hicn-light/src/hicn/base/bitmap.h
index 1159806c8..908b28d87 100644
--- a/hicn-light/src/hicn/base/bitmap.h
+++ b/hicn-light/src/hicn/base/bitmap.h
@@ -100,16 +100,27 @@ bitmap_get(const bitmap_t * bitmap, off_t i)
*
* @return bool
*/
+#define bitmap_set(bitmap, i) \
+ _bitmap_set((bitmap_t**)&bitmap, i)
+
+/*
+ * @brief Returns whether the i-th bit is unset (equal to 0) in a bitmap (helper).
+ *
+ * @param[in] bitmap The bitmap to access.
+ * @param[in] i The bit position.
+ *
+ * @return bool
+ */
static inline
int
-bitmap_set(bitmap_t * bitmap, off_t i)
+_bitmap_set(bitmap_t ** bitmap, off_t i)
{
- if (bitmap_ensure_pos(&bitmap, i) < 0)
+ if (bitmap_ensure_pos(bitmap, i) < 0)
return -1;
size_t offset = i / BITMAP_WIDTH(bitmap);
size_t pos = i % BITMAP_WIDTH(bitmap);
size_t shift = BITMAP_WIDTH(bitmap) - pos - 1;
- bitmap[offset] |= 1ul << shift;
+ (*bitmap)[offset] |= 1ul << shift;
return 0;
}
diff --git a/hicn-light/src/hicn/base/loop.c b/hicn-light/src/hicn/base/loop.c
index 8588b538d..d27e81f5b 100644
--- a/hicn-light/src/hicn/base/loop.c
+++ b/hicn-light/src/hicn/base/loop.c
@@ -97,12 +97,17 @@ void loop_free(loop_t *loop) {
free(loop);
}
-int loop_dispatch(loop_t *loop)
+int _loop_dispatch(loop_t *loop, int flags)
{
- event_base_loop(loop->event_base, EVLOOP_NO_EXIT_ON_EMPTY);
+ event_base_loop(loop->event_base, flags);
return 0;
}
+int loop_dispatch(loop_t *loop)
+{
+ return _loop_dispatch(loop, EVLOOP_NO_EXIT_ON_EMPTY);
+}
+
int loop_undispatch(loop_t *loop) { return 0; }
void loop_break(loop_t *loop) { event_base_loopbreak(loop->event_base); }
diff --git a/hicn-light/src/hicn/base/loop.h b/hicn-light/src/hicn/base/loop.h
index 697021175..544d73cd7 100644
--- a/hicn-light/src/hicn/base/loop.h
+++ b/hicn-light/src/hicn/base/loop.h
@@ -52,7 +52,15 @@ loop_t *loop_create();
void loop_free(loop_t *loop);
/**
- * \brief Runs the loop instance to process events
+ * \brief Runs the loop instance to process events (helper).
+ * \param [in] loop - Pointer to the loop instance
+ * \param [in] flags - Loop mode: EVLOOP_ONCE, EVLOOP_NONBLOCK or EVLOOP_NO_EXIT_ON_EMPTY
+ * \return 0 if successful, -1 otherwise
+ */
+int _loop_dispatch(loop_t *loop, int flags);
+
+/**
+ * \brief Runs the loop instance to process events.
* \param [in] loop - Pointer to the loop instance
* \return 0 if successful, -1 otherwise
*/
diff --git a/hicn-light/src/hicn/base/test/test-loop.cc b/hicn-light/src/hicn/base/test/test-loop.cc
index c86ccd5e6..d50b2472a 100644
--- a/hicn-light/src/hicn/base/test/test-loop.cc
+++ b/hicn-light/src/hicn/base/test/test-loop.cc
@@ -229,7 +229,7 @@ TEST_F(LoopTest, TimerCreateAndCancel)
ret = loop_timer_register(timer2, timer_tick_ / 2);
EXPECT_TRUE(ret >= 0);
- loop_dispatch(loop_);
+ _loop_dispatch(loop_, 0);
loop_undispatch(loop_);
@@ -266,7 +266,7 @@ TEST_F(LoopTest, LoopDispatch)
EXPECT_TRUE(ret >= 0);
// Start event dispatching
- loop_dispatch(loop_);
+ _loop_dispatch(loop_, 0);
// Stop dispatching
loop_undispatch(loop_);