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
This commit is contained in:
brain 2007-11-11 01:29:50 +00:00
parent 31aeffb749
commit ba79ba9fc1

View File

@ -123,18 +123,23 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
* loaded modules in a readable simple way, e.g.: * loaded modules in a readable simple way, e.g.:
* 'FOREACH_MOD(I_OnConnect,OnConnect(user));' * 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
*/ */
#define FOREACH_MOD(y,x) \ #define FOREACH_MOD(y,x) do { \
for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \ EventHandlerIter safei; \
{ \ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
try \
{ \ { \
(*_i)->x ; \ safei = _i; \
safei++; \
try \
{ \
(*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \ } \
catch (CoreException& modexcept) \ } while (0);
{ \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
}
/** /**
* This #define allows us to call a method in all * 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.: * an instance pointer to the macro. e.g.:
* 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));' * 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));'
*/ */
#define FOREACH_MOD_I(z,y,x) \ #define FOREACH_MOD_I(z,y,x) do { \
for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \ EventHandlerIter safei; \
{ \ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
try \
{ \ { \
(*_i)->x ; \ safei = _i; \
safei++; \
try \
{ \
(*_i)->x ; \
} \
catch (CoreException& modexcept) \
{ \
z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
_i = safei; \
} \ } \
catch (CoreException& modexcept) \ } while (0);
{ \
z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
}
/** /**
* This define is similar to the one above but returns a result in MOD_RESULT. * 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) \ #define FOREACH_RESULT(y,x) \
do { \ do { \
EventHandlerIter safei; \
MOD_RESULT = 0; \ MOD_RESULT = 0; \
for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
{ \ { \
safei = _i; \
safei++; \
try \ try \
{ \ { \
int res = (*_i)->x ; \ int res = (*_i)->x ; \
@ -177,6 +190,7 @@ do { \
{ \ { \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \ ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \ } \
_i = safei; \
} \ } \
} while(0); } while(0);
@ -188,9 +202,12 @@ do { \
*/ */
#define FOREACH_RESULT_I(z,y,x) \ #define FOREACH_RESULT_I(z,y,x) \
do { \ do { \
EventHandlerIter safei; \
MOD_RESULT = 0; \ MOD_RESULT = 0; \
for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
{ \ { \
safei = _i; \
safei++; \
try \ try \
{ \ { \
int res = (*_i)->x ; \ int res = (*_i)->x ; \
@ -203,6 +220,7 @@ do { \
{ \ { \
z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \ z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
} \ } \
_i = safei; \
} \ } \
} while (0); } while (0);