1 /* 2 * Copyright (c) 2018, 2019, Red Hat, Inc. 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_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP 26 #define SHARE_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP 27 28 #include "memory/allocation.hpp" 29 30 class ShenandoahAllocRequest : StackObj { 31 public: 32 enum Type { 33 _alloc_shared, // Allocate common, outside of TLAB 34 _alloc_shared_gc, // Allocate common, outside of GCLAB 35 _alloc_tlab, // Allocate TLAB 36 _alloc_gclab, // Allocate GCLAB 37 _ALLOC_LIMIT 38 }; 39 40 static const char* alloc_type_to_string(Type type) { 41 switch (type) { 42 case _alloc_shared: 43 return "Shared"; 44 case _alloc_shared_gc: 45 return "Shared GC"; 46 case _alloc_tlab: 47 return "TLAB"; 48 case _alloc_gclab: 49 return "GCLAB"; 50 default: 51 ShouldNotReachHere(); 52 return ""; 53 } 54 } 55 56 private: 57 size_t _min_size; 58 size_t _requested_size; 59 size_t _actual_size; 60 Type _alloc_type; 61 #ifdef ASSERT 62 bool _actual_size_set; 63 #endif 64 65 ShenandoahAllocRequest(size_t _min_size, size_t _requested_size, Type _alloc_type) : 66 _min_size(_min_size), _requested_size(_requested_size), 67 _actual_size(0), _alloc_type(_alloc_type) 68 #ifdef ASSERT 69 , _actual_size_set(false) 70 #endif 71 {} 72 73 public: 74 static inline ShenandoahAllocRequest for_tlab(size_t min_size, size_t requested_size) { 75 return ShenandoahAllocRequest(min_size, requested_size, _alloc_tlab); 76 } 77 78 static inline ShenandoahAllocRequest for_gclab(size_t min_size, size_t requested_size) { 79 return ShenandoahAllocRequest(min_size, requested_size, _alloc_gclab); 80 } 81 82 static inline ShenandoahAllocRequest for_shared_gc(size_t requested_size) { 83 return ShenandoahAllocRequest(0, requested_size, _alloc_shared_gc); 84 } 85 86 static inline ShenandoahAllocRequest for_shared(size_t requested_size) { 87 return ShenandoahAllocRequest(0, requested_size, _alloc_shared); 88 } 89 90 inline size_t size() { 91 return _requested_size; 92 } 93 94 inline Type type() { 95 return _alloc_type; 96 } 97 98 inline const char* type_string() { 99 return alloc_type_to_string(_alloc_type); 100 } 101 102 inline size_t min_size() { 103 assert (is_lab_alloc(), "Only access for LAB allocs"); 104 return _min_size; 105 } 106 107 inline size_t actual_size() { 108 assert (_actual_size_set, "Should be set"); 109 return _actual_size; 110 } 111 112 inline void set_actual_size(size_t v) { 113 #ifdef ASSERT 114 assert (!_actual_size_set, "Should not be set"); 115 _actual_size_set = true; 116 #endif 117 _actual_size = v; 118 } 119 120 inline bool is_mutator_alloc() { 121 switch (_alloc_type) { 122 case _alloc_tlab: 123 case _alloc_shared: 124 return true; 125 case _alloc_gclab: 126 case _alloc_shared_gc: 127 return false; 128 default: 129 ShouldNotReachHere(); 130 return false; 131 } 132 } 133 134 inline bool is_gc_alloc() { 135 switch (_alloc_type) { 136 case _alloc_tlab: 137 case _alloc_shared: 138 return false; 139 case _alloc_gclab: 140 case _alloc_shared_gc: 141 return true; 142 default: 143 ShouldNotReachHere(); 144 return false; 145 } 146 } 147 148 inline bool is_lab_alloc() { 149 switch (_alloc_type) { 150 case _alloc_tlab: 151 case _alloc_gclab: 152 return true; 153 case _alloc_shared: 154 case _alloc_shared_gc: 155 return false; 156 default: 157 ShouldNotReachHere(); 158 return false; 159 } 160 } 161 }; 162 163 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP