src/hotspot/share/gc/shenandoah/shenandoahAllocRequest.hpp
changeset 52925 9c18c9d839d3
child 53244 9807daeb47c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocRequest.hpp	Mon Dec 10 15:47:44 2018 +0100
@@ -0,0 +1,158 @@
+/*
+ * 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 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