eal: add macro for attribute weak
[dpdk.git] / lib / librte_eal / common / include / rte_common.h
index 6c5bc5a..c009a80 100644 (file)
@@ -68,6 +68,11 @@ typedef uint16_t unaligned_uint16_t;
 /******* Macro to mark functions and fields scheduled for removal *****/
 #define __rte_deprecated       __attribute__((__deprecated__))
 
+/**
+ * Mark a function or variable to a weak reference.
+ */
+#define __rte_weak __attribute__((__weak__))
+
 /*********** Macros to eliminate unused variable warnings ********/
 
 /**
@@ -81,6 +86,26 @@ typedef uint16_t unaligned_uint16_t;
  */
 #define RTE_SET_USED(x) (void)(x)
 
+#define RTE_PRIORITY_LOG 101
+#define RTE_PRIORITY_BUS 110
+#define RTE_PRIORITY_CLASS 120
+#define RTE_PRIORITY_LAST 65535
+
+#define RTE_PRIO(prio) \
+       RTE_PRIORITY_ ## prio
+
+/**
+ * Run function before main() with high priority.
+ *
+ * @param func
+ *   Constructor function.
+ * @param prio
+ *   Priority number must be above 100.
+ *   Lowest number is the first to run.
+ */
+#define RTE_INIT_PRIO(func, prio) \
+static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void)
+
 /**
  * Run function before main() with low priority.
  *
@@ -90,19 +115,30 @@ typedef uint16_t unaligned_uint16_t;
  *   Constructor function.
  */
 #define RTE_INIT(func) \
-static void __attribute__((constructor, used)) func(void)
+       RTE_INIT_PRIO(func, LAST)
 
 /**
- * Run function before main() with high priority.
+ * Run after main() with low priority.
  *
  * @param func
- *   Constructor function.
+ *   Destructor function name.
  * @param prio
  *   Priority number must be above 100.
- *   Lowest number is the first to run.
+ *   Lowest number is the last to run.
  */
-#define RTE_INIT_PRIO(func, prio) \
-static void __attribute__((constructor(prio), used)) func(void)
+#define RTE_FINI_PRIO(func, prio) \
+static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
+
+/**
+ * Run after main() with high priority.
+ *
+ * The destructor will be run *before* prioritized destructors.
+ *
+ * @param func
+ *   Destructor function name.
+ */
+#define RTE_FINI(func) \
+       RTE_FINI_PRIO(func, LAST)
 
 /**
  * Force a function to be inlined
@@ -117,7 +153,7 @@ static void __attribute__((constructor(prio), used)) func(void)
 /*********** Macros for pointer arithmetic ********/
 
 /**
- * add a byte-value offset from a pointer
+ * add a byte-value offset to a pointer
  */
 #define RTE_PTR_ADD(ptr, x) ((void*)((uintptr_t)(ptr) + (x)))
 
@@ -286,6 +322,11 @@ rte_combine64ms1b(register uint64_t v)
 
 /*********** Macros to work with powers of 2 ********/
 
+/**
+ * Macro to return 1 if n is a power of 2, 0 otherwise
+ */
+#define RTE_IS_POWER_OF_2(n) ((n) && !(((n) - 1) & (n)))
+
 /**
  * Returns true if n is a power of 2
  * @param n
@@ -406,7 +447,7 @@ rte_align64prevpow2(uint64_t v)
 static inline uint32_t
 rte_bsf32(uint32_t v)
 {
-       return __builtin_ctz(v);
+       return (uint32_t)__builtin_ctz(v);
 }
 
 /**