diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-06-12 10:13:31 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-06-12 10:13:31 +0000 |
commit | 070c6a1f21fb75982716948e1390dd449088ef60 (patch) | |
tree | 55933c79b70f2bf56d7f547cb9facb7d66f0033d /pjmedia/src/pjmedia/clock_thread.c | |
parent | 66f91465de3c70018b6c31f14da273cdce518eb8 (diff) |
Added mutex protection and option not to delete upstream/downstream port in master_port.c
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@498 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia/clock_thread.c')
-rw-r--r-- | pjmedia/src/pjmedia/clock_thread.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/pjmedia/src/pjmedia/clock_thread.c b/pjmedia/src/pjmedia/clock_thread.c index dad7447a..391f7d1f 100644 --- a/pjmedia/src/pjmedia/clock_thread.c +++ b/pjmedia/src/pjmedia/clock_thread.c @@ -19,6 +19,7 @@ #include <pjmedia/clock.h> #include <pjmedia/errno.h> #include <pj/assert.h> +#include <pj/lock.h> #include <pj/os.h> #include <pj/pool.h> @@ -41,6 +42,7 @@ struct pjmedia_clock pj_thread_t *thread; pj_bool_t running; pj_bool_t quitting; + pj_lock_t *lock; }; @@ -82,10 +84,17 @@ PJ_DEF(pj_status_t) pjmedia_clock_create( pj_pool_t *pool, clock->running = PJ_FALSE; clock->quitting = PJ_FALSE; + /* I don't think we need a mutex, so we'll use null. */ + status = pj_lock_create_null_mutex(pool, "clock", &clock->lock); + if (status != PJ_SUCCESS) + return status; + status = pj_thread_create(pool, "clock", &clock_thread, clock, 0, 0, &clock->thread); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + pj_lock_destroy(clock->lock); return status; + } *p_clock = clock; @@ -104,12 +113,17 @@ PJ_DEF(pj_status_t) pjmedia_clock_start(pjmedia_clock *clock) PJ_ASSERT_RETURN(clock != NULL, PJ_EINVAL); + if (clock->running) + return PJ_SUCCESS; + status = pj_get_timestamp(&now); 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); return status; } @@ -205,6 +219,8 @@ static int clock_thread(void *arg) if (!clock->running) continue; + pj_lock_acquire(clock->lock); + /* Call callback, if any */ if (clock->cb) (*clock->cb)(&clock->timestamp, clock->user_data); @@ -215,7 +231,7 @@ static int clock_thread(void *arg) /* Calculate next tick */ clock->next_tick.u64 += clock->interval.u64; - + pj_lock_release(clock->lock); } return 0; @@ -238,10 +254,12 @@ PJ_DEF(pj_status_t) pjmedia_clock_destroy(pjmedia_clock *clock) clock->thread = NULL; } + if (clock->lock) { + pj_lock_destroy(clock->lock); + clock->lock = NULL; + } + return PJ_SUCCESS; } - - - |