diff options
author | Kevin Harwell <kharwell@digium.com> | 2013-12-31 21:39:45 +0000 |
---|---|---|
committer | Kevin Harwell <kharwell@digium.com> | 2013-12-31 21:39:45 +0000 |
commit | bb30b224195c77fcae0c91037c8e9d551fc034f6 (patch) | |
tree | 21c2525cfed6e2e9a30be3ea0a378c6364520a35 /cel | |
parent | 135b9d3562da69e255e6ce3c84cd7a8ff5c8d0b2 (diff) |
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
........
Merged revisions 404604 from http://svn.asterisk.org/svn/asterisk/branches/11
........
Merged revisions 404605 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@404606 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'cel')
-rw-r--r-- | cel/cel_pgsql.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/cel/cel_pgsql.c b/cel/cel_pgsql.c index 5ba5b9972..8db85d721 100644 --- a/cel/cel_pgsql.c +++ b/cel/cel_pgsql.c @@ -346,8 +346,9 @@ ast_log_cleanup: static int my_unload_module(void) { struct columns *current; - AST_RWLIST_WRLOCK(&psql_columns); + ast_cel_backend_unregister(PGSQL_BACKEND_NAME); + AST_RWLIST_WRLOCK(&psql_columns); if (conn) { PQfinish(conn); conn = NULL; |