changeset 12:87dc27ccb8b0

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:35 +0900
parents c7690676c2a6
children 87dbb2865c68
files agent/ChangeLog agent/src/oopUtil.cpp agent/src/oopUtil.hpp agent/src/overrideFunc.S
diffstat 4 files changed, 49 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Thu Jan 09 13:16:51 2014 +0900
+++ b/agent/ChangeLog	Wed Jan 15 10:10:35 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:51 2014 +0900
+++ b/agent/src/oopUtil.cpp	Wed Jan 15 10:10:35 2014 +0900
@@ -146,7 +146,7 @@
 /*!
  * \brief Override function for cleanup and System.gc() event on G1GC.
  */
-DEFINE_OVERRIDE_FUNC_2(g1Event);
+DEFINE_OVERRIDE_FUNC_3(g1Event);
 
 /*!
  * \brief Override function for adjust klassOop.
@@ -839,9 +839,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
 };
 
@@ -1987,8 +1990,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;
+  }
+
   /*
    * Disable G1 callback function:
    *  OopClosure for typeArrayKlass is called by G1 FullCollection.
@@ -2002,20 +2014,27 @@
 
 /*!
  * \brief Callback function for after System.gc() on using G1GC.
+ * \param isFull [in] Is this event FullGC?
  */
-extern "C" void callbackForG1FullReturn(void) {
-    
-    /* Restore G1 callback. */
-    switchOverrideFunction(g1_hook, true);
-    
-    if (likely(g1FinishCallbackFunc != NULL)) {
-        
-        /* Invoke callback. */
-        g1FinishCallbackFunc();
-    }
-    
-    /* Clear bitmap. */
-    checkObjectMap->clear();
+extern "C" void callbackForG1FullReturn(bool isFull){
+
+  /* This function must be processed when FullGC occurs.
+   * e.g. System.gc(), evacuation failure, etc...
+   */
+  if(!isFull){
+    return;
+  }
+
+  /* Restore G1 callback. */
+  switchOverrideFunction(g1_hook, true);
+
+  if(likely(g1FinishCallbackFunc != NULL)){
+    /* Invoke callback. */
+    g1FinishCallbackFunc();
+  }
+
+  /* Clear bitmap. */
+  checkObjectMap->clear();
 }
 
 /*!
--- a/agent/src/oopUtil.hpp	Thu Jan 09 13:16:51 2014 +0900
+++ b/agent/src/oopUtil.hpp	Wed Jan 15 10:10:35 2014 +0900
@@ -414,13 +414,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:51 2014 +0900
+++ b/agent/src/overrideFunc.S	Wed Jan 15 10:10:35 2014 +0900
@@ -565,8 +565,10 @@
 
 /* CMCleanUp::do_void() */
 OVERRIDE_CALLBACK_DEFINE(g1Event, 0, callbackForG1Cleanup, 1);
-/* VM_G1CollectFull::doit() */
-OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full, 1);
+/* G1CollectedHeap::gc_prologue() */
+OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full, 2);
+/* G1CollectedHeap::gc_epilogue() */
+OVERRIDE_CALLBACK_DEFINE(g1Event, 2, callbackForG1FullReturn, 2);
 
 /* for Klass relocation. */