This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Question about cyg_flag_timed_wait()
- From: Grant Edwards <grant dot b dot edwards at gmail dot com>
- To: ecos-discuss at sources dot redhat dot com
- Date: Sun, 3 Jan 2010 15:38:13 +0000 (UTC)
- Subject: [ECOS] Re: Question about cyg_flag_timed_wait()
- References: <hcn35s$550$1@ger.gmane.org> <hgtert$l5g$1@ger.gmane.org> <pnd41sz2ln.fsf@delenn.bartv.net>
On 2010-01-02, Bart Veer <bartv@ecoscentric.com> 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