annotate src/share/vm/utilities/linkedlist.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 833b0f92429a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
1 /*
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
4 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
8 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
13 * accompanied this code).
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
14 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
18 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
21 * questions.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
22 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
23 */
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
24
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
25 #ifndef SHARE_VM_UTILITIES_LINKED_LIST_HPP
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
26 #define SHARE_VM_UTILITIES_LINKED_LIST_HPP
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
27
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
28 #include "memory/allocation.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
29
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
30 /*
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
31 * The implementation of a generic linked list, which uses various
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
32 * backing storages, such as C heap, arena and resource, etc.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
33 */
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
34
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
35
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
36 // An entry in a linked list. It should use the same backing storage
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
37 // as the linked list that contains this entry.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
38 template <class E> class LinkedListNode : public ResourceObj {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
39 private:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
40 E _data; // embedded content
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
41 LinkedListNode<E>* _next; // next entry
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
42
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
43 protected:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
44 LinkedListNode() : _next(NULL) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
45
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
46 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
47 LinkedListNode(const E& e): _data(e), _next(NULL) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
48
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
49 inline void set_next(LinkedListNode<E>* node) { _next = node; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
50 inline LinkedListNode<E> * next() const { return _next; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
51
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
52 E* data() { return &_data; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
53 const E* peek() const { return &_data; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
54 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
55
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
56 // A linked list interface. It does not specify
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
57 // any storage type it uses, so all methods involving
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
58 // memory allocation or deallocation are pure virtual
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
59 template <class E> class LinkedList : public ResourceObj {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
60 protected:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
61 LinkedListNode<E>* _head;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
62
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
63 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
64 LinkedList() : _head(NULL) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
65
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
66 inline void set_head(LinkedListNode<E>* h) { _head = h; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
67 inline LinkedListNode<E>* head() const { return _head; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
68 inline bool is_empty() const { return head() == NULL; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
69
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
70 inline size_t size() const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
71 LinkedListNode<E>* p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
72 size_t count = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
73 for (p = head(); p != NULL; count++, p = p->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
74 return count;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
75 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
76
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
77 // Move all entries from specified linked list to this one
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
78 virtual void move(LinkedList<E>* list) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
79
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
80 // Add an entry to this linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
81 virtual LinkedListNode<E>* add(const E& e) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
82 // Add all entries from specified linked list to this one,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
83 virtual void add(LinkedListNode<E>* node) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
84
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
85 // Add a linked list to this linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
86 virtual bool add(const LinkedList<E>* list) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
87
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
88 // Search entry in the linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
89 virtual LinkedListNode<E>* find_node(const E& e) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
90 virtual E* find(const E& e) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
91
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
92 // Insert entry to the linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
93 virtual LinkedListNode<E>* insert_before(const E& e, LinkedListNode<E>* ref) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
94 virtual LinkedListNode<E>* insert_after (const E& e, LinkedListNode<E>* ref) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
95
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
96 // Remove entry from the linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
97 virtual bool remove(const E& e) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
98 virtual bool remove(LinkedListNode<E>* node) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
99 virtual bool remove_before(LinkedListNode<E>* ref) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
100 virtual bool remove_after(LinkedListNode<E>* ref) = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
101
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
102 LinkedListNode<E>* unlink_head() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
103 LinkedListNode<E>* h = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
104 if (h != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
105 this->set_head(h->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
106 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
107 return h;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
108 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
109
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
110 DEBUG_ONLY(virtual ResourceObj::allocation_type storage_type() = 0;)
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
111 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
112
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
113 // A linked list implementation.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
114 // The linked list can be allocated in various type of memory: C heap, arena and resource area, etc.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
115 template <class E, ResourceObj::allocation_type T = ResourceObj::C_HEAP,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
116 MEMFLAGS F = mtNMT, AllocFailType alloc_failmode = AllocFailStrategy::RETURN_NULL>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
117 class LinkedListImpl : public LinkedList<E> {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
118 protected:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
119 Arena* _arena;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
120 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
121 LinkedListImpl() : _arena(NULL) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
122 LinkedListImpl(Arena* a) : _arena(a) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
123
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
124 virtual ~LinkedListImpl() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
125 clear();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
126 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
127
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
128 virtual void clear() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
129 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
130 this->set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
131 while (p != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
132 LinkedListNode<E>* to_delete = p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
133 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
134 delete_node(to_delete);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
135 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
136 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
137
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
138 // Add an entry to the linked list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
139 virtual LinkedListNode<E>* add(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
140 LinkedListNode<E>* node = this->new_node(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
141 if (node != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
142 this->add(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
143 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
144
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
145 return node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
146 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
147
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
148 virtual void add(LinkedListNode<E>* node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
149 assert(node != NULL, "NULL pointer");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
150 node->set_next(this->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
151 this->set_head(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
152 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
153
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
154 // Move a linked list to this linked list, both have to be allocated on the same
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
155 // storage type.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
156 virtual void move(LinkedList<E>* list) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
157 assert(list->storage_type() == this->storage_type(), "Different storage type");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
158 LinkedListNode<E>* node = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
159 while (node != NULL && node->next() != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
160 node = node->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
161 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
162 if (node == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
163 this->set_head(list->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
164 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
165 node->set_next(list->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
166 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
167 // All entries are moved
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
168 list->set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
169 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
170
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
171 virtual bool add(const LinkedList<E>* list) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
172 LinkedListNode<E>* node = list->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
173 while (node != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
174 if (this->add(*node->peek()) == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
175 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
176 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
177 node = node->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
178 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
179 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
180 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
181
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
182
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
183 virtual LinkedListNode<E>* find_node(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
184 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
185 while (p != NULL && !p->peek()->equals(e)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
186 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
187 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
188 return p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
189 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
190
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
191 E* find(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
192 LinkedListNode<E>* node = find_node(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
193 return (node == NULL) ? NULL : node->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
194 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
195
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
196
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
197 // Add an entry in front of the reference entry
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
198 LinkedListNode<E>* insert_before(const E& e, LinkedListNode<E>* ref_node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
199 LinkedListNode<E>* node = this->new_node(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
200 if (node == NULL) return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
201 if (ref_node == this->head()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
202 node->set_next(ref_node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
203 this->set_head(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
204 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
205 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
206 while (p != NULL && p->next() != ref_node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
207 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
208 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
209 assert(p != NULL, "ref_node not in the list");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
210 node->set_next(ref_node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
211 p->set_next(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
212 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
213 return node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
214 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
215
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
216 // Add an entry behind the reference entry
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
217 LinkedListNode<E>* insert_after(const E& e, LinkedListNode<E>* ref_node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
218 LinkedListNode<E>* node = this->new_node(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
219 if (node == NULL) return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
220 node->set_next(ref_node->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
221 ref_node->set_next(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
222 return node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
223 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
224
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
225 // Remove an entry from the linked list.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
226 // Return true if the entry is successfully removed
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
227 virtual bool remove(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
228 LinkedListNode<E>* tmp = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
229 LinkedListNode<E>* prev = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
230
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
231 while (tmp != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
232 if (tmp->peek()->equals(e)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
233 return remove_after(prev);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
234 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
235 prev = tmp;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
236 tmp = tmp->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
237 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
238 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
239 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
240
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
241 // Remove the node after the reference entry
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
242 virtual bool remove_after(LinkedListNode<E>* prev) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
243 LinkedListNode<E>* to_delete;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
244 if (prev == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
245 to_delete = this->unlink_head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
246 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
247 to_delete = prev->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
248 if (to_delete != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
249 prev->set_next(to_delete->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
250 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
251 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
252
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
253 if (to_delete != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
254 delete_node(to_delete);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
255 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
256 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
257 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
258 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
259
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
260 virtual bool remove(LinkedListNode<E>* node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
261 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
262 while (p != NULL && p->next() != node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
263 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
264 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
265 if (p != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
266 p->set_next(node->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
267 delete_node(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
268 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
269 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
270 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
271 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
272 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
273
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
274 virtual bool remove_before(LinkedListNode<E>* ref) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
275 assert(ref != NULL, "NULL pointer");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
276 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
277 LinkedListNode<E>* to_delete = NULL; // to be deleted
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
278 LinkedListNode<E>* prev = NULL; // node before the node to be deleted
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
279 while (p != NULL && p != ref) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
280 prev = to_delete;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
281 to_delete = p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
282 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
283 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
284 if (p == NULL || to_delete == NULL) return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
285 assert(to_delete->next() == ref, "Wrong node to delete");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
286 assert(prev == NULL || prev->next() == to_delete,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
287 "Sanity check");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
288 if (prev == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
289 assert(to_delete == this->head(), "Must be head");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
290 this->set_head(to_delete->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
291 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
292 prev->set_next(to_delete->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
293 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
294 delete_node(to_delete);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
295 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
296 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
297
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
298 DEBUG_ONLY(ResourceObj::allocation_type storage_type() { return T; })
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
299 protected:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
300 // Create new linked list node object in specified storage
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
301 LinkedListNode<E>* new_node(const E& e) const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
302 switch(T) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
303 case ResourceObj::ARENA: {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
304 assert(_arena != NULL, "Arena not set");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
305 return new(_arena) LinkedListNode<E>(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
306 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
307 case ResourceObj::RESOURCE_AREA:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
308 case ResourceObj::C_HEAP: {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
309 if (alloc_failmode == AllocFailStrategy::RETURN_NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
310 return new(std::nothrow, T, F) LinkedListNode<E>(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
311 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
312 return new(T, F) LinkedListNode<E>(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
313 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
314 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
315 default:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
316 ShouldNotReachHere();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
317 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
318 return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
319 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
320
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
321 // Delete linked list node object
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
322 void delete_node(LinkedListNode<E>* node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
323 if (T == ResourceObj::C_HEAP) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
324 delete node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
325 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
326 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
327 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
328
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
329 // Sorted linked list. The linked list maintains sorting order specified by the comparison
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
330 // function
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
331 template <class E, int (*FUNC)(const E&, const E&),
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
332 ResourceObj::allocation_type T = ResourceObj::C_HEAP,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
333 MEMFLAGS F = mtNMT, AllocFailType alloc_failmode = AllocFailStrategy::RETURN_NULL>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
334 class SortedLinkedList : public LinkedListImpl<E, T, F, alloc_failmode> {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
335 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
336 SortedLinkedList() { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
337 SortedLinkedList(Arena* a) : LinkedListImpl<E, T, F, alloc_failmode>(a) { }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
338
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
339 virtual LinkedListNode<E>* add(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
340 return LinkedListImpl<E, T, F, alloc_failmode>::add(e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
341 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
342
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
343 virtual void move(LinkedList<E>* list) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
344 assert(list->storage_type() == this->storage_type(), "Different storage type");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
345 LinkedListNode<E>* node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
346 while ((node = list->unlink_head()) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
347 this->add(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
348 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
349 assert(list->is_empty(), "All entries are moved");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
350 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
351
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
352 virtual void add(LinkedListNode<E>* node) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
353 assert(node != NULL, "NULL pointer");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
354 LinkedListNode<E>* tmp = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
355 LinkedListNode<E>* prev = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
356
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
357 int cmp_val;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
358 while (tmp != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
359 cmp_val = FUNC(*tmp->peek(), *node->peek());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
360 if (cmp_val >= 0) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
361 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
362 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
363 prev = tmp;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
364 tmp = tmp->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
365 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
366
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
367 if (prev != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
368 node->set_next(prev->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
369 prev->set_next(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
370 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
371 node->set_next(this->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
372 this->set_head(node);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
373 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
374 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
375
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
376 virtual bool add(const LinkedList<E>* list) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
377 return LinkedListImpl<E, T, F, alloc_failmode>::add(list);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
378 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
379
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
380 virtual LinkedListNode<E>* find_node(const E& e) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
381 LinkedListNode<E>* p = this->head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
382
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
383 while (p != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
384 int comp_val = FUNC(*p->peek(), e);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
385 if (comp_val == 0) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
386 return p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
387 } else if (comp_val > 0) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
388 return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
389 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
390 p = p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
391 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
392 return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
393 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
394 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
395
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
396 // Iterates all entries in the list
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
397 template <class E> class LinkedListIterator : public StackObj {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
398 private:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
399 LinkedListNode<E>* _p;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
400 bool _is_empty;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
401 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
402 LinkedListIterator(LinkedListNode<E>* head) : _p(head) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
403 _is_empty = (head == NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
404 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
405
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
406 bool is_empty() const { return _is_empty; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
407
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
408 const E* next() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
409 if (_p == NULL) return NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
410 const E* e = _p->peek();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
411 _p = _p->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
412 return e;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
413 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
414 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
415
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
416 #endif