< prev index next >

src/hotspot/share/classfile/stringTable.cpp

Print this page
rev 50787 : 8205583: Crash in ConcurrentHashTable do_bulk_delete_locked_for
Reviewed-by:
rev 50788 : [mq]: 8205583_gerard


 482   bool operator()(WeakHandle<vm_string_table_data>* val) {
 483     ++_item;
 484     oop tmp = val->peek();
 485     if (tmp == NULL) {
 486       ++_count;
 487       return true;
 488     } else {
 489       return false;
 490     }
 491   }
 492 };
 493 
 494 void StringTable::clean_dead_entries(JavaThread* jt) {
 495   StringTableHash::BulkDeleteTask bdt(_local_table);
 496   if (!bdt.prepare(jt)) {
 497     return;
 498   }
 499 
 500   StringTableDeleteCheck stdc;
 501   StringTableDoDelete stdd;
 502   bool interrupted = false;
 503   {
 504     TraceTime timer("Clean", TRACETIME_LOG(Debug, stringtable, perf));
 505     while(bdt.do_task(jt, stdc, stdd)) {
 506       bdt.pause(jt);
 507       {
 508         ThreadBlockInVM tbivm(jt);
 509       }
 510       if (!bdt.cont(jt)) {
 511         interrupted = true;
 512         break;
 513       }
 514     }
 515   }
 516   if (interrupted) {
 517     _has_work = true;
 518   } else {
 519     bdt.done(jt);
 520   }
 521   log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item);
 522 }
 523 
 524 void StringTable::check_concurrent_work() {
 525   if (_has_work) {
 526     return;
 527   }
 528 
 529   double load_factor = StringTable::get_load_factor();
 530   double dead_factor = StringTable::get_dead_factor();
 531   // We should clean/resize if we have more dead than alive,
 532   // more items than preferred load factor or
 533   // more dead items than water mark.
 534   if ((dead_factor > load_factor) ||
 535       (load_factor > PREF_AVG_LIST_LEN) ||
 536       (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) {
 537     log_debug(stringtable)("Concurrent work triggered, live factor:%g dead factor:%g",
 538                            load_factor, dead_factor);




 482   bool operator()(WeakHandle<vm_string_table_data>* val) {
 483     ++_item;
 484     oop tmp = val->peek();
 485     if (tmp == NULL) {
 486       ++_count;
 487       return true;
 488     } else {
 489       return false;
 490     }
 491   }
 492 };
 493 
 494 void StringTable::clean_dead_entries(JavaThread* jt) {
 495   StringTableHash::BulkDeleteTask bdt(_local_table);
 496   if (!bdt.prepare(jt)) {
 497     return;
 498   }
 499 
 500   StringTableDeleteCheck stdc;
 501   StringTableDoDelete stdd;

 502   {
 503     TraceTime timer("Clean", TRACETIME_LOG(Debug, stringtable, perf));
 504     while(bdt.do_task(jt, stdc, stdd)) {
 505       bdt.pause(jt);
 506       {
 507         ThreadBlockInVM tbivm(jt);
 508       }
 509       bdt.cont(jt);


 510     }





 511     bdt.done(jt);
 512   }
 513   log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item);
 514 }
 515 
 516 void StringTable::check_concurrent_work() {
 517   if (_has_work) {
 518     return;
 519   }
 520 
 521   double load_factor = StringTable::get_load_factor();
 522   double dead_factor = StringTable::get_dead_factor();
 523   // We should clean/resize if we have more dead than alive,
 524   // more items than preferred load factor or
 525   // more dead items than water mark.
 526   if ((dead_factor > load_factor) ||
 527       (load_factor > PREF_AVG_LIST_LEN) ||
 528       (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) {
 529     log_debug(stringtable)("Concurrent work triggered, live factor:%g dead factor:%g",
 530                            load_factor, dead_factor);


< prev index next >