RFR (M): 8187977: Generalize Atomic::xchg to use templates
Kim Barrett
kim.barrett at oracle.com
Thu Sep 28 19:02:34 UTC 2017
> 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.
==============================================================================
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.
==============================================================================
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.
==============================================================================
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.
==============================================================================
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.
==============================================================================
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.
==============================================================================
More information about the hotspot-dev
mailing list