| /* |
| * Copyright (c) 2024, 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. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| * |
| */ |
| |
| #ifndef SHARE_GC_SHARED_PARTIALARRAYSPLITTER_HPP |
| #define SHARE_GC_SHARED_PARTIALARRAYSPLITTER_HPP |
| |
| #include "gc/shared/partialArrayState.hpp" |
| #include "gc/shared/partialArrayTaskStats.hpp" |
| #include "gc/shared/partialArrayTaskStepper.hpp" |
| #include "oops/oop.hpp" |
| #include "utilities/globalDefinitions.hpp" |
| #include "utilities/macros.hpp" |
| |
| class outputStream; |
| |
| // Helper class for splitting the processing of a large objArray into multiple |
| // tasks, to permit multiple threads to work on different pieces of the array |
| // in parallel. |
| class PartialArraySplitter { |
| PartialArrayStateAllocator _allocator; |
| PartialArrayTaskStepper _stepper; |
| TASKQUEUE_STATS_ONLY(PartialArrayTaskStats _stats;) |
| |
| public: |
| PartialArraySplitter(PartialArrayStateManager* manager, |
| uint num_workers, |
| size_t chunk_size); |
| ~PartialArraySplitter() = default; |
| |
| NONCOPYABLE(PartialArraySplitter); |
| |
| // Setup to process an objArray in chunks. |
| // |
| // from_array is the array found by the collector that needs processing. It |
| // may be null if to_array contains everything needed for processing. |
| // |
| // to_array is an unprocessed (possibly partial) copy of from_array, or null |
| // if a copy of from_array is not required. |
| // |
| // length is their length in elements. |
| // |
| // If t is a ScannerTask, queue->push(t) must be a valid expression. The |
| // result of that expression is ignored. |
| // |
| // Returns the size of the initial chunk that is to be processed by the |
| // caller. |
| // |
| // Adds PartialArrayState ScannerTasks to the queue if needed to process the |
| // array in chunks. This permits other workers to steal and process them |
| // even while the caller is processing the initial chunk. If length doesn't |
| // exceed the chunk size then the result will be length, indicating the |
| // caller is to process the entire array. In this case, no tasks will have |
| // been added to the queue. |
| template<typename Queue> |
| size_t start(Queue* queue, |
| objArrayOop from_array, |
| objArrayOop to_array, |
| size_t length); |
| |
| // Result type for claim(), carrying multiple values. Provides the claimed |
| // chunk's start and end array indices. |
| struct Claim { |
| size_t _start; |
| size_t _end; |
| }; |
| |
| // Claims a chunk from state, returning the index range for that chunk. The |
| // caller is expected to process that chunk. Adds more state-based tasks to |
| // the queue if needed, permitting other workers to steal and process them |
| // even while the caller is processing this claim. |
| // |
| // Releases the state. Callers must not use state after the call to this |
| // function. The state may have been recycled and reused. |
| // |
| // The queue has the same requirements as for start(). |
| // |
| // stolen indicates whether the state task was obtained from this queue or |
| // stolen from some other queue. |
| template<typename Queue> |
| Claim claim(PartialArrayState* state, Queue* queue, bool stolen); |
| |
| TASKQUEUE_STATS_ONLY(PartialArrayTaskStats* stats();) |
| }; |
| |
| #endif // SHARE_GC_SHARED_PARTIALARRAYSPLITTER_HPP |