From 60b77d44852936f16017f4bcffbb2bf79dbc8a4e Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Mon, 24 Feb 2003 03:04:23 +0000 Subject: [PATCH] - Added EventMarkDel which marks an event for deletion for the (next) DoEvents() call. - Fixed /rehash stall caused by delayed unloading of the scan module (deadlock). --- Changes | 2 ++ include/modules.h | 3 +++ src/events.c | 12 +++++++++++- src/modules/scan.c | 5 ++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index ff1490391..9c841c9ab 100644 --- a/Changes +++ b/Changes @@ -1941,3 +1941,5 @@ seen. gmtime warning still there - Added set::options::dont-resolve (=hostnames of incomming clients won't be resolved). - Code cleanup (gcc 3.2 warnings with -Wall). - Removed/updated some NS stuff +- Added EventMarkDel which marks an event for deletion for the (next) DoEvents() call. +- Fixed /rehash stall caused by delayed unloading of the scan module (deadlock). diff --git a/include/modules.h b/include/modules.h index 4cc85ad48..f0a002298 100644 --- a/include/modules.h +++ b/include/modules.h @@ -195,10 +195,13 @@ struct _eventinfo { }; +/* Huh? Why are those not marked as extern?? -- Syzop */ + #define EventAdd(name, every, howmany, event, data) EventAddEx(NULL, name, every, howmany, event, data) Event *EventAddEx(Module *, char *name, long every, long howmany, vFP event, void *data); Event *EventDel(Event *event); +Event *EventMarkDel(Event *event); Event *EventFind(char *name); int EventMod(Event *event, EventInfo *mods); void DoEvents(void); diff --git a/src/events.c b/src/events.c index 2adbdb3ba..97f854306 100644 --- a/src/events.c +++ b/src/events.c @@ -94,6 +94,12 @@ Event *EventAddEx(Module *module, char *name, long every, long howmany, } +Event *EventMarkDel(Event *event) +{ + event->howmany = -1; + return event; +} + Event *EventDel(Event *event) { Event *p, *q; @@ -154,6 +160,9 @@ inline void DoEvents(void) Event temp; for (eventptr = events; eventptr; eventptr = eventptr->next) + { + if (eventptr->howmany == -1) + goto freeit; if ((eventptr->every == 0) || ((TStime() - eventptr->last) >= eventptr->every)) { eventptr->last = TStime(); @@ -163,13 +172,14 @@ inline void DoEvents(void) eventptr->howmany--; if (eventptr->howmany == 0) { +freeit: temp.next = EventDel(eventptr); eventptr = &temp; continue; } } - } + } } void EventStatus(aClient *sptr) diff --git a/src/modules/scan.c b/src/modules/scan.c index 74b3da988..a35863b72 100644 --- a/src/modules/scan.c +++ b/src/modules/scan.c @@ -176,9 +176,8 @@ int m_scan_Unload(void) HookDel(ConfRun); HookDel(ConfPostTest); HookDel(ServerStats); - LockEventSystem(); - EventDel(Scannings_clean); - UnlockEventSystem(); + /* Mark for deletion */ + EventMarkDel(Scannings_clean); IRCMutexDestroy(Scannings_lock); if (scan_message) free(scan_message);