8220595: ZGC: Introduce ZAttachedArray
authorpliden
Mon, 18 Mar 2019 11:50:40 +0100
changeset 54170 8f1771ea1e39
parent 54169 5748eae24183
child 54171 07943af21b96
8220595: ZGC: Introduce ZAttachedArray Reviewed-by: stefank, eosterlund
src/hotspot/share/gc/z/zAttachedArray.hpp
src/hotspot/share/gc/z/zAttachedArray.inline.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/gc/z/zAttachedArray.hpp	Mon Mar 18 11:50:40 2019 +0100
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2019, 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_Z_ZATTACHEDARRAY_HPP
+#define SHARE_GC_Z_ZATTACHEDARRAY_HPP
+
+#include "utilities/globalDefinitions.hpp"
+
+template <typename ObjectT, typename ArrayT>
+class ZAttachedArray {
+private:
+  const uint32_t _length;
+
+  static size_t object_size();
+
+public:
+  static void* alloc(size_t length);
+  static void free(ObjectT* obj);
+
+  ZAttachedArray(size_t length);
+
+  uint32_t length() const;
+  ArrayT* operator()(const ObjectT* obj) const;
+};
+
+#endif // SHARE_GC_Z_ZATTACHEDARRAY_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hotspot/share/gc/z/zAttachedArray.inline.hpp	Mon Mar 18 11:50:40 2019 +0100
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2019, 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_Z_ZATTACHEDARRAY_INLINE_HPP
+#define SHARE_GC_Z_ZATTACHEDARRAY_INLINE_HPP
+
+#include "gc/z/zAttachedArray.hpp"
+#include "memory/allocation.hpp"
+#include "utilities/align.hpp"
+
+template <typename ObjectT, typename ArrayT>
+inline size_t ZAttachedArray<ObjectT, ArrayT>::object_size() {
+  return align_up(sizeof(ObjectT), sizeof(ArrayT));
+}
+
+template <typename ObjectT, typename ArrayT>
+inline void* ZAttachedArray<ObjectT, ArrayT>::alloc(size_t length) {
+  const size_t array_size = sizeof(ArrayT) * length;
+  char* const addr = AllocateHeap(object_size() + array_size, mtGC);
+  ::new (addr + object_size()) ArrayT[length];
+  return addr;
+}
+
+template <typename ObjectT, typename ArrayT>
+inline void ZAttachedArray<ObjectT, ArrayT>::free(ObjectT* obj) {
+  FreeHeap(obj);
+}
+
+template <typename ObjectT, typename ArrayT>
+inline ZAttachedArray<ObjectT, ArrayT>::ZAttachedArray(size_t length) :
+    _length(length) {}
+
+template <typename ObjectT, typename ArrayT>
+inline uint32_t ZAttachedArray<ObjectT, ArrayT>::length() const {
+  return _length;
+}
+
+template <typename ObjectT, typename ArrayT>
+inline ArrayT* ZAttachedArray<ObjectT, ArrayT>::operator()(const ObjectT* obj) const {
+  return reinterpret_cast<ArrayT*>(reinterpret_cast<uintptr_t>(obj) + object_size());
+}
+
+#endif // SHARE_GC_Z_ZATTACHEDARRAY_INLINE_HPP