diff options
-rw-r--r-- | pjmedia/include/pjmedia/endpoint.h | 9 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/endpoint.c | 37 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 3 |
3 files changed, 36 insertions, 13 deletions
diff --git a/pjmedia/include/pjmedia/endpoint.h b/pjmedia/include/pjmedia/endpoint.h index 0e5debb8..f300571b 100644 --- a/pjmedia/include/pjmedia/endpoint.h +++ b/pjmedia/include/pjmedia/endpoint.h @@ -150,6 +150,15 @@ PJ_DECL(unsigned) pjmedia_endpt_get_thread_count(pjmedia_endpt *endpt); PJ_DECL(pj_thread_t*) pjmedia_endpt_get_thread(pjmedia_endpt *endpt, unsigned index); +/** + * Stop and destroy the worker threads of the media endpoint + * + * @param endpt The media endpoint instance. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) pjmedia_endpt_stop_threads(pjmedia_endpt *endpt); + /** * Request the media endpoint to create pool. diff --git a/pjmedia/src/pjmedia/endpoint.c b/pjmedia/src/pjmedia/endpoint.c index 9ac90177..10f1b534 100644 --- a/pjmedia/src/pjmedia/endpoint.c +++ b/pjmedia/src/pjmedia/endpoint.c @@ -209,20 +209,8 @@ PJ_DEF(pjmedia_codec_mgr*) pjmedia_endpt_get_codec_mgr(pjmedia_endpt *endpt) PJ_DEF(pj_status_t) pjmedia_endpt_destroy (pjmedia_endpt *endpt) { exit_cb *ecb; - unsigned i; - PJ_ASSERT_RETURN(endpt, PJ_EINVAL); - - endpt->quit_flag = 1; - - /* Destroy threads */ - for (i=0; i<endpt->thread_cnt; ++i) { - if (endpt->thread[i]) { - pj_thread_join(endpt->thread[i]); - pj_thread_destroy(endpt->thread[i]); - endpt->thread[i] = NULL; - } - } + pjmedia_endpt_stop_threads(endpt); /* Destroy internal ioqueue */ if (endpt->ioqueue && endpt->own_ioqueue) { @@ -314,6 +302,29 @@ PJ_DEF(pj_thread_t*) pjmedia_endpt_get_thread(pjmedia_endpt *endpt, } /** + * Stop and destroy the worker threads of the media endpoint + */ +PJ_DEF(pj_status_t) pjmedia_endpt_stop_threads(pjmedia_endpt *endpt) +{ + unsigned i; + + PJ_ASSERT_RETURN(endpt, PJ_EINVAL); + + endpt->quit_flag = 1; + + /* Destroy threads */ + for (i=0; i<endpt->thread_cnt; ++i) { + if (endpt->thread[i]) { + pj_thread_join(endpt->thread[i]); + pj_thread_destroy(endpt->thread[i]); + endpt->thread[i] = NULL; + } + } + + return PJ_SUCCESS; +} + +/** * Worker thread proc. */ static int PJ_THREAD_FUNC worker_proc(void *arg) diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 76306102..dd0054bb 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -188,6 +188,9 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags) pj_log_push_indent(); if (pjsua_var.med_endpt) { + /* Wait for media endpoint's worker threads to quit. */ + pjmedia_endpt_stop_threads(pjsua_var.med_endpt); + pjsua_aud_subsys_destroy(); } |