< prev index next >
src/hotspot/share/oops/access.inline.hpp
Print this page
rev 49275 : [mq]: JDK-8199781.patch
*** 212,221 ****
--- 212,228 ----
static oop access_barrier(oop obj) {
return GCBarrierType::resolve(obj);
}
};
+ template <class GCBarrierType, DecoratorSet decorators>
+ struct PostRuntimeDispatch<GCBarrierType, BARRIER_EQUALS, decorators>: public AllStatic {
+ static bool access_barrier(oop o1, oop o2) {
+ return GCBarrierType::equals(o1, o2);
+ }
+ };
+
// Resolving accessors with barriers from the barrier set happens in two steps.
// 1. Expand paths with runtime-decorators, e.g. is UseCompressedOops on or off.
// 2. Expand paths for each BarrierSet available in the system.
template <DecoratorSet decorators, typename FunctionPointerT, BarrierType barrier_type>
struct BarrierResolver: public AllStatic {
*** 465,474 ****
--- 472,497 ----
static inline oop resolve(oop obj) {
return _resolve_func(obj);
}
};
+ template <DecoratorSet decorators, typename T>
+ struct RuntimeDispatch<decorators, T, BARRIER_EQUALS>: AllStatic {
+ typedef typename AccessFunction<decorators, T, BARRIER_EQUALS>::type func_t;
+ static func_t _equals_func;
+
+ static bool equals_init(oop o1, oop o2) {
+ func_t function = BarrierResolver<decorators, func_t, BARRIER_EQUALS>::resolve_barrier();
+ _equals_func = function;
+ return function(o1, o2);
+ }
+
+ static inline bool equals(oop o1, oop o2) {
+ return _equals_func(o1, o2);
+ }
+ };
+
// Initialize the function pointers to point to the resolving function.
template <DecoratorSet decorators, typename T>
typename AccessFunction<decorators, T, BARRIER_STORE>::type
RuntimeDispatch<decorators, T, BARRIER_STORE>::_store_func = &store_init;
*** 510,519 ****
--- 533,546 ----
template <DecoratorSet decorators, typename T>
typename AccessFunction<decorators, T, BARRIER_RESOLVE>::type
RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::_resolve_func = &resolve_init;
+ template <DecoratorSet decorators, typename T>
+ typename AccessFunction<decorators, T, BARRIER_EQUALS>::type
+ RuntimeDispatch<decorators, T, BARRIER_EQUALS>::_equals_func = &equals_init;
+
// Step 3: Pre-runtime dispatching.
// The PreRuntimeDispatch class is responsible for filtering the barrier strength
// decorators. That is, for AS_RAW, it hardwires the accesses without a runtime
// dispatch point. Otherwise it goes through a runtime check if hardwiring was
// not possible.
*** 822,831 ****
--- 849,873 ----
inline static typename EnableIf<
!HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, oop>::type
resolve(oop obj) {
return RuntimeDispatch<decorators, oop, BARRIER_RESOLVE>::resolve(obj);
}
+
+ template <DecoratorSet decorators>
+ inline static typename EnableIf<
+ HasDecorator<decorators, AS_RAW>::value, bool>::type
+ equals(oop o1, oop o2) {
+ typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw;
+ return Raw::equals(o1, o2);
+ }
+
+ template <DecoratorSet decorators>
+ inline static typename EnableIf<
+ !HasDecorator<decorators, AS_RAW>::value, bool>::type
+ equals(oop o1, oop o2) {
+ return RuntimeDispatch<decorators, oop, BARRIER_EQUALS>::equals(o1, o2);
+ }
};
// This class adds implied decorators that follow according to decorator rules.
// For example adding default reference strength and default memory ordering
// semantics.
*** 1131,1140 ****
--- 1173,1188 ----
template <DecoratorSet decorators>
inline oop resolve(oop obj) {
const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value;
return PreRuntimeDispatch::resolve<expanded_decorators>(obj);
}
+
+ template <DecoratorSet decorators>
+ inline bool equals(oop o1, oop o2) {
+ const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value;
+ return PreRuntimeDispatch::equals<expanded_decorators>(o1, o2);
+ }
}
template <DecoratorSet decorators>
template <DecoratorSet expected_decorators>
void Access<decorators>::verify_decorators() {
< prev index next >