summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--netfs/fuse/fuseAppBase.h29
1 files changed, 18 insertions, 11 deletions
diff --git a/netfs/fuse/fuseAppBase.h b/netfs/fuse/fuseAppBase.h
index b044f99..63763d9 100644
--- a/netfs/fuse/fuseAppBase.h
+++ b/netfs/fuse/fuseAppBase.h
@@ -149,18 +149,25 @@ class DLL_PUBLIC FuseAppBase {
template <int (FuseAppBase::*f)(Args...)>
static int helper(Args ... a)
{
- try {
- return (fuseApp->*f)(a...);
- }
- catch (const std::exception & ex) {
- if (int rtn = fuseApp->onError(ex)) {
- return rtn;
+ for (int t = 0; ; ++t) {
+ try {
+ return (fuseApp->*f)(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(f).name());
+ return -EIO;
+ }
+ }
+ catch (...) {
+ fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(f).name());
+ return -EIO;
}
- return helper<f>(a...);
- }
- catch (...) {
- fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(f).name());
- return -EIO;
}
}
};