< prev index next >
src/hotspot/share/gc/g1/g1ConcurrentRefineThread.hpp
Print this page
rev 57716 : imported patch remove_cbl_mon
rev 57717 : [mq]: helper_classes
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -43,28 +43,37 @@
Tickspan _total_refinement_time;
size_t _total_refined_cards;
uint _worker_id;
- bool _active;
- Monitor* _monitor;
+ // _notifier and _should_notify form a single-reader / multi-writer
+ // notification mechanism. The owning concurrent refinement thread is the
+ // single reader. The writers are (other) threads that call activate() on
+ // the thread. The i-th concurrent refinement thread is responsible for
+ // activating thread i+1 if the number of buffers in the queue exceeds a
+ // threshold for that i+1th thread. The 0th (primary) thread is activated
+ // by threads that add cards to the dirty card queue set when the primary
+ // thread's threshold is exceeded. activate() is also used to wake up the
+ // threads during termination, so even the non-primary thread case is
+ // multi-writer.
+ Semaphore* _notifier;
+ volatile bool _should_notify;
+
+ // Called when no refinement work found for this thread.
+ // Returns true if should deactivate.
+ bool maybe_deactivate(bool more_work);
+
G1ConcurrentRefine* _cr;
void wait_for_completed_buffers();
- void set_active(bool x) { _active = x; }
- // Deactivate this thread.
- void deactivate();
-
- bool is_primary() { return (_worker_id == 0); }
+ virtual void run_service();
+ virtual void stop_service();
- void run_service();
- void stop_service();
public:
G1ConcurrentRefineThread(G1ConcurrentRefine* cg1r, uint worker_id);
- bool is_active();
// Activate this thread.
void activate();
Tickspan total_refinement_time() const { return _total_refinement_time; }
size_t total_refined_cards() const { return _total_refined_cards; }
< prev index next >