From: Samuel Just Date: Fri, 22 Nov 2019 01:52:00 +0000 (+0000) Subject: crimson/common/errorator.h: add finally method for resource release X-Git-Tag: v15.1.0~687^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=260f23b7598597ca90e7f436a52d09b23709a8b0;p=ceph-ci.git crimson/common/errorator.h: add finally method for resource release This way we can add things like resource handlers which are otherwise transparent to passing values and errors. Signed-off-by: Samuel Just --- diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 28aa729fe88..dc0ec2e61c8 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -518,6 +518,24 @@ private: }); } + template + auto finally(FuncT &&func) { + using func_result_t = std::invoke_result_t; + using func_errorator_t = get_errorator_t; + using return_errorator_t = func_errorator_t; + using futurator_t = + typename return_errorator_t::template futurize; + + return this->then_wrapped( + [ func = std::forward(func) + ] (auto&& future) mutable [[gnu::always_inline]] noexcept { + return futurator_t::apply(std::forward(func)).safe_then( + [future = std::forward(future)]() mutable { + return std::move(future); + }); + }); + } + // taking ErrorFuncOne and ErrorFuncTwo separately from ErrorFuncTail // to avoid SFINAE template