On 09/13/2012 11:19 AM, Paolo Bonzini wrote: > Il 13/09/2012 10:14, Avi Kivity ha scritto: >>>>> >>> +static inline void atomic_set(Atomic *v, int i) >>>>> >>> +{ >>>>> >>> + v->counter = i; >>>>> >>> +} >>>>> >>> + >>>>> >>> +static inline int atomic_read(Atomic *v) >>>>> >>> +{ >>>>> >>> + return v->counter; >>>>> >>> +} >>>>> >>> >>>> >> >>>> >> So these two operations don't get mangled by the optimizer. >>>> >> >>> > Browsing linux code and reading lkml, find some similar material. But >>> > they have moved volatile from ->counter to function - atomic_read(). >>> > As to atomic_read(), I think it need to prevent optimizer from >>> > refetching issue, but as to atomic_set(), do we need ? >> I think so, to prevent reordering. > > Agreed. Alternatively, stick a barrier() before and after the > assignment and read. > > But I don't really see the point in wrapping atomically-accessed > variables in a struct.
Preventing accidental naked access (to be reported in patch review as "wardrobe malfunction"). > Are we going to add a variant for long, a > variant for pointers, etc.? template <typename T> ...; > I already proposed my version of this at > http://github.com/bonzini/qemu/commit/1b439343. Atomic operations are sufficiently rare and sufficiently important to warrant extra effort, so I prefer the explicitly typed variants. -- error compiling committee.c: too many arguments to function