diff options
author | Yu-Ping Wu <yupingso@chromium.org> | 2021-06-22 17:40:01 +0800 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2021-06-26 10:09:06 +0000 |
commit | fc3576ab06a33bd3733ea37341fd3b0094e1298c (patch) | |
tree | 300ce0d78cd4e36df25c740270c56205b646dc26 /src/commonlib/bsd | |
parent | 6cd4d320398961aff5ac5de3d380d64c542edabb (diff) |
helpers: Introduce retry macro
Introduce a macro retry(attempts, condition, expr) for retrying a
condition, which is extensively used in coreboot.
Example usage:
if (!retry(3, read32(REG) == 0, mdelay(1))
printk(BIOS_ERR, "Error waiting for REG to be 0\n");
BUG=none
TEST=make tests/commonlib/bsd/helpers-test
TEST=emerge-cherry coreboot
BRANCH=none
Change-Id: I421e4dcab949616bd68b3a14231da744b9f74eeb
Signed-off-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55778
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/commonlib/bsd')
-rw-r--r-- | src/commonlib/bsd/include/commonlib/bsd/helpers.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/commonlib/bsd/include/commonlib/bsd/helpers.h b/src/commonlib/bsd/include/commonlib/bsd/helpers.h index 4e6ebeefdd..376ebaef11 100644 --- a/src/commonlib/bsd/include/commonlib/bsd/helpers.h +++ b/src/commonlib/bsd/include/commonlib/bsd/helpers.h @@ -88,4 +88,39 @@ /* Calculate size of structure member. */ #define member_size(type, member) (sizeof(((type *)0)->member)) +#define _retry_impl(attempts, condition, expr, ...) \ +({ \ + __typeof__(condition) _retry_ret = \ + (__typeof__(condition))0; \ + int _retry_attempts = (attempts); \ + do { \ + _retry_ret = (condition); \ + if (_retry_ret) \ + break; \ + if (--_retry_attempts > 0) { \ + expr; \ + } else { \ + break; \ + } \ + } while (1); \ + _retry_ret; \ +}) + +/* + * Helper macro to retry until a condition becomes true or the maximum number + * of attempts is reached. Two forms are supported: + * + * 1. retry(attempts, condition) + * 2. retry(attempts, condition, expr) + * + * @param attempts Maximum attempts. + * @param condition Condition to retry for. + * @param expr Procedure to run between each evaluation to "condition". + * + * @return Condition value if it evaluates to true within the maximum attempts; + * 0 otherwise. + */ +#define retry(attempts, condition, ...) \ + _retry_impl(attempts, condition, __VA_ARGS__) + #endif /* COMMONLIB_BSD_HELPERS_H */ |