From: Corey Farrell Date: Sun, 10 Jan 2016 23:08:16 +0000 (-0500) Subject: devicestate: Cleanup engine thread during graceful shutdown. X-Git-Tag: 11.22.0-rc1~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b41d4ce58e22b686feadde9e2c1bcf53c885f46a;p=thirdparty%2Fasterisk.git devicestate: Cleanup engine thread during graceful shutdown. ASTERISK-25681 #close Change-Id: I64337c70f0ebd8c77f70792042684607c950c8f1 --- diff --git a/main/devicestate.c b/main/devicestate.c index 48d2d5cd08..6ae1963b4b 100644 --- a/main/devicestate.c +++ b/main/devicestate.c @@ -187,6 +187,7 @@ static pthread_t change_thread = AST_PTHREADT_NULL; /*! \brief Flag for the queue */ static ast_cond_t change_pending; +static volatile int shuttingdown; struct devstate_change { AST_LIST_ENTRY(devstate_change) entry; @@ -551,7 +552,7 @@ static void *do_devstate_changes(void *data) { struct state_change *next, *current; - for (;;) { + while (!shuttingdown) { /* This basically pops off any state change entries, resets the list back to NULL, unlocks, and processes each state change */ AST_LIST_LOCK(&state_changes); if (AST_LIST_EMPTY(&state_changes)) @@ -752,6 +753,18 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *da ast_mutex_unlock(&devstate_collector.lock); } +static void device_state_engine_cleanup(void) +{ + shuttingdown = 1; + AST_LIST_LOCK(&state_changes); + ast_cond_signal(&change_pending); + AST_LIST_UNLOCK(&state_changes); + + if (change_thread != AST_PTHREADT_NULL) { + pthread_join(change_thread, NULL); + } +} + /*! \brief Initialize the device state engine in separate thread */ int ast_device_state_engine_init(void) { @@ -760,6 +773,7 @@ int ast_device_state_engine_init(void) ast_log(LOG_ERROR, "Unable to start device state change thread.\n"); return -1; } + ast_register_cleanup(device_state_engine_cleanup); return 0; }