< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp
Print this page
rev 57589 : 8237632: Shenandoah fails some vmTestbase_nsk_jvmti tests with "Forwardee must point to a heap address"
*** 67,121 ****
static void assert_rp_isalive_installed(const char *file, int line);
static void assert_locked_or_shenandoah_safepoint(Mutex* lock, const char* file, int line);
#ifdef ASSERT
#define shenandoah_assert_in_heap(interior_loc, obj) \
ShenandoahAsserts::assert_in_heap(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_correct_region(interior_loc, obj) \
ShenandoahAsserts::assert_in_correct_region(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct(interior_loc, obj) \
ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded(interior_loc, obj) \
ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded(interior_loc, obj) \
ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked(interior_loc, obj) \
ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset(interior_loc, obj) \
ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_if(interior_loc, obj, condition) \
! if (condition) ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_except(interior_loc, obj, exception) \
! if (!(exception)) ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset(interior_loc, obj) \
ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_loc_if(interior_loc, condition) \
if (condition) ShenandoahAsserts::assert_not_in_cset_loc(interior_loc, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_loc_except(interior_loc, exception) \
--- 67,145 ----
static void assert_rp_isalive_installed(const char *file, int line);
static void assert_locked_or_shenandoah_safepoint(Mutex* lock, const char* file, int line);
#ifdef ASSERT
+ // Shenandoah uses oop's marked pattern to indicate forwarding. Unfortunately, ObjectMarker (jvmtiTagMap.cpp)
+ // also uses this pattern to indicate visited.
+ // In ObjectMarker's destructor, it invokes heap iteration to reset the marked bits to their original values.
+ // That trips over many assertions on heap iteration code paths, but there are invariants:
+ // 1. Marked pattern in collection set indicates forwarding
+ // 2. Marked pattern off collection set indicates visited by ObjectMarker (because oops seen by
+ // ObjectMarker were LRB'd)
+ // 3. No off collection set marked pattern at any shenandoah safepoint. In fact, no off collection set
+ // marked pattern at any safepoints other than VM_HeapWalkOperation safepoints.
+ // This is an important invariant, since traversal degenerated GC clears collection set before
+ // entering degenerated GC cycle.
+ // So, we will need temporary disable assertions for oops with marked pattern outside collection set.
+ // Note: We only enforce this check for debug assertion to preserve full capacities of verifier,
+ // because verifier always runs at safepoints.
+ static bool can_verify_oop(oop obj);
+
#define shenandoah_assert_in_heap(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_in_heap(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_correct_region(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_in_correct_region(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_correct(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_forwarded(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_forwarded(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_marked(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_in_cset(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_if(interior_loc, obj, condition) \
! if (condition && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_except(interior_loc, obj, exception) \
! if (!(exception) && ShenandoahAsserts::can_verify_oop(obj)) ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset(interior_loc, obj) \
+ if (ShenandoahAsserts::can_verify_oop(obj)) \
ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_loc_if(interior_loc, condition) \
if (condition) ShenandoahAsserts::assert_not_in_cset_loc(interior_loc, __FILE__, __LINE__);
#define shenandoah_assert_not_in_cset_loc_except(interior_loc, exception) \
< prev index next >