From 1c72a42676e7aa0c2ae0734549050f738f3bdf02 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Mon, 24 Oct 2011 08:49:42 +0000 Subject: Fixed #1394: Concurrency problem when stopping clock thread git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3840 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/clock_thread.c | 39 +++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'pjmedia') diff --git a/pjmedia/src/pjmedia/clock_thread.c b/pjmedia/src/pjmedia/clock_thread.c index 5875450f..e01dfecc 100644 --- a/pjmedia/src/pjmedia/clock_thread.c +++ b/pjmedia/src/pjmedia/clock_thread.c @@ -109,6 +109,7 @@ pjmedia_clock_src_get_time_msec( const pjmedia_clock_src *clocksrc ) struct pjmedia_clock { + pj_pool_t *pool; pj_timestamp freq; pj_timestamp interval; pj_timestamp next_tick; @@ -164,7 +165,10 @@ PJ_DEF(pj_status_t) pjmedia_clock_create2(pj_pool_t *pool, PJ_ASSERT_RETURN(pool && param->usec_interval && param->clock_rate && p_clock, PJ_EINVAL); + pool = pj_pool_create(pool->factory, "clock%p", 512, 512, NULL); + clock = PJ_POOL_ALLOC_T(pool, pjmedia_clock); + clock->pool = pool; status = pj_get_timestamp_freq(&clock->freq); if (status != PJ_SUCCESS) @@ -190,16 +194,6 @@ PJ_DEF(pj_status_t) pjmedia_clock_create2(pj_pool_t *pool, if (status != PJ_SUCCESS) return status; - if ((clock->options & PJMEDIA_CLOCK_NO_ASYNC) == 0) { - status = pj_thread_create(pool, "clock", &clock_thread, clock, - 0, 0, &clock->thread); - if (status != PJ_SUCCESS) { - pj_lock_destroy(clock->lock); - return status; - } - } - - *p_clock = clock; return PJ_SUCCESS; @@ -223,12 +217,20 @@ PJ_DEF(pj_status_t) pjmedia_clock_start(pjmedia_clock *clock) if (status != PJ_SUCCESS) return status; - pj_lock_acquire(clock->lock); clock->next_tick.u64 = now.u64 + clock->interval.u64; clock->running = PJ_TRUE; - pj_lock_release(clock->lock); + clock->quitting = PJ_FALSE; - return status; + if ((clock->options & PJMEDIA_CLOCK_NO_ASYNC) == 0) { + status = pj_thread_create(clock->pool, "clock", &clock_thread, clock, + 0, 0, &clock->thread); + if (status != PJ_SUCCESS) { + pj_lock_destroy(clock->lock); + return status; + } + } + + return PJ_SUCCESS; } @@ -240,6 +242,12 @@ PJ_DEF(pj_status_t) pjmedia_clock_stop(pjmedia_clock *clock) PJ_ASSERT_RETURN(clock != NULL, PJ_EINVAL); clock->running = PJ_FALSE; + clock->quitting = PJ_TRUE; + + if (clock->thread) { + pj_thread_join(clock->thread); + clock->thread = NULL; + } return PJ_SUCCESS; } @@ -400,6 +408,11 @@ PJ_DEF(pj_status_t) pjmedia_clock_destroy(pjmedia_clock *clock) clock->lock = NULL; } + if (clock->pool) { + pj_pool_t *pool = clock->pool; + clock->pool = NULL; + pj_pool_release(pool); + } return PJ_SUCCESS; } -- cgit v1.2.3