> Michael N. Moran wrote: > I'm very much in favor of fine grained synchronization primitives > in the compiler, but not of changes to volatile semantics.
I wonder if it would be sufficient (if not preferable) to only extend (modify) the semantics for heap/stack and const volatile variables, as enforcing existing volatile semantics for such variables are at best of questionable existing value. i.e.: volatile vv; // volatile sync primitive, w/normal access semantics. volatile const vc; // universal sync primitive, w/normal access semantics. volatile *vp = <some-address>; // a true volatile reference. vv; // volatile sync, all pending volatile transactions logically emitted // into the code, but not hard physically synchronized via a HW sync. vc; // universal sync, all pending transactions hard physically sync'ed. *vp = <some-value>; // volatile access semantics enforced, with ordering // warranted between equivalent references, but not // otherwise (unless synchronized by referencing a // declared or (cast) volatile sync variable). (with the exception of new sync semantics, non-reference volatile variables do not need to have volatile access semantics, as it would seem to serve no useful purpose for stack/heap allocated variables, and should be allowed to be optimized always just as for any other allocated variable; although their sync, semantic actions must be preserved, thereby may still be used as synchronized value semaphores, etc, or as simply sync's when no access would otherwise be required; and/or allow regular variables to be cast as (volatile), thereby enabling a arbitrary expression to insert a sync, i.e.: (volatile)x = y, or x = (const volatile)y; forcing a specified sync prior to, or after the assignment?) Where the above is just expressed as a loose possible alternative to strictly enforcing ordering between all volatile or otherwise transactions without having to necessarily introduce another keyword, for good or bad.