diff --git a/repos/base/include/util/retry.h b/repos/base/include/util/retry.h new file mode 100644 index 0000000000..d153dbb512 --- /dev/null +++ b/repos/base/include/util/retry.h @@ -0,0 +1,50 @@ +/* + * \brief Utility to execute a function repeatedly + * \author Norman Feske + * \author Stefan Kalkowski + * \date 2015-04-29 + */ + +/* + * Copyright (C) 2015 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__UTIL__RETRY_H_ +#define _INCLUDE__UTIL__RETRY_H_ + +namespace Genode { + + template + auto retry(FUNC func, HANDLER handler, + unsigned attempts = ~0U) -> decltype(func()); +} + +/** + * Repeatedly try to execute a function 'func' + * + * If the function 'func' throws an exception of type 'EXC', the 'handler' + * is called and the function call is retried. + * + * \param EXC exception type to handle + * \param func functor to execute + * \param handler exception handler executed if 'func' raised an exception + * of type 'EXC' + * \param attempts number of attempts to execute 'func' before giving up + * and reflecting the exception 'EXC' to the caller. If not + * specified, attempt infinitely. + */ +template +auto Genode::retry(FUNC func, HANDLER handler, + unsigned attempts = ~0U) -> decltype(func()) +{ + for (unsigned i = 0; attempts == ~0U || i < attempts; i++) + try { return func(); } + catch (EXC) { handler(); } + + throw EXC(); +} + +#endif /* _INCLUDE__UTIL__RETRY_H_ */ diff --git a/repos/base/src/base/env/platform_env_common.h b/repos/base/src/base/env/platform_env_common.h index 8b73be3270..2836d9d9ca 100644 --- a/repos/base/src/base/env/platform_env_common.h +++ b/repos/base/src/base/env/platform_env_common.h @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -35,31 +36,6 @@ namespace Genode { } -/** - * Repeatedly try to execute a function 'func' - * - * If the function 'func' throws an exception of type 'EXC', the 'handler' - * is called and the function call is retried. - * - * \param EXC exception type to handle - * \param func functor to execute - * \param handler exception handler executed if 'func' raised an exception - * of type 'EXC' - * \param attempts number of attempts to execute 'func' before giving up - * and reflecting the exception 'EXC' to the caller. If not - * specified, attempt infinitely. - */ -template -auto retry(FUNC func, HANDLER handler, unsigned attempts = ~0U) -> decltype(func()) -{ - for (unsigned i = 0; attempts == ~0U || i < attempts; i++) - try { return func(); } - catch (EXC) { handler(); } - - throw EXC(); -} - - /** * Client object for a session that may get its session quota upgraded */