hotspot/src/share/vm/memory/specialized_oop_closures.hpp
changeset 1374 4c24294029a9
parent 1 489c9b5090e2
child 5547 f4b087cbb361
equal deleted inserted replaced
615:570062d730b2 1374:4c24294029a9
    57 // category.)
    57 // category.)
    58 
    58 
    59 // This is split into several because of a Visual C++ 6.0 compiler bug
    59 // This is split into several because of a Visual C++ 6.0 compiler bug
    60 // where very long macros cause the compiler to crash
    60 // where very long macros cause the compiler to crash
    61 
    61 
       
    62 // Some other heap might define further specialized closures.
       
    63 #ifndef FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES
       
    64 #define FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) \
       
    65         /* None */
       
    66 #endif
       
    67 
    62 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)       \
    68 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)       \
    63   f(ScanClosure,_nv)                                    \
    69   f(ScanClosure,_nv)                                    \
    64   f(FastScanClosure,_nv)                                \
    70   f(FastScanClosure,_nv)                                \
    65   f(FilteringClosure,_nv)
    71   f(FilteringClosure,_nv)
    66 
    72 
    75 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)       \
    81 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)       \
    76   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)             \
    82   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)             \
    77   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
    83   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
    78 
    84 
    79 #ifndef SERIALGC
    85 #ifndef SERIALGC
    80 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)       \
    86 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)       \
    81   f(MarkRefsIntoAndScanClosure,_nv)                     \
    87   f(MarkRefsIntoAndScanClosure,_nv)                     \
    82   f(Par_MarkRefsIntoAndScanClosure,_nv)                 \
    88   f(Par_MarkRefsIntoAndScanClosure,_nv)                 \
    83   f(PushAndMarkClosure,_nv)                             \
    89   f(PushAndMarkClosure,_nv)                             \
    84   f(Par_PushAndMarkClosure,_nv)                         \
    90   f(Par_PushAndMarkClosure,_nv)                         \
    85   f(PushOrMarkClosure,_nv)                              \
    91   f(PushOrMarkClosure,_nv)                              \
    86   f(Par_PushOrMarkClosure,_nv)                          \
    92   f(Par_PushOrMarkClosure,_nv)                          \
    87   f(CMSKeepAliveClosure,_nv)                            \
    93   f(CMSKeepAliveClosure,_nv)                            \
    88   f(CMSInnerParMarkAndPushClosure,_nv)
    94   f(CMSInnerParMarkAndPushClosure,_nv)                  \
       
    95   FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f)
    89 #else  // SERIALGC
    96 #else  // SERIALGC
    90 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)
    97 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)
    91 #endif // SERIALGC
    98 #endif // SERIALGC
       
    99 
    92 
   100 
    93 // We separate these out, because sometime the general one has
   101 // We separate these out, because sometime the general one has
    94 // a different definition from the specialized ones, and sometimes it
   102 // a different definition from the specialized ones, and sometimes it
    95 // doesn't.
   103 // doesn't.
    96 
   104 
    97 #define ALL_OOP_OOP_ITERATE_CLOSURES_1(f)               \
   105 #define ALL_OOP_OOP_ITERATE_CLOSURES_1(f)               \
    98   f(OopClosure,_v)                                      \
   106   f(OopClosure,_v)                                      \
    99   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)
   107   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)
   100 
   108 
   101 #define ALL_OOP_OOP_ITERATE_CLOSURES_3(f)               \
   109 #define ALL_OOP_OOP_ITERATE_CLOSURES_2(f)               \
   102   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f)
   110   SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)
   103 
   111 
   104 #ifndef SERIALGC
   112 #ifndef SERIALGC
   105 // This macro applies an argument macro to all OopClosures for which we
   113 // This macro applies an argument macro to all OopClosures for which we
   106 // want specialized bodies of a family of methods related to
   114 // want specialized bodies of a family of methods related to
   107 // "par_oop_iterate".  The arguments to f are the same as above.
   115 // "par_oop_iterate".  The arguments to f are the same as above.
   123 // want specialized bodies of a family of methods related to
   131 // want specialized bodies of a family of methods related to
   124 // "oops_since_save_marks_do".  The arguments to f are the same as above.
   132 // "oops_since_save_marks_do".  The arguments to f are the same as above.
   125 // The "root_class" is the most general class to define; this may be
   133 // The "root_class" is the most general class to define; this may be
   126 // "OopClosure" in some applications and "OopsInGenClosure" in others.
   134 // "OopClosure" in some applications and "OopsInGenClosure" in others.
   127 
   135 
       
   136 
       
   137 // Some other heap might define further specialized closures.
       
   138 #ifndef FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES
       
   139 #define FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f) \
       
   140         /* None */
       
   141 #endif
       
   142 
   128 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f) \
   143 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f) \
   129   f(ScanClosure,_nv)                                     \
   144   f(ScanClosure,_nv)                                     \
   130   f(FastScanClosure,_nv)
   145   f(FastScanClosure,_nv)
   131 
   146 
   132 #ifndef SERIALGC
   147 #ifndef SERIALGC
   133 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) \
   148 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) \
   134   f(ParScanWithBarrierClosure,_nv)                       \
   149   f(ParScanWithBarrierClosure,_nv)                       \
   135   f(ParScanWithoutBarrierClosure,_nv)
   150   f(ParScanWithoutBarrierClosure,_nv)                    \
       
   151   FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f)
   136 #else  // SERIALGC
   152 #else  // SERIALGC
   137 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
   153 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
   138 #endif // SERIALGC
   154 #endif // SERIALGC
   139 
   155 
   140 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)  \
   156 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)  \
   177     NUM_Kinds
   193     NUM_Kinds
   178   };
   194   };
   179 
   195 
   180 #if ENABLE_SPECIALIZATION_STATS
   196 #if ENABLE_SPECIALIZATION_STATS
   181 private:
   197 private:
   182   static int _numCallsAll;
   198   static bool _init;
   183 
   199   static bool _wrapped;
   184   static int _numCallsTotal[NUM_Kinds];
   200   static jint _numCallsAll;
   185   static int _numCalls_nv[NUM_Kinds];
   201 
   186 
   202   static jint _numCallsTotal[NUM_Kinds];
   187   static int _numDoOopCallsTotal[NUM_Kinds];
   203   static jint _numCalls_nv[NUM_Kinds];
   188   static int _numDoOopCalls_nv[NUM_Kinds];
   204 
       
   205   static jint _numDoOopCallsTotal[NUM_Kinds];
       
   206   static jint _numDoOopCalls_nv[NUM_Kinds];
   189 public:
   207 public:
   190 #endif
   208 #endif
   191   static void clear()  PRODUCT_RETURN;
   209   static void clear()  PRODUCT_RETURN;
   192 
   210 
   193   static inline void record_call()  PRODUCT_RETURN;
   211   static inline void record_call()  PRODUCT_RETURN;
   201 
   219 
   202 #ifndef PRODUCT
   220 #ifndef PRODUCT
   203 #if ENABLE_SPECIALIZATION_STATS
   221 #if ENABLE_SPECIALIZATION_STATS
   204 
   222 
   205 inline void SpecializationStats::record_call() {
   223 inline void SpecializationStats::record_call() {
   206   _numCallsAll++;;
   224   Atomic::inc(&_numCallsAll);
   207 }
   225 }
   208 inline void SpecializationStats::record_iterate_call_v(Kind k) {
   226 inline void SpecializationStats::record_iterate_call_v(Kind k) {
   209   _numCallsTotal[k]++;
   227   Atomic::inc(&_numCallsTotal[k]);
   210 }
   228 }
   211 inline void SpecializationStats::record_iterate_call_nv(Kind k) {
   229 inline void SpecializationStats::record_iterate_call_nv(Kind k) {
   212   _numCallsTotal[k]++;
   230   Atomic::inc(&_numCallsTotal[k]);
   213   _numCalls_nv[k]++;
   231   Atomic::inc(&_numCalls_nv[k]);
   214 }
   232 }
   215 
   233 
   216 inline void SpecializationStats::record_do_oop_call_v(Kind k) {
   234 inline void SpecializationStats::record_do_oop_call_v(Kind k) {
   217   _numDoOopCallsTotal[k]++;
   235   Atomic::inc(&_numDoOopCallsTotal[k]);
   218 }
   236 }
   219 inline void SpecializationStats::record_do_oop_call_nv(Kind k) {
   237 inline void SpecializationStats::record_do_oop_call_nv(Kind k) {
   220   _numDoOopCallsTotal[k]++;
   238   Atomic::inc(&_numDoOopCallsTotal[k]);
   221   _numDoOopCalls_nv[k]++;
   239   Atomic::inc(&_numDoOopCalls_nv[k]);
   222 }
   240 }
   223 
   241 
   224 #else   // !ENABLE_SPECIALIZATION_STATS
   242 #else   // !ENABLE_SPECIALIZATION_STATS
   225 
   243 
   226 inline void SpecializationStats::record_call() {}
   244 inline void SpecializationStats::record_call() {}