diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-06-04 21:33:41 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-06-04 21:33:41 +0100 | 
| commit | 96b0d69b9faf5b8b984ab991f7d03fa883ba6a4c (patch) | |
| tree | ec1a394265cb72a8e0b6c074f350c4d6aa8c25cc | |
| parent | EIO makes more sense than ENOSYS when remote operations can't be performed (diff) | |
| download | netfs-96b0d69b9faf5b8b984ab991f7d03fa883ba6a4c.tar.bz2 netfs-96b0d69b9faf5b8b984ab991f7d03fa883ba6a4c.tar.xz netfs-96b0d69b9faf5b8b984ab991f7d03fa883ba6a4c.zip  | |
Replace forever the recursive error recovery code with a limited loop
| -rw-r--r-- | netfs/fuse/fuseAppBase.h | 29 | 
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;  					}  				}  		};  | 
