summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--netfs/fuse/fuseAppBase.h53
1 files changed, 24 insertions, 29 deletions
diff --git a/netfs/fuse/fuseAppBase.h b/netfs/fuse/fuseAppBase.h
index d899e00..5cc8f7f 100644
--- a/netfs/fuse/fuseAppBase.h
+++ b/netfs/fuse/fuseAppBase.h
@@ -138,39 +138,34 @@ class DLL_PUBLIC FuseAppBase {
static void fuseDestroy(void *);
template <typename BFunc, typename IFunc, BFunc bfunc, typename ... Args>
- static typename std::enable_if<!std::is_same<BFunc, IFunc>::value, int(*)(Args...)>::type getHelper(int(FuseAppBase::*)(Args...))
+ static int(*getHelper(int(FuseAppBase::*)(Args...)))(Args...)
{
- return &helper<BFunc, bfunc, Args...>;
- }
- template <typename BFunc, typename IFunc, BFunc bfunc, typename ... Args>
- static typename std::enable_if<std::is_same<BFunc, IFunc>::value, int(*)(Args...)>::type getHelper(int(FuseAppBase::*)(Args...))
- {
- return nullptr;
- }
- template <typename Func, Func f, typename ... Args>
- static int helper(Args ... a)
- {
- for (int t = 0; ; ++t) {
- try {
- fuseApp->beforeOperation();
- return (fuseApp->*f)(a...);
- }
- catch (const std::exception & ex) {
- if (t < 10) {
- if (int rtn = fuseApp->onError(ex)) {
- return rtn;
+ if constexpr (!std::is_same<BFunc, IFunc>::value) {
+ return [](Args ... a) {
+ for (int t = 0; ; ++t) {
+ try {
+ fuseApp->beforeOperation();
+ return (fuseApp->*bfunc)(a...);
+ }
+ catch (const std::exception & ex) {
+ if (t < 10) {
+ if (int rtn = fuseApp->onError(ex)) {
+ return rtn;
+ }
+ }
+ else {
+ fuseApp->logf(LOG_ERR, "Retries expired with %s calling %s", ex.what(), typeid(bfunc).name());
+ return -EIO;
+ }
+ }
+ catch (...) {
+ fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(bfunc).name());
+ return -EIO;
}
}
- else {
- fuseApp->logf(LOG_ERR, "Retries expired with %s calling %s", ex.what(), typeid(f).name());
- return -EIO;
- }
- }
- catch (...) {
- fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(f).name());
- return -EIO;
- }
+ };
}
+ return nullptr;
}
template <typename Func, Func f, typename ... Args>
static int internalHelper(Args ... a)