diff options
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/src/pjmedia/clock_thread.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/pjmedia/src/pjmedia/clock_thread.c b/pjmedia/src/pjmedia/clock_thread.c index e01dfecc..39a77fa2 100644 --- a/pjmedia/src/pjmedia/clock_thread.c +++ b/pjmedia/src/pjmedia/clock_thread.c @@ -221,7 +221,7 @@ PJ_DEF(pj_status_t) pjmedia_clock_start(pjmedia_clock *clock) clock->running = PJ_TRUE; clock->quitting = PJ_FALSE; - if ((clock->options & PJMEDIA_CLOCK_NO_ASYNC) == 0) { + if ((clock->options & PJMEDIA_CLOCK_NO_ASYNC) == 0 && !clock->thread) { status = pj_thread_create(clock->pool, "clock", &clock_thread, clock, 0, 0, &clock->thread); if (status != PJ_SUCCESS) { @@ -245,8 +245,11 @@ PJ_DEF(pj_status_t) pjmedia_clock_stop(pjmedia_clock *clock) clock->quitting = PJ_TRUE; if (clock->thread) { - pj_thread_join(clock->thread); - clock->thread = NULL; + if (pj_thread_join(clock->thread) == PJ_SUCCESS) { + clock->thread = NULL; + } else { + clock->quitting = PJ_FALSE; + } } return PJ_SUCCESS; @@ -374,6 +377,10 @@ static int clock_thread(void *arg) if (clock->cb) (*clock->cb)(&clock->timestamp, clock->user_data); + /* Best effort way to detect if we've been destroyed in the callback */ + if (clock->quitting) + break; + /* Increment timestamp */ clock->timestamp.u64 += clock->timestamp_inc; |