On 2010-01-02, Bart Veer <[email protected]> wrote: > Grant> This "problem" seems to have come up again. I've looked at > Grant> the event flag code, and I can't see how there could be a > Grant> delay when waking a thread using cyg_thread_setbits() and > Grant> not when waking a thread using cyg_thread_release(). > > Grant> Both cases just end up calling the target thread's wake() > Grant> method. The only difference is that cyg_thread_release() > Grant> calls wake() unconditionally, and cyg_thread_setbits() only > Grant> calls it if the target thread is in the flag's waitqueue. > > Grant> I'm not wrong am I? > > I have taken a look at this, and tried to reproduce it with a > simple testcase. I am afraid I cannot reproduce the problem: > the cyg_flag_timed_wait() always succeeds as soon as the flag > is set. I have also taken a look at the kernel code and can > see no reason for the reported behaviour.
I agree: I can't see any case where there would be any sort of delay in the task being scheduled (assuming it would have priority). > The most obvious explanation is that it is a problem with > thread priorities. The cyg_flag_timed_wait() call may succeed > as soon as the flag is set, but the thread won't actually be > resumed immediately if there are higher-priority runnable > threads, or if there is another thread with the same priority > which still has part of its timeslice to run. For the latter > scenario you would see something similar to what you describe: > some number of system clock ticks after the flag is set the > current thread's timeslice would expire, the other thread > would be resumed, and only then would the > cyg_flag_timed_wait() appear to return. > > I would need a testcase before investigating any further. Thanks for looking at it -- I'm convinced that if there is a delay in the task being scheduled it's an application code issue with priorities. -- Grant -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
