summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/include/pjmedia/endpoint.h9
-rw-r--r--pjmedia/src/pjmedia/endpoint.c37
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c3
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();
}