ysr@777: /* johnc@5078: * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ysr@777: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ysr@777: * ysr@777: * This code is free software; you can redistribute it and/or modify it ysr@777: * under the terms of the GNU General Public License version 2 only, as ysr@777: * published by the Free Software Foundation. ysr@777: * ysr@777: * This code is distributed in the hope that it will be useful, but WITHOUT ysr@777: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ysr@777: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ysr@777: * version 2 for more details (a copy is included in the LICENSE file that ysr@777: * accompanied this code). ysr@777: * ysr@777: * You should have received a copy of the GNU General Public License version ysr@777: * 2 along with this work; if not, write to the Free Software Foundation, ysr@777: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ysr@777: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. ysr@777: * ysr@777: */ ysr@777: stefank@2314: #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTG1REFINE_HPP stefank@2314: #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTG1REFINE_HPP stefank@2314: johnc@5078: #include "gc_implementation/g1/g1HotCardCache.hpp" stefank@2314: #include "memory/allocation.hpp" stefank@2314: #include "runtime/thread.hpp" stefank@2314: #include "utilities/globalDefinitions.hpp" stefank@2314: ysr@777: // Forward decl ysr@777: class ConcurrentG1RefineThread; johnc@5078: class G1CollectedHeap; johnc@5078: class G1HotCardCache; ysr@777: class G1RemSet; tschatzl@5204: class DirtyCardQueue; ysr@777: zgu@3900: class ConcurrentG1Refine: public CHeapObj { iveresov@1229: ConcurrentG1RefineThread** _threads; iveresov@1229: int _n_threads; iveresov@1546: int _n_worker_threads; iveresov@1546: /* iveresov@1546: * The value of the update buffer queue length falls into one of 3 zones: iveresov@1546: * green, yellow, red. If the value is in [0, green) nothing is iveresov@1546: * done, the buffers are left unprocessed to enable the caching effect of the iveresov@1546: * dirtied cards. In the yellow zone [green, yellow) the concurrent refinement iveresov@1546: * threads are gradually activated. In [yellow, red) all threads are iveresov@1546: * running. If the length becomes red (max queue length) the mutators start iveresov@1546: * processing the buffers. iveresov@1546: * tonyp@1717: * There are some interesting cases (when G1UseAdaptiveConcRefinement tonyp@1717: * is turned off): iveresov@1546: * 1) green = yellow = red = 0. In this case the mutator will process all iveresov@1546: * buffers. Except for those that are created by the deferred updates iveresov@1546: * machinery during a collection. iveresov@1546: * 2) green = 0. Means no caching. Can be a good way to minimize the iveresov@1546: * amount of time spent updating rsets during a collection. iveresov@1546: */ iveresov@1546: int _green_zone; iveresov@1546: int _yellow_zone; iveresov@1546: int _red_zone; iveresov@1546: iveresov@1546: int _thread_threshold_step; iveresov@1546: johnc@5078: // We delay the refinement of 'hot' cards using the hot card cache. johnc@5078: G1HotCardCache _hot_card_cache; johnc@5078: iveresov@1546: // Reset the threshold step value based of the current zone boundaries. iveresov@1546: void reset_threshold_step(); johnc@1325: ysr@777: public: johnc@5078: ConcurrentG1Refine(G1CollectedHeap* g1h); ysr@777: ~ConcurrentG1Refine(); ysr@777: ysr@777: void init(); // Accomplish some initialization that has to wait. iveresov@1229: void stop(); ysr@777: iveresov@1546: void reinitialize_threads(); iveresov@1546: tschatzl@5204: // Iterate over all concurrent refinement threads iveresov@1229: void threads_do(ThreadClosure *tc); ysr@777: tschatzl@5204: // Iterate over all worker refinement threads tschatzl@5204: void worker_threads_do(ThreadClosure * tc); tschatzl@5204: tschatzl@5204: // The RS sampling thread tschatzl@5204: ConcurrentG1RefineThread * sampling_thread() const; tschatzl@5204: iveresov@1546: static int thread_num(); tonyp@1454: tonyp@1454: void print_worker_threads_on(outputStream* st) const; iveresov@1546: iveresov@1546: void set_green_zone(int x) { _green_zone = x; } iveresov@1546: void set_yellow_zone(int x) { _yellow_zone = x; } iveresov@1546: void set_red_zone(int x) { _red_zone = x; } iveresov@1546: iveresov@1546: int green_zone() const { return _green_zone; } iveresov@1546: int yellow_zone() const { return _yellow_zone; } iveresov@1546: int red_zone() const { return _red_zone; } iveresov@1546: iveresov@1546: int total_thread_num() const { return _n_threads; } iveresov@1546: int worker_thread_num() const { return _n_worker_threads; } iveresov@1546: iveresov@1546: int thread_threshold_step() const { return _thread_threshold_step; } johnc@5078: johnc@5078: G1HotCardCache* hot_card_cache() { return &_hot_card_cache; } ysr@777: }; stefank@2314: stefank@2314: #endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTG1REFINE_HPP