[LTP] [RFC PATCH] include: add two exponential backoff macros

Li Wang liwang@redhat.com
Wed Apr 11 12:56:44 CEST 2018


Signed-off-by: Li Wang <liwang@redhat.com>
---
 include/tst_common.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/include/tst_common.h b/include/tst_common.h
index e4466d5..4c96e6b 100644
--- a/include/tst_common.h
+++ b/include/tst_common.h
@@ -35,4 +35,51 @@
 #define LTP_ALIGN(x, a)    __LTP_ALIGN_MASK(x, (typeof(x))(a) - 1)
 #define __LTP_ALIGN_MASK(x, mask)  (((x) + (mask)) & ~(mask))
 
+/*
+ * Exponential backoff usleep for function repeat
+ * @FUNC: the function() which will be retried
+ * @ERET: an expected return value from the FUNC
+ */
+#define TST_RETRY_FUNC(FUNC, ERET) \
+	TST_RETRY_FUNC_WITH_EXPONENTIAL_BACKOFF(FUNC, ERET, 1)
+
+#define TST_RETRY_FUNC_WITH_EXPONENTIAL_BACKOFF(FUNC, ERET, MAX_DELAY) \
+do {	int delay = 1;						\
+	for (;;) {						\
+		typeof(FUNC) ret = FUNC;			\
+		if (ret == (typeof(FUNC))ERET)			\
+			break;					\
+		if (delay < MAX_DELAY * 1000000) {		\
+			usleep(delay);				\
+			delay *= 2;				\
+		} else {					\
+			tst_brk_(__FILE__, __LINE__,		\
+			TBROK | TERRNO, #FUNC " failed");	\
+		}						\
+	}							\
+} while(0)
+
+/*
+ * Exponential backoff usleep for wating a varible change
+ * @VAR: the variable will be changed in other place
+ * @EXP: an expected value which VAR should be equal to
+ */
+#define TST_WAIT_ON_VAR(VAR, EXP)	\
+	TST_WAIT_WITH_EXPONENTIAL_BACKOFF(VAR, EXP, 1)
+
+#define TST_WAIT_WITH_EXPONENTIAL_BACKOFF(VAR, EXP, MAX_DELAY)	\
+do {	int delay = 1; 						\
+	for (;;) {						\
+		if (VAR == (typeof(VAR)) EXP)			\
+			break;					\
+		if (delay < MAX_DELAY * 1000000) {		\
+			usleep(delay);				\
+			delay *= 2;				\
+		} else {					\
+			tst_brk_(__FILE__, __LINE__,		\
+			TBROK | TERRNO, #VAR " is not expected");	\
+		}						\
+	}							\
+} while(0)
+
 #endif /* TST_COMMON_H__ */
-- 
1.9.3



More information about the ltp mailing list