From: Olle Johansson Date: Thu, 7 Jun 2007 09:00:44 +0000 (+0000) Subject: Issue #9738 - Make sure we can unload res_jabber. Patch by phsultan - thanks! X-Git-Tag: 1.4.5~50 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ff2943dd59224622365775a983cb8bb30275ea0e;p=thirdparty%2Fasterisk.git Issue #9738 - Make sure we can unload res_jabber. Patch by phsultan - thanks! Due to a bug in the iksemel library, this will not work if you are using GTLS in the connection. That's being investigated. If you figure out a way to handle that without us having to patch iksemel, let us know in the bug report. Thanks. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@67993 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/include/asterisk/jabber.h b/include/asterisk/jabber.h index 8d7662f978..181fc1a14a 100644 --- a/include/asterisk/jabber.h +++ b/include/asterisk/jabber.h @@ -24,7 +24,8 @@ #include "asterisk/linkedlists.h" enum aji_state { - AJI_DISCONNECTED = 0, + AJI_DISCONNECTING, + AJI_DISCONNECTED, AJI_CONNECTING, AJI_CONNECTED }; diff --git a/res/res_jabber.c b/res/res_jabber.c index 481001e6b6..b491f5c445 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -466,7 +466,9 @@ static void aji_log_hook(void *data, const char *xmpp, size_t size, int is_incom /*! * \brief The action hook parses the inbound packets, constantly running. - * \param aji client structure, type of packet, the actual packet. + * \param data aji client structure + * \param type type of packet + * \param node the actual packet. * \return IKS_OK or IKS_HOOK . */ static int aji_act_hook(void *data, int type, iks *node) @@ -481,6 +483,11 @@ static int aji_act_hook(void *data, int type, iks *node) return IKS_HOOK; } + if (client->state == AJI_DISCONNECTING) { + ASTOBJ_UNREF(client, aji_client_destroy); + return IKS_HOOK; + } + pak = iks_packet(node); if (!client->component) { /*client */ @@ -1505,6 +1512,12 @@ static void *aji_recv_loop(void *data) } res = iks_recv(client->p, 1); + + if (client->state == AJI_DISCONNECTING) { + if (option_debug > 1) + ast_log(LOG_DEBUG, "Ending our Jabber client's thread due to a disconnect\n"); + pthread_exit(NULL); + } client->timeout--; if (res == IKS_HOOK) ast_log(LOG_WARNING, "JABBER: Got hook event.\n"); @@ -2400,9 +2413,9 @@ static int unload_module(void) ast_manager_unregister("JabberSend"); ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, { ASTOBJ_RDLOCK(iterator); - if (option_verbose > 2) - ast_verbose(VERBOSE_PREFIX_3 "JABBER: %s\n", iterator->name); - iterator->state = AJI_DISCONNECTED; + if (option_debug > 2) + ast_log(LOG_DEBUG, "JABBER: Releasing and disconneing client: %s\n", iterator->name); + iterator->state = AJI_DISCONNECTING; ast_aji_disconnect(iterator); pthread_join(iterator->thread, NULL); ASTOBJ_UNLOCK(iterator); @@ -2410,8 +2423,6 @@ static int unload_module(void) ASTOBJ_CONTAINER_DESTROYALL(&clients, aji_client_destroy); ASTOBJ_CONTAINER_DESTROY(&clients); - - ast_log(LOG_NOTICE, "res_jabber unloaded.\n"); return 0; } @@ -2426,7 +2437,6 @@ static int load_module(void) ast_register_application(app_ajistatus, aji_status_exec, ajistatus_synopsis, ajistatus_descrip); ast_cli_register_multiple(aji_cli, sizeof(aji_cli) / sizeof(struct ast_cli_entry)); - ast_log(LOG_NOTICE, "res_jabber.so loaded.\n"); return 0; }