mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-09 11:28:25 +00:00
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)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@404603 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -334,11 +334,12 @@ ast_log_cleanup:
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user