hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
changeset 9417 6719a2e727c0
parent 8930 52368505ee8e
child 9936 59dac2950cc7
equal deleted inserted replaced
9416:4d193fe22b76 9417:6719a2e727c0
   314   }
   314   }
   315 
   315 
   316   void setEmpty()   { _index = 0; clear_overflow(); }
   316   void setEmpty()   { _index = 0; clear_overflow(); }
   317 };
   317 };
   318 
   318 
       
   319 class ForceOverflowSettings VALUE_OBJ_CLASS_SPEC {
       
   320 private:
       
   321 #ifndef PRODUCT
       
   322   uintx _num_remaining;
       
   323   bool _force;
       
   324 #endif // !defined(PRODUCT)
       
   325 
       
   326 public:
       
   327   void init() PRODUCT_RETURN;
       
   328   void update() PRODUCT_RETURN;
       
   329   bool should_force() PRODUCT_RETURN_( return false; );
       
   330 };
       
   331 
   319 // this will enable a variety of different statistics per GC task
   332 // this will enable a variety of different statistics per GC task
   320 #define _MARKING_STATS_       0
   333 #define _MARKING_STATS_       0
   321 // this will enable the higher verbose levels
   334 // this will enable the higher verbose levels
   322 #define _MARKING_VERBOSE_     0
   335 #define _MARKING_VERBOSE_     0
   323 
   336 
   460 
   473 
   461   double*   _accum_task_vtime;   // accumulated task vtime
   474   double*   _accum_task_vtime;   // accumulated task vtime
   462 
   475 
   463   WorkGang* _parallel_workers;
   476   WorkGang* _parallel_workers;
   464 
   477 
       
   478   ForceOverflowSettings _force_overflow_conc;
       
   479   ForceOverflowSettings _force_overflow_stw;
       
   480 
   465   void weakRefsWork(bool clear_all_soft_refs);
   481   void weakRefsWork(bool clear_all_soft_refs);
   466 
   482 
   467   void swapMarkBitMaps();
   483   void swapMarkBitMaps();
   468 
   484 
   469   // It resets the global marking data structures, as well as the
   485   // It resets the global marking data structures, as well as the
   470   // task local ones; should be called during initial mark.
   486   // task local ones; should be called during initial mark.
   471   void reset();
   487   void reset();
   472   // It resets all the marking data structures.
   488   // It resets all the marking data structures.
   473   void clear_marking_state();
   489   void clear_marking_state(bool clear_overflow = true);
   474 
   490 
   475   // It should be called to indicate which phase we're in (concurrent
   491   // It should be called to indicate which phase we're in (concurrent
   476   // mark or remark) and how many threads are currently active.
   492   // mark or remark) and how many threads are currently active.
   477   void set_phase(size_t active_tasks, bool concurrent);
   493   void set_phase(size_t active_tasks, bool concurrent);
   478   // We do this after we're done with marking so that the marking data
   494   // We do this after we're done with marking so that the marking data
   544   bool restart_for_overflow()    { return _restart_for_overflow; }
   560   bool restart_for_overflow()    { return _restart_for_overflow; }
   545 
   561 
   546   // Methods to enter the two overflow sync barriers
   562   // Methods to enter the two overflow sync barriers
   547   void enter_first_sync_barrier(int task_num);
   563   void enter_first_sync_barrier(int task_num);
   548   void enter_second_sync_barrier(int task_num);
   564   void enter_second_sync_barrier(int task_num);
       
   565 
       
   566   ForceOverflowSettings* force_overflow_conc() {
       
   567     return &_force_overflow_conc;
       
   568   }
       
   569 
       
   570   ForceOverflowSettings* force_overflow_stw() {
       
   571     return &_force_overflow_stw;
       
   572   }
       
   573 
       
   574   ForceOverflowSettings* force_overflow() {
       
   575     if (concurrent()) {
       
   576       return force_overflow_conc();
       
   577     } else {
       
   578       return force_overflow_stw();
       
   579     }
       
   580   }
   549 
   581 
   550 public:
   582 public:
   551   // Manipulation of the global mark stack.
   583   // Manipulation of the global mark stack.
   552   // Notice that the first mark_stack_push is CAS-based, whereas the
   584   // Notice that the first mark_stack_push is CAS-based, whereas the
   553   // two below are Mutex-based. This is OK since the first one is only
   585   // two below are Mutex-based. This is OK since the first one is only