diff options
author | Joshua Colp <jcolp@digium.com> | 2016-01-11 14:34:55 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-01-11 14:34:55 -0600 |
commit | 7be4629752f1268da8a653f9177243f58123cf99 (patch) | |
tree | effca32667a377ef271f830f06a73574484d4909 | |
parent | a1c43022d2cd14e66d502853994fb763858c3ba3 (diff) | |
parent | e9c2c1dc675eaa21037ce57fd6eacce5c1831871 (diff) |
Merge "devicestate: Cleanup engine thread during graceful shutdown."
-rw-r--r-- | main/devicestate.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/main/devicestate.c b/main/devicestate.c index aba6159b4..400d655f6 100644 --- a/main/devicestate.c +++ b/main/devicestate.c @@ -214,6 +214,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 stasis_subscription *devstate_message_sub; @@ -548,7 +549,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)) @@ -626,6 +627,18 @@ static void devstate_change_cb(void *data, struct stasis_subscription *sub, stru device_state->cachable, NULL); } +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) { @@ -634,6 +647,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; } |