diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-11-11 01:29:50 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-11-11 01:29:50 +0000 |
commit | ba79ba9fc1c95868ea1e9d4d700c014e21cc2d0f (patch) | |
tree | 797bd757cd8fd657336ae31d72cd7492b9da5c80 /include | |
parent | 31aeffb7496126e5606952579395c5a0fa526ff0 (diff) |
Make iterators safe in FOREACH_MOD etc macros, so that ModuleManager::Detach() wont screw up the iterator
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8562 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'include')
-rw-r--r-- | include/modules.h | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/include/modules.h b/include/modules.h index 1e2d1e3c5..51f1630d4 100644 --- a/include/modules.h +++ b/include/modules.h @@ -123,18 +123,23 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist; * loaded modules in a readable simple way, e.g.: * 'FOREACH_MOD(I_OnConnect,OnConnect(user));' */ -#define FOREACH_MOD(y,x) \ -for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \ -{ \ - try \ - { \ - (*_i)->x ; \ - } \ - catch (CoreException& modexcept) \ +#define FOREACH_MOD(y,x) do { \ + EventHandlerIter safei; \ + for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \ { \ - ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ + safei = _i; \ + safei++; \ + try \ + { \ + (*_i)->x ; \ + } \ + catch (CoreException& modexcept) \ + { \ + ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ + } \ + _i = safei; \ } \ -} +} while (0); /** * This #define allows us to call a method in all @@ -142,18 +147,23 @@ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i * an instance pointer to the macro. e.g.: * 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));' */ -#define FOREACH_MOD_I(z,y,x) \ -for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \ -{ \ - try \ - { \ - (*_i)->x ; \ - } \ - catch (CoreException& modexcept) \ +#define FOREACH_MOD_I(z,y,x) do { \ + EventHandlerIter safei; \ + for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \ { \ - z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ + safei = _i; \ + safei++; \ + try \ + { \ + (*_i)->x ; \ + } \ + catch (CoreException& modexcept) \ + { \ + z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ + } \ + _i = safei; \ } \ -} +} while (0); /** * This define is similar to the one above but returns a result in MOD_RESULT. @@ -162,9 +172,12 @@ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Module */ #define FOREACH_RESULT(y,x) \ do { \ + EventHandlerIter safei; \ MOD_RESULT = 0; \ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \ { \ + safei = _i; \ + safei++; \ try \ { \ int res = (*_i)->x ; \ @@ -177,6 +190,7 @@ do { \ { \ ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ } \ + _i = safei; \ } \ } while(0); @@ -188,9 +202,12 @@ do { \ */ #define FOREACH_RESULT_I(z,y,x) \ do { \ + EventHandlerIter safei; \ MOD_RESULT = 0; \ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \ { \ + safei = _i; \ + safei++; \ try \ { \ int res = (*_i)->x ; \ @@ -203,6 +220,7 @@ do { \ { \ z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \ } \ + _i = safei; \ } \ } while (0); |