[dpdk-dev,v2,1/3] eal: fix keep alive header for C++

Message ID 1455606865-22680-2-git-send-email-thomas.monjalon@6wind.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Thomas Monjalon Feb. 16, 2016, 7:14 a.m. UTC
  When built in a C++ application, the keepalive include fails:

rte_keepalive.h:142:41: error: ‘ALIVE’ was not declared in this scope
  keepcfg->state_flags[rte_lcore_id()] = ALIVE;
                                         ^
C++ requires to use a scope operator to access an enum inside a struct.
There was also a namespace issue for the values (no RTE prefix).
The solution is to move the struct and related code out of the header file.

Fixes: 75583b0d1efd ("eal: add keep alive monitoring")

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 lib/librte_eal/common/include/rte_keepalive.h | 37 +++-----------------------
 lib/librte_eal/common/rte_keepalive.c         | 38 +++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 34 deletions(-)

v2:
- move keep-alive struct out of header
- uninline mark_alive function
  

Comments

Remy Horton Feb. 16, 2016, 10:16 a.m. UTC | #1
Suspect this will introduce an extra indirection and call/return into 
the generated code, but can't think of any alternative that doesn't 
potentially break source compatibility..


On 16/02/2016 07:14, Thomas Monjalon wrote:
> When built in a C++ application, the keepalive include fails:
>
> rte_keepalive.h:142:41: error: ‘ALIVE’ was not declared in this scope
>    keepcfg->state_flags[rte_lcore_id()] = ALIVE;
>                                           ^
> C++ requires to use a scope operator to access an enum inside a struct.
> There was also a namespace issue for the values (no RTE prefix).
> The solution is to move the struct and related code out of the header file.
>
> Fixes: 75583b0d1efd ("eal: add keep alive monitoring")
>
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>

Acked-by: Remy Horton <remy.horton@intel.com>
  

Patch

diff --git a/lib/librte_eal/common/include/rte_keepalive.h b/lib/librte_eal/common/include/rte_keepalive.h
index 02472c0..f4cec04 100644
--- a/lib/librte_eal/common/include/rte_keepalive.h
+++ b/lib/librte_eal/common/include/rte_keepalive.h
@@ -64,35 +64,7 @@  typedef void (*rte_keepalive_failure_callback_t)(
  * Keepalive state structure.
  * @internal
  */
-struct rte_keepalive {
-	/** Core Liveness. */
-	enum {
-		ALIVE = 1,
-		MISSING = 0,
-		DEAD = 2,
-		GONE = 3
-	} __rte_cache_aligned state_flags[RTE_KEEPALIVE_MAXCORES];
-
-	/** Last-seen-alive timestamps */
-	uint64_t last_alive[RTE_KEEPALIVE_MAXCORES];
-
-	/**
-	 * Cores to check.
-	 * Indexed by core id, non-zero if the core should be checked.
-	 */
-	uint8_t active_cores[RTE_KEEPALIVE_MAXCORES];
-
-	/** Dead core handler. */
-	rte_keepalive_failure_callback_t callback;
-
-	/**
-	 * Dead core handler app data.
-	 * Pointer is passed to dead core handler.
-	 */
-	void *callback_data;
-	uint64_t tsc_initial;
-	uint64_t tsc_mhz;
-};
+struct rte_keepalive;
 
 
 /**
@@ -136,11 +108,8 @@  void rte_keepalive_register_core(struct rte_keepalive *keepcfg,
  * This function needs to be called from within the main process loop of
  * the LCore to be checked.
  */
-static inline void
-rte_keepalive_mark_alive(struct rte_keepalive *keepcfg)
-{
-	keepcfg->state_flags[rte_lcore_id()] = ALIVE;
-}
+void
+rte_keepalive_mark_alive(struct rte_keepalive *keepcfg);
 
 
 #endif /* _KEEPALIVE_H_ */
diff --git a/lib/librte_eal/common/rte_keepalive.c b/lib/librte_eal/common/rte_keepalive.c
index 736fd0f..bd1f16b 100644
--- a/lib/librte_eal/common/rte_keepalive.c
+++ b/lib/librte_eal/common/rte_keepalive.c
@@ -39,6 +39,37 @@ 
 #include <rte_keepalive.h>
 #include <rte_malloc.h>
 
+struct rte_keepalive {
+	/** Core Liveness. */
+	enum rte_keepalive_state {
+		ALIVE = 1,
+		MISSING = 0,
+		DEAD = 2,
+		GONE = 3
+	} __rte_cache_aligned state_flags[RTE_KEEPALIVE_MAXCORES];
+
+	/** Last-seen-alive timestamps */
+	uint64_t last_alive[RTE_KEEPALIVE_MAXCORES];
+
+	/**
+	 * Cores to check.
+	 * Indexed by core id, non-zero if the core should be checked.
+	 */
+	uint8_t active_cores[RTE_KEEPALIVE_MAXCORES];
+
+	/** Dead core handler. */
+	rte_keepalive_failure_callback_t callback;
+
+	/**
+	 * Dead core handler app data.
+	 * Pointer is passed to dead core handler.
+	 */
+	void *callback_data;
+	uint64_t tsc_initial;
+	uint64_t tsc_mhz;
+};
+
+
 static void
 print_trace(const char *msg, struct rte_keepalive *keepcfg, int idx_core)
 {
@@ -111,3 +142,10 @@  rte_keepalive_register_core(struct rte_keepalive *keepcfg, const int id_core)
 	if (id_core < RTE_KEEPALIVE_MAXCORES)
 		keepcfg->active_cores[id_core] = 1;
 }
+
+
+void
+rte_keepalive_mark_alive(struct rte_keepalive *keepcfg)
+{
+	keepcfg->state_flags[rte_lcore_id()] = ALIVE;
+}