--- old/src/hotspot/share/gc/shared/taskTerminator.hpp 2020-08-14 10:07:53.528955071 +0200 +++ new/src/hotspot/share/gc/shared/taskTerminator.hpp 2020-08-14 10:07:53.400954151 +0200 @@ -45,20 +45,28 @@ * SIGPLAN International Symposium on Memory Management (ISMM 2016). ACM, * New York, NY, USA, 46-54. DOI: https://doi.org/10.1145/2926697.2926706" * - * Instead of a dedicated spin-master, our implementation will let spin-master relinquish - * the role before it goes to sleep/wait, allowing newly arrived threads to compete for the role. - * The intention of above enhancement is to reduce spin-master's latency on detecting new tasks - * for stealing and termination condition. + * Instead of a dedicated spin-master, our implementation will let spin-master + * relinquish the role before it goes to sleep/wait, allowing newly arrived + * threads to compete for the role. + * The intention of above enhancement is to reduce spin-master's latency on + * detecting new tasks for stealing and termination condition. */ class TaskTerminator : public CHeapObj { - struct DelayContext { + class DelayContext { uint _yield_count; // Number of hard spin loops done since last yield uint _hard_spin_count; - // Number of iterations in the hard spin loop. + // Number of iterations in the current hard spin loop. uint _hard_spin_limit; + void reset_hard_spin_information(); + public: DelayContext(); + + // Should the caller sleep (wait) or perform a spin step? + bool needs_sleep() const; + // Perform one delay iteration. + void do_step(); }; uint _n_threads; @@ -68,11 +76,11 @@ volatile uint _offered_termination; DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile uint)); - void assert_queue_set_empty() const NOT_DEBUG_RETURN; - Monitor _blocker; Thread* _spin_master; + void assert_queue_set_empty() const NOT_DEBUG_RETURN; + // Prepare for return from offer_termination. Gives up the spin master token // and wakes up up to tasks threads waiting on _blocker (the default value // means to wake up everyone). @@ -84,7 +92,7 @@ size_t tasks_in_queue_set() const; // Perform one iteration of spin-master work. - bool do_delay_step(DelayContext& delay_context); + void do_delay_step(DelayContext& delay_context); NONCOPYABLE(TaskTerminator);