# HG changeset patch # User pliden # Date 1571644687 -7200 # Node ID f74ec3cbfcc022d90ee89c32f24ba415b5853e7c # Parent 810409af12f1c10b0f9c002e921912be1cccafa9 8232238: ZGC: Move ZList inline funtions to zList.inline.hpp Reviewed-by: eosterlund diff -r 810409af12f1 -r f74ec3cbfcc0 src/hotspot/share/gc/z/zList.hpp --- a/src/hotspot/share/gc/z/zList.hpp Mon Oct 21 09:57:26 2019 +0200 +++ b/src/hotspot/share/gc/z/zList.hpp Mon Oct 21 09:58:07 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -25,7 +25,6 @@ #define SHARE_GC_Z_ZLIST_HPP #include "memory/allocation.hpp" -#include "utilities/debug.hpp" template class ZList; @@ -38,27 +37,15 @@ ZListNode* _next; ZListNode* _prev; - ZListNode(ZListNode* next, ZListNode* prev) : - _next(next), - _prev(prev) {} + ZListNode(ZListNode* next, ZListNode* prev); - void set_unused() { - _next = NULL; - _prev = NULL; - } + void set_unused(); public: - ZListNode() { - set_unused(); - } + ZListNode(); + ~ZListNode(); - ~ZListNode() { - set_unused(); - } - - bool is_unused() const { - return _next == NULL && _prev == NULL; - } + bool is_unused() const; }; // Doubly linked list @@ -72,139 +59,34 @@ ZList(const ZList& list); ZList& operator=(const ZList& list); - void verify() const { - assert(_head._next->_prev == &_head, "List corrupt"); - assert(_head._prev->_next == &_head, "List corrupt"); - } - - void insert(ZListNode* before, ZListNode* node) { - verify(); + void verify() const; - assert(node->is_unused(), "Already in a list"); - node->_prev = before; - node->_next = before->_next; - before->_next = node; - node->_next->_prev = node; + void insert(ZListNode* before, ZListNode* node); - _size++; - } - - ZListNode* cast_to_inner(T* elem) const { - return &elem->_node; - } - - T* cast_to_outer(ZListNode* node) const { - return (T*)((uintptr_t)node - offset_of(T, _node)); - } + ZListNode* cast_to_inner(T* elem) const; + T* cast_to_outer(ZListNode* node) const; public: - ZList() : - _head(&_head, &_head), - _size(0) { - verify(); - } - - size_t size() const { - verify(); - return _size; - } + ZList(); - bool is_empty() const { - return _size == 0; - } - - T* first() const { - return is_empty() ? NULL : cast_to_outer(_head._next); - } - - T* last() const { - return is_empty() ? NULL : cast_to_outer(_head._prev); - } + size_t size() const; + bool is_empty() const; - T* next(T* elem) const { - verify(); - ZListNode* next = cast_to_inner(elem)->_next; - return (next == &_head) ? NULL : cast_to_outer(next); - } - - T* prev(T* elem) const { - verify(); - ZListNode* prev = cast_to_inner(elem)->_prev; - return (prev == &_head) ? NULL : cast_to_outer(prev); - } - - void insert_first(T* elem) { - insert(&_head, cast_to_inner(elem)); - } - - void insert_last(T* elem) { - insert(_head._prev, cast_to_inner(elem)); - } - - void insert_before(T* before, T* elem) { - insert(cast_to_inner(before)->_prev, cast_to_inner(elem)); - } - - void insert_after(T* after, T* elem) { - insert(cast_to_inner(after), cast_to_inner(elem)); - } - - void remove(T* elem) { - verify(); + T* first() const; + T* last() const; + T* next(T* elem) const; + T* prev(T* elem) const; - ZListNode* const node = cast_to_inner(elem); - assert(!node->is_unused(), "Not in a list"); - - ZListNode* const next = node->_next; - ZListNode* const prev = node->_prev; - assert(next->_prev == node, "List corrupt"); - assert(prev->_next == node, "List corrupt"); - - prev->_next = next; - next->_prev = prev; - node->set_unused(); - - _size--; - } - - T* remove_first() { - T* elem = first(); - if (elem != NULL) { - remove(elem); - } - - return elem; - } + void insert_first(T* elem); + void insert_last(T* elem); + void insert_before(T* before, T* elem); + void insert_after(T* after, T* elem); - T* remove_last() { - T* elem = last(); - if (elem != NULL) { - remove(elem); - } - - return elem; - } - - void transfer(ZList* list) { - verify(); + void remove(T* elem); + T* remove_first(); + T* remove_last(); - if (!list->is_empty()) { - list->_head._next->_prev = _head._prev; - list->_head._prev->_next = _head._prev->_next; - - _head._prev->_next = list->_head._next; - _head._prev = list->_head._prev; - - list->_head._next = &list->_head; - list->_head._prev = &list->_head; - - _size += list->_size; - list->_size = 0; - - list->verify(); - verify(); - } - } + void transfer(ZList* list); }; template @@ -226,15 +108,13 @@ template class ZListIterator : public ZListIteratorImpl { public: - ZListIterator(const ZList* list) : - ZListIteratorImpl(list) {} + ZListIterator(const ZList* list); }; template class ZListReverseIterator : public ZListIteratorImpl { public: - ZListReverseIterator(const ZList* list) : - ZListIteratorImpl(list) {} + ZListReverseIterator(const ZList* list); }; #endif // SHARE_GC_Z_ZLIST_HPP diff -r 810409af12f1 -r f74ec3cbfcc0 src/hotspot/share/gc/z/zList.inline.hpp --- a/src/hotspot/share/gc/z/zList.inline.hpp Mon Oct 21 09:57:26 2019 +0200 +++ b/src/hotspot/share/gc/z/zList.inline.hpp Mon Oct 21 09:58:07 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -25,14 +25,193 @@ #define SHARE_GC_Z_ZLIST_INLINE_HPP #include "gc/z/zList.hpp" +#include "utilities/debug.hpp" + +template +inline ZListNode::ZListNode(ZListNode* next, ZListNode* prev) : + _next(next), + _prev(prev) {} + +template +inline void ZListNode::set_unused() { + _next = NULL; + _prev = NULL; +} + +template +inline ZListNode::ZListNode() { + set_unused(); +} + +template +inline ZListNode::~ZListNode() { + set_unused(); +} + +template +inline bool ZListNode::is_unused() const { + return _next == NULL && _prev == NULL; +} + +template +inline void ZList::verify() const { + assert(_head._next->_prev == &_head, "List corrupt"); + assert(_head._prev->_next == &_head, "List corrupt"); +} + +template +inline void ZList::insert(ZListNode* before, ZListNode* node) { + verify(); + + assert(node->is_unused(), "Already in a list"); + node->_prev = before; + node->_next = before->_next; + before->_next = node; + node->_next->_prev = node; + + _size++; +} + +template +inline ZListNode* ZList::cast_to_inner(T* elem) const { + return &elem->_node; +} + +template +inline T* ZList::cast_to_outer(ZListNode* node) const { + return (T*)((uintptr_t)node - offset_of(T, _node)); +} + +template +inline ZList::ZList() : + _head(&_head, &_head), + _size(0) { + verify(); +} + +template +inline size_t ZList::size() const { + verify(); + return _size; +} + +template +inline bool ZList::is_empty() const { + return _size == 0; +} + +template +inline T* ZList::first() const { + return is_empty() ? NULL : cast_to_outer(_head._next); +} + +template +inline T* ZList::last() const { + return is_empty() ? NULL : cast_to_outer(_head._prev); +} + +template +inline T* ZList::next(T* elem) const { + verify(); + ZListNode* next = cast_to_inner(elem)->_next; + return (next == &_head) ? NULL : cast_to_outer(next); +} + +template +inline T* ZList::prev(T* elem) const { + verify(); + ZListNode* prev = cast_to_inner(elem)->_prev; + return (prev == &_head) ? NULL : cast_to_outer(prev); +} + +template +inline void ZList::insert_first(T* elem) { + insert(&_head, cast_to_inner(elem)); +} + +template +inline void ZList::insert_last(T* elem) { + insert(_head._prev, cast_to_inner(elem)); +} + +template +inline void ZList::insert_before(T* before, T* elem) { + insert(cast_to_inner(before)->_prev, cast_to_inner(elem)); +} + +template +inline void ZList::insert_after(T* after, T* elem) { + insert(cast_to_inner(after), cast_to_inner(elem)); +} + +template +inline void ZList::remove(T* elem) { + verify(); + + ZListNode* const node = cast_to_inner(elem); + assert(!node->is_unused(), "Not in a list"); + + ZListNode* const next = node->_next; + ZListNode* const prev = node->_prev; + assert(next->_prev == node, "List corrupt"); + assert(prev->_next == node, "List corrupt"); + + prev->_next = next; + next->_prev = prev; + node->set_unused(); + + _size--; +} + +template +inline T* ZList::remove_first() { + T* elem = first(); + if (elem != NULL) { + remove(elem); + } + + return elem; +} + +template +inline T* ZList::remove_last() { + T* elem = last(); + if (elem != NULL) { + remove(elem); + } + + return elem; +} + +template +inline void ZList::transfer(ZList* list) { + verify(); + + if (!list->is_empty()) { + list->_head._next->_prev = _head._prev; + list->_head._prev->_next = _head._prev->_next; + + _head._prev->_next = list->_head._next; + _head._prev = list->_head._prev; + + list->_head._next = &list->_head; + list->_head._prev = &list->_head; + + _size += list->_size; + list->_size = 0; + + list->verify(); + verify(); + } +} template -ZListIteratorImpl::ZListIteratorImpl(const ZList* list) : +inline ZListIteratorImpl::ZListIteratorImpl(const ZList* list) : _list(list), _next(forward ? list->first() : list->last()) {} template -bool ZListIteratorImpl::next(T** elem) { +inline bool ZListIteratorImpl::next(T** elem) { if (_next != NULL) { *elem = _next; _next = forward ? _list->next(_next) : _list->prev(_next); @@ -43,4 +222,12 @@ return false; } +template +inline ZListIterator::ZListIterator(const ZList* list) : + ZListIteratorImpl(list) {} + +template +inline ZListReverseIterator::ZListReverseIterator(const ZList* list) : + ZListIteratorImpl(list) {} + #endif // SHARE_GC_Z_ZLIST_INLINE_HPP diff -r 810409af12f1 -r f74ec3cbfcc0 src/hotspot/share/gc/z/zMemory.inline.hpp --- a/src/hotspot/share/gc/z/zMemory.inline.hpp Mon Oct 21 09:57:26 2019 +0200 +++ b/src/hotspot/share/gc/z/zMemory.inline.hpp Mon Oct 21 09:58:07 2019 +0200 @@ -24,6 +24,7 @@ #ifndef SHARE_GC_Z_ZMEMORY_INLINE_HPP #define SHARE_GC_Z_ZMEMORY_INLINE_HPP +#include "gc/z/zList.inline.hpp" #include "gc/z/zMemory.hpp" #include "utilities/debug.hpp" diff -r 810409af12f1 -r f74ec3cbfcc0 src/hotspot/share/gc/z/zPage.cpp --- a/src/hotspot/share/gc/z/zPage.cpp Mon Oct 21 09:57:26 2019 +0200 +++ b/src/hotspot/share/gc/z/zPage.cpp Mon Oct 21 09:58:07 2019 +0200 @@ -22,6 +22,7 @@ */ #include "precompiled.hpp" +#include "gc/z/zList.inline.hpp" #include "gc/z/zPage.inline.hpp" #include "gc/z/zPhysicalMemory.inline.hpp" #include "gc/z/zVirtualMemory.inline.hpp" @@ -52,6 +53,8 @@ assert_initialized(); } +ZPage::~ZPage() {} + void ZPage::assert_initialized() const { assert(!_virtual.is_null(), "Should not be null"); assert(!_physical.is_null(), "Should not be null"); diff -r 810409af12f1 -r f74ec3cbfcc0 src/hotspot/share/gc/z/zPage.hpp --- a/src/hotspot/share/gc/z/zPage.hpp Mon Oct 21 09:57:26 2019 +0200 +++ b/src/hotspot/share/gc/z/zPage.hpp Mon Oct 21 09:58:07 2019 +0200 @@ -56,6 +56,7 @@ public: ZPage(const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem); ZPage(uint8_t type, const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem); + ~ZPage(); uint32_t object_max_count() const; size_t object_alignment_shift() const;