1.1 --- a/src/share/vm/memory/specialized_oop_closures.hpp Wed Jun 04 13:51:09 2008 -0700 1.2 +++ b/src/share/vm/memory/specialized_oop_closures.hpp Thu Jun 05 15:57:56 2008 -0700 1.3 @@ -59,6 +59,12 @@ 1.4 // This is split into several because of a Visual C++ 6.0 compiler bug 1.5 // where very long macros cause the compiler to crash 1.6 1.7 +// Some other heap might define further specialized closures. 1.8 +#ifndef FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES 1.9 +#define FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) \ 1.10 + /* None */ 1.11 +#endif 1.12 + 1.13 #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f) \ 1.14 f(ScanClosure,_nv) \ 1.15 f(FastScanClosure,_nv) \ 1.16 @@ -77,7 +83,7 @@ 1.17 SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f) 1.18 1.19 #ifndef SERIALGC 1.20 -#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f) \ 1.21 +#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f) \ 1.22 f(MarkRefsIntoAndScanClosure,_nv) \ 1.23 f(Par_MarkRefsIntoAndScanClosure,_nv) \ 1.24 f(PushAndMarkClosure,_nv) \ 1.25 @@ -85,11 +91,13 @@ 1.26 f(PushOrMarkClosure,_nv) \ 1.27 f(Par_PushOrMarkClosure,_nv) \ 1.28 f(CMSKeepAliveClosure,_nv) \ 1.29 - f(CMSInnerParMarkAndPushClosure,_nv) 1.30 + f(CMSInnerParMarkAndPushClosure,_nv) \ 1.31 + FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) 1.32 #else // SERIALGC 1.33 -#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f) 1.34 +#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f) 1.35 #endif // SERIALGC 1.36 1.37 + 1.38 // We separate these out, because sometime the general one has 1.39 // a different definition from the specialized ones, and sometimes it 1.40 // doesn't. 1.41 @@ -98,8 +106,8 @@ 1.42 f(OopClosure,_v) \ 1.43 SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f) 1.44 1.45 -#define ALL_OOP_OOP_ITERATE_CLOSURES_3(f) \ 1.46 - SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_3(f) 1.47 +#define ALL_OOP_OOP_ITERATE_CLOSURES_2(f) \ 1.48 + SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f) 1.49 1.50 #ifndef SERIALGC 1.51 // This macro applies an argument macro to all OopClosures for which we 1.52 @@ -125,6 +133,13 @@ 1.53 // The "root_class" is the most general class to define; this may be 1.54 // "OopClosure" in some applications and "OopsInGenClosure" in others. 1.55 1.56 + 1.57 +// Some other heap might define further specialized closures. 1.58 +#ifndef FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES 1.59 +#define FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f) \ 1.60 + /* None */ 1.61 +#endif 1.62 + 1.63 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f) \ 1.64 f(ScanClosure,_nv) \ 1.65 f(FastScanClosure,_nv) 1.66 @@ -132,7 +147,8 @@ 1.67 #ifndef SERIALGC 1.68 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) \ 1.69 f(ParScanWithBarrierClosure,_nv) \ 1.70 - f(ParScanWithoutBarrierClosure,_nv) 1.71 + f(ParScanWithoutBarrierClosure,_nv) \ 1.72 + FURTHER_SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f) 1.73 #else // SERIALGC 1.74 #define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) 1.75 #endif // SERIALGC 1.76 @@ -179,13 +195,15 @@ 1.77 1.78 #if ENABLE_SPECIALIZATION_STATS 1.79 private: 1.80 - static int _numCallsAll; 1.81 + static bool _init; 1.82 + static bool _wrapped; 1.83 + static jint _numCallsAll; 1.84 1.85 - static int _numCallsTotal[NUM_Kinds]; 1.86 - static int _numCalls_nv[NUM_Kinds]; 1.87 + static jint _numCallsTotal[NUM_Kinds]; 1.88 + static jint _numCalls_nv[NUM_Kinds]; 1.89 1.90 - static int _numDoOopCallsTotal[NUM_Kinds]; 1.91 - static int _numDoOopCalls_nv[NUM_Kinds]; 1.92 + static jint _numDoOopCallsTotal[NUM_Kinds]; 1.93 + static jint _numDoOopCalls_nv[NUM_Kinds]; 1.94 public: 1.95 #endif 1.96 static void clear() PRODUCT_RETURN; 1.97 @@ -203,22 +221,22 @@ 1.98 #if ENABLE_SPECIALIZATION_STATS 1.99 1.100 inline void SpecializationStats::record_call() { 1.101 - _numCallsAll++;; 1.102 + Atomic::inc(&_numCallsAll); 1.103 } 1.104 inline void SpecializationStats::record_iterate_call_v(Kind k) { 1.105 - _numCallsTotal[k]++; 1.106 + Atomic::inc(&_numCallsTotal[k]); 1.107 } 1.108 inline void SpecializationStats::record_iterate_call_nv(Kind k) { 1.109 - _numCallsTotal[k]++; 1.110 - _numCalls_nv[k]++; 1.111 + Atomic::inc(&_numCallsTotal[k]); 1.112 + Atomic::inc(&_numCalls_nv[k]); 1.113 } 1.114 1.115 inline void SpecializationStats::record_do_oop_call_v(Kind k) { 1.116 - _numDoOopCallsTotal[k]++; 1.117 + Atomic::inc(&_numDoOopCallsTotal[k]); 1.118 } 1.119 inline void SpecializationStats::record_do_oop_call_nv(Kind k) { 1.120 - _numDoOopCallsTotal[k]++; 1.121 - _numDoOopCalls_nv[k]++; 1.122 + Atomic::inc(&_numDoOopCallsTotal[k]); 1.123 + Atomic::inc(&_numDoOopCalls_nv[k]); 1.124 } 1.125 1.126 #else // !ENABLE_SPECIALIZATION_STATS