| // Copyright Microsoft and CHERIoT Contributors. | 
 | // SPDX-License-Identifier: MIT | 
 |  | 
 | #pragma once | 
 | #include <functional> | 
 | #include <timeout.h> | 
 |  | 
 | /** | 
 |  * Helper to turn a function that takes a timeout into one that may block | 
 |  * forever. | 
 |  */ | 
 | template<auto Fn, typename... Args> | 
 | __always_inline auto blocking_forever(Args... args) | 
 | { | 
 | 	Timeout t{UnlimitedTimeout}; | 
 | 	return Fn(&t, std::forward<Args>(args)...); | 
 | } | 
 |  | 
 | /** | 
 |  * Helper to turn a function that takes a timeout into one that may not yield | 
 |  */ | 
 | template<auto Fn, typename... Args> | 
 | __always_inline auto non_blocking(Args... args) | 
 | { | 
 | 	Timeout t{0}; | 
 | 	return Fn(&t, std::forward<Args>(args)...); | 
 | } |