1 /*
2  * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_GC_G1_G1CONCURRENTREFINETHREAD_HPP
26 #define SHARE_GC_G1_G1CONCURRENTREFINETHREAD_HPP
27 
28 #include "gc/shared/concurrentGCThread.hpp"
29 #include "utilities/ticks.hpp"
30 
31 // Forward Decl.
32 class G1ConcurrentRefine;
33 class G1ConcurrentRefineStats;
34 
35 // One or more G1 Concurrent Refinement Threads may be active if concurrent
36 // refinement is in progress.
37 class G1ConcurrentRefineThread: public ConcurrentGCThread {
38   friend class VMStructs;
39   friend class G1CollectedHeap;
40 
41   double _vtime_start;  // Initial virtual time.
42   double _vtime_accum;  // Accumulated virtual time.
43 
44   G1ConcurrentRefineStats* _refinement_stats;
45 
46   uint _worker_id;
47 
48   // _notifier and _should_notify form a single-reader / multi-writer
49   // notification mechanism.  The owning concurrent refinement thread is the
50   // single reader. The writers are (other) threads that call activate() on
51   // the thread.  The i-th concurrent refinement thread is responsible for
52   // activating thread i+1 if the number of buffers in the queue exceeds a
53   // threshold for that i+1th thread.  The 0th (primary) thread is activated
54   // by threads that add cards to the dirty card queue set when the primary
55   // thread's threshold is exceeded.  activate() is also used to wake up the
56   // threads during termination, so even the non-primary thread case is
57   // multi-writer.
58   Semaphore* _notifier;
59   volatile bool _should_notify;
60 
61   // Called when no refinement work found for this thread.
62   // Returns true if should deactivate.
63   bool maybe_deactivate(bool more_work);
64 
65   G1ConcurrentRefine* _cr;
66 
67   void wait_for_completed_buffers();
68 
69   virtual void run_service();
70   virtual void stop_service();
71 
72 public:
73   G1ConcurrentRefineThread(G1ConcurrentRefine* cg1r, uint worker_id);
74   virtual ~G1ConcurrentRefineThread();
75 
76   // Activate this thread.
77   void activate();
78 
refinement_stats() const79   G1ConcurrentRefineStats* refinement_stats() const {
80     return _refinement_stats;
81   }
82 
83   // Total virtual time so far.
vtime_accum()84   double vtime_accum() { return _vtime_accum; }
85 };
86 
87 #endif // SHARE_GC_G1_G1CONCURRENTREFINETHREAD_HPP
88