Print more diagnosis info on to-space invariant violation.
Pass the method/field (in GcRootSource) to the read barrier to print
more info when a to-space invariant violation is detected on a
method/field GC root access.
Refactor ConcurrentCopying::AssertToSpaceInvariant().
Bug: 12687968
Bug: 21564728
Change-Id: I3a5fde1f41969349b0fee6cd9217b948d5241a7c
diff --git a/runtime/read_barrier.h b/runtime/read_barrier.h
index aa72e97..55cef68 100644
--- a/runtime/read_barrier.h
+++ b/runtime/read_barrier.h
@@ -19,6 +19,7 @@
#include "base/mutex.h"
#include "base/macros.h"
+#include "gc_root.h"
#include "jni.h"
#include "mirror/object_reference.h"
#include "offsets.h"
@@ -54,14 +55,16 @@
// whereas the return value must be an updated reference.
template <typename MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
bool kMaybeDuringStartup = false>
- ALWAYS_INLINE static MirrorType* BarrierForRoot(MirrorType** root)
+ ALWAYS_INLINE static MirrorType* BarrierForRoot(MirrorType** root,
+ GcRootSource* gc_root_source = nullptr)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
// It's up to the implementation whether the given root gets updated
// whereas the return value must be an updated reference.
template <typename MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier,
bool kMaybeDuringStartup = false>
- ALWAYS_INLINE static MirrorType* BarrierForRoot(mirror::CompressedReference<MirrorType>* root)
+ ALWAYS_INLINE static MirrorType* BarrierForRoot(mirror::CompressedReference<MirrorType>* root,
+ GcRootSource* gc_root_source = nullptr)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
static bool IsDuringStartup();
@@ -75,6 +78,9 @@
static void AssertToSpaceInvariant(mirror::Object* obj, MemberOffset offset,
mirror::Object* ref)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
+ // With GcRootSource.
+ static void AssertToSpaceInvariant(GcRootSource* gc_root_source, mirror::Object* ref)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
static mirror::Object* Mark(mirror::Object* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);