On 3/28/07, Darryl Miles <[EMAIL PROTECTED]> wrote:

Actually 'volatile' doesn't provide a useful fix.

[...]

>> The problem occurs after the beginning of the function. If the compare is
>> done on a cached copy in a register. Look at this example:
>>
>> if (variable!=NULL)
>> {
>>  free(variable);
>>  variable=NULL;
>> }
>>
>> This could easily be optimized to (cached_copy is a register or other
>> fast
>> place to store data):
>>
>> int cached_copy=variable;
>> if(cached_copy!=NULL)
>> {
>>  acquire_lock();
>>  cached_copy=variable;
>>  free(cached_copy);
>>  cached_copy=NULL;
>>  variable=cached_copy;
>>  release_lock();
>> }
>> else variable=cached_copy;
>>
>> If you think this cannot happen, I defy you to explain to me why. What
>> standard or guarantee is being violated? How can POSIX-compliant or
>> C-compliant code break with this optimization? How can you say it can
>> never
>> be faster?

This is the precise optimization that 'volatile' inhibits.  'volatile'
requires that the value not be cached in "cheap-to-access" locations
like registers, instead being re-loaded from "expensive-to-access"
locations like the original memory -- because it may be changed from
outside the control flow that the compiler knows about.

-Kyle H
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to