summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-11-11 01:29:50 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-11-11 01:29:50 +0000
commitba79ba9fc1c95868ea1e9d4d700c014e21cc2d0f (patch)
tree797bd757cd8fd657336ae31d72cd7492b9da5c80 /include
parent31aeffb7496126e5606952579395c5a0fa526ff0 (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.h58
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);