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>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Patrick Georgi
					
				
			
			
				
	
			
			
			
						parent
						
							6cd4d32039
						
					
				
				
					commit
					fc3576ab06
				
			@@ -1,5 +1,7 @@
 | 
			
		||||
# SPDX-License-Identifier: GPL-2.0-only
 | 
			
		||||
 | 
			
		||||
subdirs-y += bsd
 | 
			
		||||
 | 
			
		||||
tests-y += region-test
 | 
			
		||||
 | 
			
		||||
region-test-srcs += tests/commonlib/region-test.c
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								tests/commonlib/bsd/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/commonlib/bsd/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
# SPDX-License-Identifier: GPL-2.0-only
 | 
			
		||||
 | 
			
		||||
tests-y += helpers-test
 | 
			
		||||
 | 
			
		||||
helpers-test-srcs += tests/commonlib/bsd/helpers-test.c
 | 
			
		||||
							
								
								
									
										41
									
								
								tests/commonlib/bsd/helpers-test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								tests/commonlib/bsd/helpers-test.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
/* SPDX-License-Identifier: GPL-2.0-only */
 | 
			
		||||
 | 
			
		||||
#include <commonlib/bsd/helpers.h>
 | 
			
		||||
#include <tests/test.h>
 | 
			
		||||
 | 
			
		||||
static void func(void)
 | 
			
		||||
{
 | 
			
		||||
	function_called();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void test_retry(void **state)
 | 
			
		||||
{
 | 
			
		||||
	int count;
 | 
			
		||||
 | 
			
		||||
	/* 2-argument form */
 | 
			
		||||
	count = 0;
 | 
			
		||||
	assert_true(retry(3, ++count == 1));
 | 
			
		||||
	count = 0;
 | 
			
		||||
	assert_true(retry(3, ++count == 3));
 | 
			
		||||
	count = 0;
 | 
			
		||||
	assert_false(retry(3, ++count == 4));
 | 
			
		||||
 | 
			
		||||
	/* 3-argument form */
 | 
			
		||||
	expect_function_calls(func, 9);
 | 
			
		||||
	assert_null(retry(10, NULL, func()));
 | 
			
		||||
 | 
			
		||||
	assert_int_equal(retry(10, 999, func()), 999);
 | 
			
		||||
 | 
			
		||||
	count = 0;
 | 
			
		||||
	expect_function_calls(func, 3);
 | 
			
		||||
	assert_true(retry(10, ++count == 4, func()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
	const struct CMUnitTest tests[] = {
 | 
			
		||||
		cmocka_unit_test(test_retry),
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	return cmocka_run_group_tests(tests, NULL, NULL);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user