This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: AW: AW: AW: Blocking restricted in DSRs


"Neundorf, Alexander" <Alexander.Neundorf@jenoptik.com> writes:

> > -----UrsprÃngliche Nachricht-----
> > Von: ecos-discuss-owner@ecos.sourceware.org
> > [mailto:ecos-discuss-owner@ecos.sourceware.org]Im Auftrag von 
> > Neundorf,
> > Alexander
> > Gesendet: Dienstag, 27. Juli 2004 12:44
> > An: Nick Garnett; ecos-discuss@sources.redhat.com
> > Betreff: AW: AW: AW: [ECOS] Blocking restricted in DSRs
> > 
> > 
> > 
> > ...
> > > > Ok, and what to do with the variables which are modified and which
> > > > should be protected by the mutex ?  E.g. if I have a 
> > queue which is
> > > > filled by the DSR, and which is checked by the thread which waits
> > > > for the signal. Actually I have to ensure that the "take 
> > element out
> > > > of queue" by the thread is protected against the "put element into
> > > > queue" by the DSR.  Do I have to use cyg_scheduler_lock() in the
> > > > thread to achieve this ?
> > > 
> > > Yes. Take a look at the generic serial driver for an 
> > example of how to
> > > do this.
> > 
> > Ok, I had a look. The generic serial driver doesn't use 
> > cyg_sched_lock() (at least I didn't find it). 
> 
> Well, it's not in devs/serial/generic, but in io/serial/current.
> So I guess I finally found it:

Sorry, yes, I was a little unspecific there.

> 
> while (1)                //thread main loop
> {
>   cyg_drv_dsr_lock();    //does the order of the dsr_lock() and mutex_lock() calls matter ?
>   cyg_mutex_lock(mutex);
>   while (queue.isEmpty())
>     cyg_cond_timed_wait(condition);
>   Item *i=queue.pop();       
>   cyg_mutex_unlock(mutex);    
>   cyg_drv_dsr_unlock();
>   //do something with i
>   ...
> }

Yep, that's the sort of thing you need to do. In general the regions
during which cyg_drv_dsr_lock() is used should be kept as small as
possible. In the above example it makes little difference, but if
there is work that can be done with just the mutex locked, then that
should be done before calling cyg_drv_dsr_lock(). 


-- 
Nick Garnett                    eCos Kernel Architect
http://www.ecoscentric.com/     The eCos and RedBoot experts


--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]