37 #include "oops/methodData.hpp" |
37 #include "oops/methodData.hpp" |
38 #include "prims/jvmtiRedefineClassesTrace.hpp" |
38 #include "prims/jvmtiRedefineClassesTrace.hpp" |
39 #include "prims/jvmtiImpl.hpp" |
39 #include "prims/jvmtiImpl.hpp" |
40 #include "runtime/sharedRuntime.hpp" |
40 #include "runtime/sharedRuntime.hpp" |
41 #include "runtime/sweeper.hpp" |
41 #include "runtime/sweeper.hpp" |
|
42 #include "utilities/resourceHash.hpp" |
42 #include "utilities/dtrace.hpp" |
43 #include "utilities/dtrace.hpp" |
43 #include "utilities/events.hpp" |
44 #include "utilities/events.hpp" |
44 #include "utilities/xmlstream.hpp" |
45 #include "utilities/xmlstream.hpp" |
45 #ifdef SHARK |
46 #ifdef SHARK |
46 #include "shark/sharkCompiler.hpp" |
47 #include "shark/sharkCompiler.hpp" |
2133 ResourceMark rm; |
2134 ResourceMark rm; |
2134 |
2135 |
2135 // Turn off dependency tracing while actually testing dependencies. |
2136 // Turn off dependency tracing while actually testing dependencies. |
2136 NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) ); |
2137 NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) ); |
2137 |
2138 |
2138 GenericHashtable<DependencySignature, ResourceObj>* table = new GenericHashtable<DependencySignature, ResourceObj>(11027); |
2139 typedef ResourceHashtable<DependencySignature, int, &DependencySignature::hash, |
|
2140 &DependencySignature::equals, 11027> DepTable; |
|
2141 |
|
2142 DepTable* table = new DepTable(); |
|
2143 |
2139 // Iterate over live nmethods and check dependencies of all nmethods that are not |
2144 // Iterate over live nmethods and check dependencies of all nmethods that are not |
2140 // marked for deoptimization. A particular dependency is only checked once. |
2145 // marked for deoptimization. A particular dependency is only checked once. |
2141 for(nmethod* nm = CodeCache::alive_nmethod(CodeCache::first()); nm != NULL; nm = CodeCache::alive_nmethod(CodeCache::next(nm))) { |
2146 for(nmethod* nm = CodeCache::alive_nmethod(CodeCache::first()); nm != NULL; nm = CodeCache::alive_nmethod(CodeCache::next(nm))) { |
2142 if (!nm->is_marked_for_deoptimization()) { |
2147 if (!nm->is_marked_for_deoptimization()) { |
2143 for (Dependencies::DepStream deps(nm); deps.next(); ) { |
2148 for (Dependencies::DepStream deps(nm); deps.next(); ) { |
2144 // Construct abstraction of a dependency. |
2149 // Construct abstraction of a dependency. |
2145 DependencySignature* current_sig = new DependencySignature(deps); |
2150 DependencySignature* current_sig = new DependencySignature(deps); |
2146 // Determine if 'deps' is already checked. table->add() returns |
2151 |
2147 // 'true' if the dependency was added (i.e., was not in the hashtable). |
2152 // Determine if dependency is already checked. table->put(...) returns |
2148 if (table->add(current_sig)) { |
2153 // 'true' if the dependency is added (i.e., was not in the hashtable). |
|
2154 if (table->put(*current_sig, 1)) { |
2149 if (deps.check_dependency() != NULL) { |
2155 if (deps.check_dependency() != NULL) { |
2150 // Dependency checking failed. Print out information about the failed |
2156 // Dependency checking failed. Print out information about the failed |
2151 // dependency and finally fail with an assert. We can fail here, since |
2157 // dependency and finally fail with an assert. We can fail here, since |
2152 // dependency checking is never done in a product build. |
2158 // dependency checking is never done in a product build. |
2153 changes.print(); |
2159 changes.print(); |