changeset 18:9c57b65d193b

Bug 1718: Reduce CPU cycles for child oop traversal. reviewed-by: ykubota
author Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp>
date Fri, 28 Mar 2014 13:28:38 +0900
parents bfde41acb148
children ac44c043b016
files agent/ChangeLog agent/src/snapShotContainer.hpp agent/src/snapShotMain.cpp
diffstat 3 files changed, 28 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Fri Mar 28 13:15:27 2014 +0900
+++ b/agent/ChangeLog	Fri Mar 28 13:28:38 2014 +0900
@@ -1,6 +1,7 @@
 2014-03-28  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bug 1716: Reduce getObjectSize() call.
+	* Bug 1718: Reduce CPU cycles for child oop traversal.
 
 2014-03-17  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
--- a/agent/src/snapShotContainer.hpp	Fri Mar 28 13:15:27 2014 +0900
+++ b/agent/src/snapShotContainer.hpp	Fri Mar 28 13:28:38 2014 +0900
@@ -332,12 +332,21 @@
             TChildClassCounter *prevCounter = NULL;
             TChildClassCounter *morePrevCounter = NULL;
             TChildClassCounter *counter = clsCounter->child;
+
+            if(counter == NULL){
+              return NULL;
+            }
+
             /* Search children class list. */
-            while (counter != NULL && counter->objData->klassOop != klassOop){
-                
+            while(counter->objData->klassOop != klassOop){
                 morePrevCounter = prevCounter;
                 prevCounter = counter;
                 counter = counter->next;
+
+                if(counter == NULL){
+                  return NULL;
+                }
+
             }
             
             /* LFU (Least Frequently Used). */
--- a/agent/src/snapShotMain.cpp	Fri Mar 28 13:15:27 2014 +0900
+++ b/agent/src/snapShotMain.cpp	Fri Mar 28 13:28:38 2014 +0900
@@ -397,23 +397,16 @@
     
     TChildClassCounter *clsCounter = NULL;
 
-    /* Lock class counter. */
-    spinLockWait(&parentCounter->spinlock);
-    {
-       /* Search child class. */
-       clsCounter = localSnapshot->findChildClass(parentCounter, klassOop);
+    /* Search child class. */
+    clsCounter = localSnapshot->findChildClass(parentCounter, klassOop);
 
-       if(unlikely(clsCounter == NULL)){
-         /* Get child class information. */
-         TObjectData *clsData = getObjectDataFromKlassOop(
-                                                localClsContainer, klassOop);
-         /* Push new child loaded class. */
-         clsCounter = localSnapshot->pushNewChildClass(parentCounter, clsData);
-       }
-
+    if(unlikely(clsCounter == NULL)){
+      /* Get child class information. */
+      TObjectData *clsData = getObjectDataFromKlassOop(
+                                             localClsContainer, klassOop);
+      /* Push new child loaded class. */
+      clsCounter = localSnapshot->pushNewChildClass(parentCounter, clsData);
     }
-    /* Unlock class counter. */
-    spinLockRelease(&parentCounter->spinlock);
  
     if(unlikely(clsCounter == NULL)){
       PRINT_CRIT_MSG("Couldn't get class counter!");
@@ -519,23 +512,16 @@
     TOopMapBlock *offsets = NULL;
     int offsetCount       = 0;
 
-    /* Lock class counter. */
-    spinLockWait(&clsCounter->spinlock);
-    {
-      offsets     = clsCounter->offsets;
-      offsetCount = clsCounter->offsetCount;
+    offsets     = clsCounter->offsets;
+    offsetCount = clsCounter->offsetCount;
 
-      /* If offset list is unused yet. */
-      if(unlikely(offsets == NULL && offsetCount < 0)){
-        /* Generate offset list. */
-        generateIterateFieldOffsets(klassOop, oopType, &offsets, &offsetCount);
-        clsCounter->offsets     = offsets;
-        clsCounter->offsetCount = offsetCount;
-      }
-
+    /* If offset list is unused yet. */
+    if(unlikely(offsets == NULL && offsetCount < 0)){
+      /* Generate offset list. */
+      generateIterateFieldOffsets(klassOop, oopType, &offsets, &offsetCount);
+      clsCounter->offsets     = offsets;
+      clsCounter->offsetCount = offsetCount;
     }
-    /* Unlock class counter. */
-    spinLockRelease(&clsCounter->spinlock);
 
     /* Iterate non-static field objects. */
     iterateFieldObject(&iterateFieldObjectCallBack, oop, oopType,