hotspot/src/share/vm/code/nmethod.cpp
changeset 23187 0f438571f278
parent 22922 d3b370c35082
child 23491 f690330b10b9
equal deleted inserted replaced
22930:1c9f21f3fbf4 23187:0f438571f278
    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();