Date: Wed, 12 Jan 2000 04:51:21 +0200 From: Giorgos Keramidas <charon@hades.hell.gr> To: Laurence Berland <stuyman@confusion.net> Cc: freebsd-questions@FreeBSD.ORG Subject: Volatile variables (was: Giving a sighandler more information) Message-ID: <20000112045121.A74078@hades.hell.gr> In-Reply-To: <387BC2C7.44B12247@confusion.net> References: <200001111215.NAA22385@dorifer.heim3.tu-clausthal.de> <387BC2C7.44B12247@confusion.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jan 11, 2000 at 06:54:47PM -0500, Laurence Berland wrote: > > > Oliver Fromme wrote: > > > > Laurence Berland <stuyman@confusion.net> wrote in list.freebsd-questions: > > > Oliver Fromme wrote: > > >> > > >> I'm afraid there is no other way than using global variables. > > >> Be sure to declare them as ``volatile sig_atomic_t''. > > >> > > > What does this do as compared to declaring them normally? > > > > It makes them work, as opposed to not work. :-) > > > > Seriously. You _must_ declare global variables which are > > accessed from a signal handler as ``volatile sig_atomic_t''. > > Everything else is _not_ guaranteed to work (and if it works, > > then it's just pure luck). > > > > Regards > > Oliver > > > > Does this have something to do with the signal being caught while > we're in the signal routine? Am I on the right track? Almost. AFAIK, when you use `volatile' each time the variable is referenced, the compiler will generate a memory reference, not relying on the value being saved in a register, etc. The same if true for when the variable is `written', i.e. the memory copy is kept up to date. For the simple program: volatile int k; int main (void) { k = 0; k = 1; return 0; } the command `cc -S' will generate the following (slightly edited) assembler code. The comments are there to help you understand which lines of the assembler code correspond to C code. .text .p2align 2 .globl main .type main,@function main: pushl %ebp /* { */ movl %esp,%ebp movl $0,k /* k = 0; */ movl k,%eax /* k = 1; */ incl %eax movl %eax,k xorl %eax,%eax /* return 0; */ leave /* } */ ret .Lfe1: .size main,.Lfe1-main .comm k,4,4 /* volatile int k; */ You can see that although %eax is used as an intermediate register for increasing the C variable called `k', the value of %eax is saved to the memory location of `k' before the end of the k = 1; statement. This is exactly what volatile means. The memory value is always updated to reflect changes to the value of every volatile identifier. -- Giorgos Keramidas, < keramida @ ceid . upatras . gr > "What we have to learn to do, we learn by doing." [Aristotle] To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000112045121.A74078>