Fixed #1658: Stop media endpoint's worker threads first when destroying media subsystem

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@4474 74dad513-b988-da41-8d7b-12977e46ad98
remotes/origin/jni
Sauw Ming 12 years ago
parent 7f0f30b1e4
commit 3f922fc08e

@ -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.

@ -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) {
@ -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; 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.
*/

@ -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();
}

Loading…
Cancel
Save