[asterisk-commits] kharwell: branch 11 r404604 - in /branches/11: ./ cel/cel_pgsql.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Dec 31 15:26:02 CST 2013


Author: kharwell
Date: Tue Dec 31 15:26:00 2013
New Revision: 404604

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=404604
Log:
cel_pgsql: deadlock on unload and core_event_dispatcher

A deadlock can happen between a thread unloading or reloading the cel_pgsql
module and the core_event_dispatcher taskprocessor thread. Description of
what is happening:

Thread 1 (for example, a netconsole thread):

    a "module reload cel_pgsql" is launched
    the thread enter the "my_unload_module" function (cel_pgsql.c)
    the thread acquire the write lock on psql_columns
    the thread enter the "ast_event_unsubscribe" function (event.c)
    the thread try to acquire the write lock on ast_event_subs[sub->type]

Thread 2 (core_event_dispatcher taskprocessor thread):

    the taskprocessor pop a CEL event
    the thread enter the "handle_event" function (event.c)
    the thread acquire the read lock on ast_event_subs[sub->type]
    the thread callback the "pgsql_log" function (cel_pgsql.c), since it's a subscriber of CEL events
    the thread try to acquire a read lock on psql_columns

(closes issue ASTERISK-22854)
Reported by: Etienne Lessard
Patches:
     cel_pgsql_fix_deadlock_event.patch uploaded by hexanol (license 6394)
........

Merged revisions 404603 from http://svn.asterisk.org/svn/asterisk/branches/1.8

Modified:
    branches/11/   (props changed)
    branches/11/cel/cel_pgsql.c

Propchange: branches/11/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: branches/11/cel/cel_pgsql.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/cel/cel_pgsql.c?view=diff&rev=404604&r1=404603&r2=404604
==============================================================================
--- branches/11/cel/cel_pgsql.c (original)
+++ branches/11/cel/cel_pgsql.c Tue Dec 31 15:26:00 2013
@@ -345,11 +345,12 @@
 static int my_unload_module(void)
 {
 	struct columns *current;
-	AST_RWLIST_WRLOCK(&psql_columns);
+
 	if (event_sub) {
 		event_sub = ast_event_unsubscribe(event_sub);
-		event_sub = NULL;
-	}
+	}
+
+	AST_RWLIST_WRLOCK(&psql_columns);
 	if (conn) {
 		PQfinish(conn);
 		conn = NULL;




More information about the asterisk-commits mailing list