From 3fb556d7a52ab2e4cf9b16ea0f6c498c412810a1 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 1 Jun 2012 00:37:10 +0200 Subject: [PATCH] fix the rest of the unregister functions --- citadel/serv_extensions.c | 138 ++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 49 deletions(-) diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index c46e4a4b3..a742c6191 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -493,20 +493,29 @@ void CtdlRegisterCleanupHook(void (*fcn_ptr) (void)) void CtdlUnregisterCleanupHook(void (*fcn_ptr) (void)) { - CleanupFunctionHook *cur, *p; - - for (cur = CleanupHookTable; cur != NULL; cur = cur->next) { - /* This will also remove duplicates if any */ - while (cur != NULL && - fcn_ptr == cur->h_function_pointer) { + CleanupFunctionHook *cur, *p, *last; + last = NULL; + cur = CleanupHookTable; + while (cur != NULL) + { + if (fcn_ptr == cur->h_function_pointer) + { MODM_syslog(LOG_DEBUG, "Unregistered cleanup function\n"); p = cur->next; - if (cur == CleanupHookTable) { - CleanupHookTable = p; - } + free(cur); + cur = NULL; + + if (last != NULL) + last->next = p; + else + CleanupHookTable = p; cur = p; } + else { + last = cur; + cur = cur->next; + } } } @@ -543,20 +552,29 @@ void CtdlRegisterEVCleanupHook(void (*fcn_ptr) (void)) void CtdlUnregisterEVCleanupHook(void (*fcn_ptr) (void)) { - CleanupFunctionHook *cur, *p; - - for (cur = EVCleanupHookTable; cur != NULL; cur = cur->next) { - /* This will also remove duplicates if any */ - while (cur != NULL && - fcn_ptr == cur->h_function_pointer) { + CleanupFunctionHook *cur, *p, *last; + last = NULL; + cur = EVCleanupHookTable; + while (cur != NULL) + { + if (fcn_ptr == cur->h_function_pointer) + { MODM_syslog(LOG_DEBUG, "Unregistered cleanup function\n"); p = cur->next; - if (cur == EVCleanupHookTable) { - EVCleanupHookTable = p; - } + free(cur); + cur = NULL; + + if (last != NULL) + last->next = p; + else + EVCleanupHookTable = p; cur = p; } + else { + last = cur; + cur = cur->next; + } } } @@ -596,22 +614,30 @@ void CtdlRegisterSessionHook(void (*fcn_ptr) (void), int EventType) void CtdlUnregisterSessionHook(void (*fcn_ptr) (void), int EventType) { - SessionFunctionHook *cur, *p; - - for (cur = SessionHookTable; cur != NULL; cur = cur->next) { - /* This will also remove duplicates if any */ - while (cur != NULL && - fcn_ptr == cur->h_function_pointer && - EventType == cur->eventtype) { + SessionFunctionHook *cur, *p, *last; + last = NULL; + cur = SessionHookTable; + while (cur != NULL) { + if ((fcn_ptr == cur->h_function_pointer) && + (EventType == cur->eventtype)) + { MOD_syslog(LOG_DEBUG, "Unregistered session function (type %d)\n", EventType); p = cur->next; - if (cur == SessionHookTable) { - SessionHookTable = p; - } + free(cur); + cur = NULL; + + if (last != NULL) + last->next = p; + else + SessionHookTable = p; cur = p; } + else { + last = cur; + cur = cur->next; + } } } @@ -650,22 +676,30 @@ void CtdlRegisterUserHook(void (*fcn_ptr) (ctdluser *), int EventType) void CtdlUnregisterUserHook(void (*fcn_ptr) (struct ctdluser *), int EventType) { - UserFunctionHook *cur, *p; - - for (cur = UserHookTable; cur != NULL; cur = cur->next) { - /* This will also remove duplicates if any */ - while (cur != NULL && - fcn_ptr == cur->h_function_pointer && - EventType == cur->eventtype) { + UserFunctionHook *cur, *p, *last; + last = NULL; + cur = UserHookTable; + while (cur != NULL) { + if ((fcn_ptr == cur->h_function_pointer) && + (EventType == cur->eventtype)) + { MOD_syslog(LOG_DEBUG, "Unregistered user function (type %d)\n", EventType); p = cur->next; - if (cur == UserHookTable) { - UserHookTable = p; - } + free(cur); + cur = NULL; + + if (last != NULL) + last->next = p; + else + UserHookTable = p; cur = p; } + else { + last = cur; + cur = cur->next; + } } } @@ -706,22 +740,29 @@ void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *), void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *), int EventType) { - MessageFunctionHook *cur, *p; - - for (cur = MessageHookTable; cur != NULL; cur = cur->next) { - /* This will also remove duplicates if any */ - while (cur != NULL && - handler == cur->h_function_pointer && - EventType == cur->eventtype) { + MessageFunctionHook *cur, *p, *last; + last = NULL; + cur = MessageHookTable; + while (cur != NULL) { + if ((handler == cur->h_function_pointer) && + (EventType == cur->eventtype)) + { MOD_syslog(LOG_DEBUG, "Unregistered message function (type %d)\n", EventType); p = cur->next; - if (cur == MessageHookTable) { - MessageHookTable = p; - } free(cur); + cur = NULL; + + if (last != NULL) + last->next = p; + else + MessageHookTable = p; cur = p; } + else { + last = cur; + cur = cur->next; + } } } @@ -779,7 +820,6 @@ void CtdlUnregisterRoomHook(int (*fcn_ptr)(struct ctdlroom *)) last = cur; cur = cur->next; } - } } -- 2.30.2