RFR (M): 8187977: Generalize Atomic::xchg to use templates

Erik Österlund erik.osterlund at oracle.com
Sat Sep 30 21:02:20 UTC 2017


Hi Coleen,

Thanks for the review. I will file an RFE for removing the _ptr
variants of Atomic.

/Erik

On fre, 2017-09-29 at 15:17 -0400, coleen.phillimore at oracle.com wrote:
> Erik, This change looks good to me.
> 
> Do we want to deprecate xchg_ptr like cmpxchg_ptr ?   Is there an
> RFE 
> filed for that?
> 
> On 9/29/17 6:45 AM, Erik Österlund wrote:
> > 
> > Hi Kim,
> > 
> > Thanks for looking at this.
> > 
> > Incremental webrev:
> > http://cr.openjdk.java.net/~eosterlund/8187977/webrev.00_01/
> > 
> > Full webrev:
> > http://cr.openjdk.java.net/~eosterlund/8187977/webrev.01/
> > 
> > On 2017-09-28 21:02, Kim Barrett wrote:
> > > 
> > > > 
> > > > On Sep 28, 2017, at 7:56 AM, Erik Österlund 
> > > > <erik.osterlund at oracle.com> wrote:
> > > > 
> > > > Hi all,
> > > > 
> > > > The time has come to generalize more atomics.
> > > > 
> > > > I have modelled Atomic::xchg to systematically do what
> > > > Atomic::cmpxchg
> > > > did but for xchg.
> > > > 
> > > > Bug:
> > > > https://bugs.openjdk.java.net/browse/JDK-8187977
> > > > 
> > > > Webrev:
> > > > http://cr.openjdk.java.net/~eosterlund/8187977/webrev.00/
> > > > 
> > > > Testing: mach5 hs-tier3 and JPRT
> > > > 
> > > > Thanks,
> > > > /Erik
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/share/runtime/atomic.hpp
> > >   312   // A default definition is not provided, so
> > > specializations 
> > > must be
> > >   313   // provided for:
> > >   314   //   T operator()(T, T volatile*) const
> > > 
> > > That description is not correct. The default definition of
> > > PlatformXchg is at line 410. And it makes no sense to talk about
> > > specializing a function for a class that doesn't exist. This
> > > should
> > > instead be using similar wording to that in the description of
> > > PlatformCmpxchg.
> > Fixed.
> > 
> > > 
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/share/runtime/atomic.hpp
> > > 
> > > There are a lot of similarities between the handling of the
> > > exchange_value by cmpxchg and xchg, and I expect Atomic::store
> > > and
> > > OrderAccess::release_store and variants to also be similar.
> > > (Actually,
> > > xchg and store may look *very* similar.) It would be nice to
> > > think
> > > about whether there's some refactoring that could be used to
> > > reduce
> > > the amount of code involved. I don't have a specific suggestion
> > > yet
> > > though.  For now, this is just something to think about.
> > I would not like to mix xchg and load/store implementations in
> > Atomic. 
> > The reason for that is that I would rather share the
> > implementation 
> > between Atomic::load/store and OrderAccess::*load/store*, because
> > they 
> > are even more similar. I have that already in my patch queue.
> > 
> I think I would have to see understand what the duplication is before
>> want to see more lines of metaprogramming tricks.
> 
> Do you mean the translate recover/decay here?
> 
> 697 template<typename T>
>   698 struct Atomic::XchgImpl<
>   699   T, T,
>   700   typename
> EnableIf<PrimitiveConversions::Translate<T>::value>::type>
>   701   VALUE_OBJ_CLASS_SPEC
>   702 {
>   703   T operator()(T exchange_value, T volatile* dest) const {
>   704     typedef PrimitiveConversions::Translate<T> Translator;
>   705     typedef typename Translator::Decayed Decayed;
>   706     STATIC_ASSERT(sizeof(T) == sizeof(Decayed));
>   707     return Translator::recover(
>   708       xchg(Translator::decay(exchange_value),
>   709            reinterpret_cast<Decayed volatile*>(dest)));
>   710   }
> 
> 
> I can imagine this can only have more levels of logical indirection
> if 
> generalized more.
> 
> I have to admit that I hate the VALUE_OBJ_CLASS_SPEC in these
> classes.   
> There's already enough decoder ring work for each line without this 
> distracting (mostly useless) macro here.   Originally, this meant
> that 
> this class is embedded in another.  It doesn't really help the code
> in 
> any way here.   Global operator new already has an assert in the
> very 
> unlikely case that somebody did a
> 
> Atomic::XchgImpl<int, int>* x = new Atomic::XchgImpl<int, int>();  
> // 
> did I write that correctly?
> 
> > 
> > > 
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/share/compiler/compileBroker.hpp
> > >   335     Atomic::xchg(jint(shutdown_compilation), 
> > > &_should_compile_new_jobs);
> > > [Added jint conversion.]
> > > 
> > > Pre-existing:
> > > 
> > > Why is this an Atomic::xchg at all, since the old value isn't
> > > used.
> > > Seems like it could be a release_store.
> > > 
> > > There also seems to be some data typing problems around
> > > _should_compile_new_jobs.  Shouldn't that variable be a
> > > CompilerActivity?  That wouldn't have worked previously, and
> > > we're
> > > probably still not ready for it if the xchg gets changed to a
> > > release_store, but eventually... so there probably ought to be a
> > > bug
> > > for it.
> > I will file a bug for that to be reconsidered later on.
> > 
> I would leave this to the compiler group to look at.
> 
> Thanks,
> Coleen
> 
> > 
> > > 
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/os_cpu/solaris_x86/atomic_solaris_x86.hpp
> > >   146 template<>
> > >   147 template<typename T>
> > >   148 inline T Atomic::PlatformXchg<8>::operator()(T
> > > exchange_value,
> > > 
> > > Please move this definition up near the PlatformXchg<4>
> > > definition,
> > > e.g. around line 96.
> > Fixed.
> > 
> > > 
> > > 
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/os_cpu/linux_arm/atomic_linux_arm.hpp
> > > 
> > > I would prefer the two PlatformXchg specializations be adjacent. 
> > > If
> > > the 4byte specialization was after PlatformAdd<8>, reviewing
> > > would
> > > have been easier, and the different Add would be adjacent and the
> > > different Xchg would be adjacent.  The only cost is an extra
> > > #ifdef
> > > AARCH64 block around the 8byte Xchg.
> > Fixed.
> > 
> > > 
> > > =================================================================
> > > ============= 
> > > 
> > > src/hotspot/os_cpu/bsd_zero/atomic_bsd_zero.hpp
> > >   216   return xchg_using_helper<int>(arm_lock_test_and_set, 
> > > exchange_value, dest);
> > >   219   return xchg_using_helper<int>(m68k_lock_test_and_set, 
> > > exchange_value, dest);
> > > 
> > > arm/m68k_lock_test_and_set expect their arguments in the other
> > > order,
> > > and need to be updated.  There was a similar change for cmpxchg.
> > > 
> > > Same problem in atomic_linux_zero.hpp.
> > Fixed.
> > 
> > Thanks for the review.
> > 
> > /Erik


More information about the hotspot-dev mailing list