question on semantics
chris jefferson
caj@cs.york.ac.uk
Wed May 4 18:32:00 GMT 2005
Chris Friesen wrote:
> I'm not sure who I should address this to...I hope this is correct.
>
> If I share memory between two processes, and protect access to the
> memory using standard locking (fcntl(), for instance), do I need to
> specify that the memory is volatile? Or is the fact that I'm using
> fcntl() enough to force the compiler to not optimise away memory
> accesses?
>
> As an example, consider the following code, with <lock>/<unlock>
> replaced with the appropriate fcntl() code:
>
>
> int *b;
>
> int test()
> {
> b=<address of shared memory>;
>
> while(1) {
> <lock>
> if (*b) {
> break;
> }
> <unlock>
> }
> <unlock>
>
> return *b;
> }
>
> Without the locks, the compiler is free to only load *b once (and in
> fact gcc does so). Is the addition of the locks sufficient to force
> *b to be re-read each time, or do I need to declare it as
>
> volatile int *b;
>
Offically you have to declare volatile int *b. Although I can't be sure
however, looking at this sample of code gcc will re-read the values
anyway, as if fcntl are included in a seperate binary, gcc will probably
not be able to tell that the value *b couldn't be changed by the call
the fcntl, so will dump it to memory before the function call and read
it back afterwards. While it's a little dodgy, in the past I've often
made sure gcc re-reads memory locations by passing a pointer to them to
a function compiled in a seperate unit. If gcc ever gets some kind of
super-funky cross-unit binary optimisation, then this might get
optimised away, but I wouldn't expect such a thing soon :)
Chris
> Thanks,
>
> Chris
More information about the Gcc
mailing list