From: "Richard B. Johnson" <root@chaos.analogic.com>
To: Dinesh Gandhewar <dinesh_gandhewar@rediffmail.com>
Cc: mlist-linux-kernel@nntp-server.caltech.edu
Subject: Re: volatile variable
Date: Fri, 1 Aug 2003 07:38:29 -0400 (EDT) [thread overview]
Message-ID: <Pine.LNX.4.53.0308010723060.3077@chaos> (raw)
In-Reply-To: <20030801105706.30523.qmail@webmail28.rediffmail.com>
On Fri, 1 Aug 2003, Dinesh Gandhewar wrote:
> Hello,
>
> If a system call is having following code.
>
> add current process into wait quque ;
> while (1)
> { set task state INTERRUPTIBLE ;
> if (a > 0)
> break ;
> schedule() ;
> }
> set task state RUNNING ;
> remove current from wait queue ;
>
>
> If an interrupt service is having following code
>
> set a = 512 ;
>
> 'a' is a global variable shared in ISR and system call
>
> Do I need to define a as 'volatile int a ;' ? Why?
>
> Thanks & Regards,
> Dinesh
>
First, there are already procedures available to do just
what you seem to want to do, interruptible_sleep_on() and
interruptible_sleep_on_timeout(). These take care of the
ugly details that can trip up compilers.
In any event in your loop, variable 'a', has already been
read by the code the compiler generates. There is nothing
else in the loop that touches that variable. Therefore
the compiler is free to (correctly) assume that whatever
it was when it was first read is what it will continue to
be. The compiler will therefore optimise it to be a single
read and compare. So, the loop will continue forever if
'a' started as zero because the compiler correctly knows
that it cannot possibly change in the only execution
path that it knows about.
To tell the compiler that there are other possible execution
paths in which the variable could be modified, you need to
declare the variable as "volatile". The variable's storage
hasn't changed. The size of the variable hasn't changed.
All you have done is told the compiler to read that variable
every time because it could have changed.
Cheers,
Dick Johnson
Penguin : Linux version 2.4.20 on an i686 machine (797.90 BogoMips).
Note 96.31% of all statistics are fiction.
next prev parent reply other threads:[~2003-08-01 11:43 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-08-01 10:57 volatile variable Dinesh Gandhewar
2003-08-01 11:38 ` Richard B. Johnson [this message]
2003-08-11 13:33 ` David Woodhouse
2003-08-11 14:06 ` Richard B. Johnson
2003-08-11 14:37 ` Jakub Jelinek
2003-08-11 14:38 ` David Woodhouse
2003-08-11 14:40 ` David Howells
2003-08-11 14:49 ` Mike Galbraith
2003-08-11 17:07 ` Robert Love
2003-08-02 14:52 Harm Verhagen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.53.0308010723060.3077@chaos \
--to=root@chaos.analogic.com \
--cc=dinesh_gandhewar@rediffmail.com \
--cc=mlist-linux-kernel@nntp-server.caltech.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).