summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/clock_thread.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-06-12 10:13:31 +0000
committerBenny Prijono <bennylp@teluu.com>2006-06-12 10:13:31 +0000
commit070c6a1f21fb75982716948e1390dd449088ef60 (patch)
tree55933c79b70f2bf56d7f547cb9facb7d66f0033d /pjmedia/src/pjmedia/clock_thread.c
parent66f91465de3c70018b6c31f14da273cdce518eb8 (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.c28
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;
}
-
-
-