Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Jan 2000 20:55:48 +0100 (CET)
From:      Oliver Fromme <olli@dorifer.heim3.tu-clausthal.de>
To:        freebsd-questions@FreeBSD.ORG
Subject:   Re: Volatile variables
Message-ID:  <200001171955.UAA88876@dorifer.heim3.tu-clausthal.de>
In-Reply-To: <85v96r$2jjd$1@atlantis.rz.tu-clausthal.de>

next in thread | previous in thread | raw e-mail | index | archive | help
Mikhail Evstiounin <evstiounin@adelphia.net> wrote in list.freebsd-questions:
 >>No.  Except if your processor is broken.  :-)
 > 
 > Oliver, what about timer registers or serial interface registers?
 > what about mapped video memory or shared memory in multi
 > CPU system?

It has nothing to do with the issue.
You claimed that the processor could be interrupted in the
middle of an assembler instruction, which is incorrect.
At least for all processor types that I know about.

 >>There is no concurrency.  Even if you have two processors,
 >>the signal handler will not run in parallel to the "main"
 >>part of the program.
 > 
 > I agree completely, I was trying to stress a difference  between sighandler
 > and threads and unix processes.

Oh, then I misunderstood you, sorry.  Of course, a sighandler
is something completely cifferent.  :-)

 >>But setting singal masks does not prevent those register
 >>optimizations.  You _must_ use "volatile" for this.
 > 
 > In a way, how you proposed - yes, but it's not enough.

It depends on the program, and what it uses the variables for.
That's a different issue, not subject to this discussion.

This discussion is about using the "volatile" qualifier, which
is necessary for global variables that are accessed from within
signal handlers.  You did not agree with this (do you still not
agree?), and I'm trying to convince you that it _is_ indeed
necessary.  :-)

 >> > Vilotile tells to compiler (and to programmer)
 >> > that j can have a very strange result.
 >>
 >>That's completely wrong.
 > 
 > So, if programmer wites j = i * i; (s)he doesn't expect to get a square? I
 > understand, that according to standard vilotile means it, but it's not
 > intuitive. That's why I told that vilotile tells to compiler and to
 > programmer - expect something strange.

No, that's still wrong.

Without volatile, you can get exactly the same "strange"
result.

You asked me to quote from the standard.  This is not easy,
because volatile is mentioned in a lot of places, and I don't
have it in *.txt form, so I have to type everything manually
from it.  Here are a few sections which I think are pretty
important:

<quote>
   [...]  an implementation might perform various optimizations
   within each translation unit, such that the actual semantics
   would agree with the abstract semantics only when making
   function calls across translation unit boundaries.  [...]
   In this type of implementation, objects referred to by
   interrupt service routines activated by the signal function
   would require explicit specification of "volatile" storage
   [...]
</quote>

<quote>
   A "volatile" declaration may be used to describe an object
   corresponding to a memory-mapped input/output port or an
   object accessed by an asynchronously interrupting function.
   Actions on objects so declared shall not be "optimized out"
   by an implementation or reordered except as permitted by the
   rules for evaluating expressions.
</quote>

<quote>
   If the signal occurs [...], the behavior is undefined if the
   signal handler refers to any object with static storage
   duration other than by assigning a value to an object
   declared as "volatile sig_atomic_t" [...]
</quote>

It sounds like you cannot even read a global variable inside a
signal handler, even if it's volatile.  I didn't know this
before (and I think it's strange), but that's what the standard
says.

Regards
   Oliver

-- 
Oliver Fromme, Leibnizstr. 18/61, 38678 Clausthal, Germany
(Info: finger userinfo:olli@dorifer.heim3.tu-clausthal.de)

"In jedem Stück Kohle wartet ein Diamant auf seine Geburt"
                                         (Terry Pratchett)


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?200001171955.UAA88876>