Re: Question about C language.

From: Francis Moreau
Date: Mon Mar 24 2008 - 04:24:22 EST


Hello,

On Sun, Mar 23, 2008 at 8:30 AM, Chris Snook <csnook@xxxxxxxxxx> wrote:
> > I know it's a bit out of topic but this is something I need to clarify for
> > writing a Linux driver... hope you don't mind.
> >
> > In my driver I have a global variable that controls a loop such as:
> >
> > int my_condition;
> >
> > void change_my_condition(int new)
> > {
> > my_condition = new;
> > }
> >
> > int foo(void)
> > {
> > /* irqs are disabled */
> > my_condition = 1;
> > do {
> > ....
> > local_irq_enable();
> > cpu_sleep();
> > local_irq_disable();
> >
> > } while (my_condition);
> >
> > }
> >
> > This variable is modified by an interrupt handler define in another file
> > by using 'change_my_condition' function.
> >
> > By reading the ISO C99 specification, I _think_ that I needn't any
> > kind of barrier
> > or even use the volatile type qualifier for my_condition variable to make a true
> > access to 'my_condition' in the controlling expression of the while, but I'm not
> > sure.
> >
> > Coud anybody confirm ?
> >
> > Thanks,
>
> Even volatile may be insufficient with some architecture/compiler
> combinations. You should use explicit barriers wherever you need them,
> or Bad Things will happen.
>

Really ?

Could you give me some details please ?

As I said previously, I don't think I need any barriers here because this code
doesn't have any reordering issues and futhermore only one CPU will be up
at this time.

Actually the only issue I can see is about compiler aliases. I don't know if
in that case it could use an alias for 'my_condition'. Looking at the code, it
would be a bad idea but I can't find anything about this in the C specification.
The C spec talks about sequence points but I'm really confused when reading
that part...

Thanks
--
Francis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/