/* * Copyright (c) 2018, Red Hat, Inc. All rights reserved. * * 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_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP #include "memory/allocation.hpp" class ShenandoahAllocRequest : StackObj { public: enum Type { _alloc_shared, // Allocate common, outside of TLAB _alloc_shared_gc, // Allocate common, outside of GCLAB _alloc_tlab, // Allocate TLAB _alloc_gclab, // Allocate GCLAB _ALLOC_LIMIT }; static const char* alloc_type_to_string(Type type) { switch (type) { case _alloc_shared: return "Shared"; case _alloc_shared_gc: return "Shared GC"; case _alloc_tlab: return "TLAB"; case _alloc_gclab: return "GCLAB"; default: ShouldNotReachHere(); return ""; } } private: size_t _min_size; size_t _requested_size; size_t _actual_size; Type _alloc_type; #ifdef ASSERT bool _actual_size_set; #endif ShenandoahAllocRequest(size_t _min_size, size_t _requested_size, Type _alloc_type) : _min_size(_min_size), _requested_size(_requested_size), _actual_size(0), _alloc_type(_alloc_type) #ifdef ASSERT , _actual_size_set(false) #endif {} public: static inline ShenandoahAllocRequest for_tlab(size_t min_size, size_t requested_size) { return ShenandoahAllocRequest(min_size, requested_size, _alloc_tlab); } static inline ShenandoahAllocRequest for_gclab(size_t min_size, size_t requested_size) { return ShenandoahAllocRequest(min_size, requested_size, _alloc_gclab); } static inline ShenandoahAllocRequest for_shared_gc(size_t requested_size) { return ShenandoahAllocRequest(0, requested_size, _alloc_shared_gc); } static inline ShenandoahAllocRequest for_shared(size_t requested_size) { return ShenandoahAllocRequest(0, requested_size, _alloc_shared); } inline size_t size() { return _requested_size; } inline Type type() { return _alloc_type; } inline const char* type_string() { return alloc_type_to_string(_alloc_type); } inline size_t min_size() { assert (is_lab_alloc(), "Only access for LAB allocs"); return _min_size; } inline size_t actual_size() { assert (_actual_size_set, "Should be set"); return _actual_size; } inline void set_actual_size(size_t v) { #ifdef ASSERT assert (!_actual_size_set, "Should not be set"); _actual_size_set = true; #endif _actual_size = v; } inline bool is_mutator_alloc() { switch (_alloc_type) { case _alloc_tlab: case _alloc_shared: return true; case _alloc_gclab: case _alloc_shared_gc: return false; default: ShouldNotReachHere(); return false; } } inline bool is_gc_alloc() { switch (_alloc_type) { case _alloc_tlab: case _alloc_shared: return false; case _alloc_gclab: case _alloc_shared_gc: return true; default: ShouldNotReachHere(); return false; } } inline bool is_lab_alloc() { switch (_alloc_type) { case _alloc_tlab: case _alloc_gclab: return true; case _alloc_shared: case _alloc_shared_gc: return false; default: ShouldNotReachHere(); return false; } } }; #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP