diff --git a/trunk/3rdparty/st-srs/public.h b/trunk/3rdparty/st-srs/public.h index 80fd93346..c911912b8 100644 --- a/trunk/3rdparty/st-srs/public.h +++ b/trunk/3rdparty/st-srs/public.h @@ -98,6 +98,7 @@ extern st_thread_t st_thread_self(void); extern void st_thread_exit(void *retval); extern int st_thread_join(st_thread_t thread, void **retvalp); extern void st_thread_interrupt(st_thread_t thread); +extern void st_thread_yield(); extern st_thread_t st_thread_create(void *(*start)(void *arg), void *arg, int joinable, int stack_size); extern int st_randomize_stacks(int on); extern int st_set_utime_function(st_utime_t (*func)(void)); diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index aea6b555d..f46a368f5 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -66,6 +66,7 @@ unsigned long long _st_stat_sched_s = 0; unsigned long long _st_stat_thread_run = 0; unsigned long long _st_stat_thread_idle = 0; +unsigned long long _st_stat_thread_yield = 0; #endif @@ -554,6 +555,31 @@ void _st_vp_check_clock(void) } +void st_thread_yield() +{ + _st_thread_t *me = _ST_CURRENT_THREAD(); + + // If not thread in RunQ to yield to, ignore and continue to run. + if (_ST_RUNQ.next == &_ST_RUNQ) { + return; + } + + #ifdef DEBUG + ++_st_stat_thread_yield; + #endif + + /* Check sleep queue for expired threads */ + _st_vp_check_clock(); + + // Append thread to the tail of RunQ, we will back after all threads executed. + me->state = _ST_ST_RUNNABLE; + _ST_ADD_RUNQ(me); + + // Yield to other threads in the RunQ. + _ST_SWITCH_CONTEXT(me); +} + + void st_thread_interrupt(_st_thread_t *thread) { /* If thread is already dead */