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. Are we going to add a variant for long, a variant for pointers, etc.? I already proposed my version of this at http://github.com/bonzini/qemu/commit/1b439343. Paolo