From cda3be17d6ae41c9fbf2e623e8f2b09789659d13 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Tue, 16 Apr 2013 09:12:59 +0000 Subject: Fixed #1658: Stop media endpoint's worker threads first when destroying media subsystem git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4474 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/endpoint.h | 9 +++++++++ pjmedia/src/pjmedia/endpoint.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 13 deletions(-) (limited to 'pjmedia') 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; ithread_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) { @@ -313,6 +301,29 @@ PJ_DEF(pj_thread_t*) pjmedia_endpt_get_thread(pjmedia_endpt *endpt, return endpt->thread[index]; } +/** + * 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; ithread_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. */ -- cgit v1.2.3