diff options
author | Sebastien Hertz <shertz@google.com> | 2014-04-28 15:03:08 +0200 |
---|---|---|
committer | Sebastien Hertz <shertz@google.com> | 2014-04-29 09:04:18 +0200 |
commit | 714f175bd66d03225927a84f3d5dbc923c5a3e7e (patch) | |
tree | 093c8564827484af598bd116c7560b1893910e3d /runtime/thread.h | |
parent | d55e9b1a9f45c19cd7b376a8839ce37f86c66a64 (diff) | |
download | art-714f175bd66d03225927a84f3d5dbc923c5a3e7e.zip art-714f175bd66d03225927a84f3d5dbc923c5a3e7e.tar.gz art-714f175bd66d03225927a84f3d5dbc923c5a3e7e.tar.bz2 |
Visit deoptimized shadow frames as roots
During deoptimization, we create shadow frames but do not attach them to the
stack until we transition to interpreter mode. If a GC happens before that,
these shadow frames are not visited by GC so they may contain stale references.
This CL addresses this issue by visiting the shadow frames "under contruction"
in Thread::VisitRoots so we correctly update all references they hold.
To make them visible, we now save the top shadow frame (the first one created)
in the field Thread::tls_ptr_sized_values::deoptimization_shadow_frame. This
field will then be cleared when transitioning to interpreter mode.
Bug: 14324885
Change-Id: Ib213ddc80f19cfcdfcec6f20acaa7f1a0e9ce2c1
Diffstat (limited to 'runtime/thread.h')
-rw-r--r-- | runtime/thread.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/runtime/thread.h b/runtime/thread.h index e5e4cae..f869285 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -696,6 +696,10 @@ class Thread { ShadowFrame* GetAndClearDeoptimizationShadowFrame(JValue* ret_val); + bool HasDeoptimizationShadowFrame() const { + return tlsPtr_.deoptimization_shadow_frame != nullptr; + } + std::deque<instrumentation::InstrumentationStackFrame>* GetInstrumentationStack() { return tlsPtr_.instrumentation_stack; } |