changeset 30:57fd757ef0e2

Bug 1644: Can't hook FullGC when G1 Evacuation Failure occurs. reviewed-by: ykubota
author Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp>
date Wed, 15 Jan 2014 10:10:31 +0900
parents bbf8065fcd37
children 2fd23c59d3ef
files agent/ChangeLog agent/src/oopUtil.cpp agent/src/oopUtil.hpp agent/src/overrideFunc.S
diffstat 4 files changed, 38 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Thu Jan 09 13:16:46 2014 +0900
+++ b/agent/ChangeLog	Wed Jan 15 10:10:31 2014 +0900
@@ -1,3 +1,7 @@
+2014-01-15  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
+
+	* Bug 1644: Can't hook FullGC when G1 Evacuation Failure occurs.
+
 2014-01-09  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bug 1633: Cannot attach HeapStats agent to OpenJDK7 in Fedora20
--- a/agent/src/oopUtil.cpp	Thu Jan 09 13:16:46 2014 +0900
+++ b/agent/src/oopUtil.cpp	Wed Jan 15 10:10:31 2014 +0900
@@ -138,7 +138,7 @@
 /*!
  * \brief Override function for cleanup event on G1GC.
  */
-DEFINE_OVERRIDE_FUNC_2(g1Event)
+DEFINE_OVERRIDE_FUNC_3(g1Event)
 
 /*!
  * \brief Override function for adjust klassOop.
@@ -782,9 +782,12 @@
   HOOK_FUNC("_ZTV9CMCleanUp",
     "_ZN9CMCleanUp7do_voidEv",
     &g1Event_override_func_0, NULL),
-  HOOK_FUNC("_ZTV16VM_G1CollectFull",
-    "_ZN16VM_G1CollectFull4doitEv",
-    &g1Event_override_func_1, (void*)&callbackForG1FullReturn),
+  HOOK_FUNC("_ZTV15G1CollectedHeap",
+    "_ZN15G1CollectedHeap11gc_prologueEb",
+    &g1Event_override_func_1, NULL),
+  HOOK_FUNC("_ZTV15G1CollectedHeap",
+    "_ZN15G1CollectedHeap11gc_epilogueEb",
+    &g1Event_override_func_2, NULL),
   HOOK_FUNC_END
 };
 
@@ -1452,8 +1455,17 @@
 
 /*!
  * \brief Callback function for before System.gc() on using G1GC.
+ * \param isFull [in] Is this event FullGC?
  */
-extern "C" void callbackForG1Full(void) {
+extern "C" void callbackForG1Full(bool isFull) {
+
+  /* This function must be processed when FullGC occurs.
+   * e.g. System.gc(), evacuation failure, etc...
+   */
+  if(!isFull){
+    return;
+  }
+
   THookFunctionInfo *funcs;
   SELECT_HOOK_FUNCS(funcs, g1)
 
@@ -1470,8 +1482,17 @@
 
 /*!
  * \brief Callback function for after System.gc() on using G1GC.
+ * \param isFull [in] Is this event FullGC?
  */
-extern "C" void callbackForG1FullReturn(void) {
+extern "C" void callbackForG1FullReturn(bool isFull) {
+
+  /* This function must be processed when FullGC occurs.
+   * e.g. System.gc(), evacuation failure, etc...
+   */
+  if(!isFull){
+    return;
+  }
+
   THookFunctionInfo *funcs;
   SELECT_HOOK_FUNCS(funcs, g1)
   
--- a/agent/src/oopUtil.hpp	Thu Jan 09 13:16:46 2014 +0900
+++ b/agent/src/oopUtil.hpp	Wed Jan 15 10:10:31 2014 +0900
@@ -405,13 +405,15 @@
 
 /*!
  * \brief Callback function for before System.gc() on using G1GC.
+ * \param isFull [in] Is this event FullGC?
  */
-extern "C" void callbackForG1Full(void);
+extern "C" void callbackForG1Full(bool isFull);
 
 /*!
  * \brief Callback function for after System.gc() on using G1GC.
+ * \param isFull [in] Is this event FullGC?
  */
-extern "C" void callbackForG1FullReturn(void);
+extern "C" void callbackForG1FullReturn(bool isFull);
 
 /*!
  * \brief Callback function for WatcherThread.
--- a/agent/src/overrideFunc.S	Thu Jan 09 13:16:46 2014 +0900
+++ b/agent/src/overrideFunc.S	Wed Jan 15 10:10:31 2014 +0900
@@ -663,8 +663,10 @@
 
 /* CMCleanUp::do_void() */
 OVERRIDE_CALLBACK_DEFINE(g1Event, 0, callbackForG1Cleanup);
-/* VM_G1CollectFull::doit() */
+/* G1CollectedHeap::gc_prologue() */
 OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full);
+/* G1CollectedHeap::gc_epilogue() */
+OVERRIDE_CALLBACK_DEFINE(g1Event, 2, callbackForG1FullReturn);
 
 /* for Klass relocation. */