annotate src/share/vm/utilities/stack.hpp @ 8804:91bf0bdae37b

8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
author coleenp
date Wed, 20 Mar 2013 08:04:54 -0400
parents b9a9ed0f8eeb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
1 /*
6842
b9a9ed0f8eeb 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 6197
diff changeset
2 * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
4 *
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
7 * published by the Free Software Foundation.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
8 *
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
13 * accompanied this code).
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
14 *
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
18 *
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
21 * questions.
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
22 *
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
23 */
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
25 #ifndef SHARE_VM_UTILITIES_STACK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
26 #define SHARE_VM_UTILITIES_STACK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
27
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
28 #include "memory/allocation.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
29 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
30
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
31 // Class Stack (below) grows and shrinks by linking together "segments" which
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
32 // are allocated on demand. Segments are arrays of the element type (E) plus an
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
33 // extra pointer-sized field to store the segment link. Recently emptied
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
34 // segments are kept in a cache and reused.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
35 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
36 // Notes/caveats:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
37 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
38 // The size of an element must either evenly divide the size of a pointer or be
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
39 // a multiple of the size of a pointer.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
40 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
41 // Destructors are not called for elements popped off the stack, so element
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
42 // types which rely on destructors for things like reference counting will not
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
43 // work properly.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
44 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
45 // Class Stack allocates segments from the C heap. However, two protected
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
46 // virtual methods are used to alloc/free memory which subclasses can override:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
47 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
48 // virtual void* alloc(size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
49 // virtual void free(void* addr, size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
50 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
51 // The alloc() method must return storage aligned for any use. The
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
52 // implementation in class Stack assumes that alloc() will terminate the process
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
53 // if the allocation fails.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
54
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
55 template <class E, MEMFLAGS F> class StackIterator;
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
56
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
57 // StackBase holds common data/methods that don't depend on the element type,
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
58 // factored out to reduce template code duplication.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
59 template <MEMFLAGS F> class StackBase
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
60 {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
61 public:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
62 size_t segment_size() const { return _seg_size; } // Elements per segment.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
63 size_t max_size() const { return _max_size; } // Max elements allowed.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
64 size_t max_cache_size() const { return _max_cache_size; } // Max segments
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
65 // allowed in cache.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
66
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
67 size_t cache_size() const { return _cache_size; } // Segments in the cache.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
68
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
69 protected:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
70 // The ctor arguments correspond to the like-named functions above.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
71 // segment_size: number of items per segment
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
72 // max_cache_size: maxmium number of *segments* to cache
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
73 // max_size: maximum number of items allowed, rounded to a multiple of
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
74 // the segment size (0 == unlimited)
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
75 inline StackBase(size_t segment_size, size_t max_cache_size, size_t max_size);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
76
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
77 // Round max_size to a multiple of the segment size. Treat 0 as unlimited.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
78 static inline size_t adjust_max_size(size_t max_size, size_t seg_size);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
79
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
80 protected:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
81 const size_t _seg_size; // Number of items per segment.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
82 const size_t _max_size; // Maximum number of items allowed in the stack.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
83 const size_t _max_cache_size; // Maximum number of segments to cache.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
84 size_t _cur_seg_size; // Number of items in the current segment.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
85 size_t _full_seg_size; // Number of items in already-filled segments.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
86 size_t _cache_size; // Number of segments in the cache.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
87 };
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
88
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
89 #ifdef __GNUC__
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
90 #define inline
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
91 #endif // __GNUC__
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
92
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
93 template <class E, MEMFLAGS F>
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
94 class Stack: public StackBase<F>
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
95 {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
96 public:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
97 friend class StackIterator<E, F>;
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
98
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
99 // segment_size: number of items per segment
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
100 // max_cache_size: maxmium number of *segments* to cache
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
101 // max_size: maximum number of items allowed, rounded to a multiple of
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
102 // the segment size (0 == unlimited)
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
103 inline Stack(size_t segment_size = default_segment_size(),
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
104 size_t max_cache_size = 4, size_t max_size = 0);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
105 inline ~Stack() { clear(true); }
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
106
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
107 inline bool is_empty() const { return this->_cur_seg == NULL; }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
108 inline bool is_full() const { return this->_full_seg_size >= this->max_size(); }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
109
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
110 // Performance sensitive code should use is_empty() instead of size() == 0 and
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
111 // is_full() instead of size() == max_size(). Using a conditional here allows
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
112 // just one var to be updated when pushing/popping elements instead of two;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
113 // _full_seg_size is updated only when pushing/popping segments.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
114 inline size_t size() const {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
115 return is_empty() ? 0 : this->_full_seg_size + this->_cur_seg_size;
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
116 }
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
117
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
118 inline void push(E elem);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
119 inline E pop();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
120
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
121 // Clear everything from the stack, releasing the associated memory. If
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
122 // clear_cache is true, also release any cached segments.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
123 void clear(bool clear_cache = false);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
124
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
125 static inline size_t default_segment_size();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
126
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
127 protected:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
128 // Each segment includes space for _seg_size elements followed by a link
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
129 // (pointer) to the previous segment; the space is allocated as a single block
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
130 // of size segment_bytes(). _seg_size is rounded up if necessary so the link
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
131 // is properly aligned. The C struct for the layout would be:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
132 //
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
133 // struct segment {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
134 // E elements[_seg_size];
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
135 // E* link;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
136 // };
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
137
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
138 // Round up seg_size to keep the link field aligned.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
139 static inline size_t adjust_segment_size(size_t seg_size);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
140
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
141 // Methods for allocation size and getting/setting the link.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
142 inline size_t link_offset() const; // Byte offset of link field.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
143 inline size_t segment_bytes() const; // Segment size in bytes.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
144 inline E** link_addr(E* seg) const; // Address of the link field.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
145 inline E* get_link(E* seg) const; // Extract the link from seg.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
146 inline E* set_link(E* new_seg, E* old_seg); // new_seg.link = old_seg.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
147
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
148 virtual E* alloc(size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
149 virtual void free(E* addr, size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
150
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
151 void push_segment();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
152 void pop_segment();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
153
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
154 void free_segments(E* seg); // Free all segments in the list.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
155 inline void reset(bool reset_cache); // Reset all data fields.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
156
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
157 DEBUG_ONLY(void verify(bool at_empty_transition) const;)
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
158 DEBUG_ONLY(void zap_segment(E* seg, bool zap_link_field) const;)
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
159
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
160 private:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
161 E* _cur_seg; // Current segment.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
162 E* _cache; // Segment cache to avoid ping-ponging.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
163 };
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
164
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
165 template <class E, MEMFLAGS F> class ResourceStack: public Stack<E, F>, public ResourceObj
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
166 {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
167 public:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
168 // If this class becomes widely used, it may make sense to save the Thread
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
169 // and use it when allocating segments.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
170 // ResourceStack(size_t segment_size = Stack<E, F>::default_segment_size()):
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
171 ResourceStack(size_t segment_size): Stack<E, F>(segment_size, max_uintx)
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
172 { }
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
173
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
174 // Set the segment pointers to NULL so the parent dtor does not free them;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
175 // that must be done by the ResourceMark code.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
176 ~ResourceStack() { Stack<E, F>::reset(true); }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
177
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
178 protected:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
179 virtual E* alloc(size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
180 virtual void free(E* addr, size_t bytes);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
181
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
182 private:
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
183 void clear(bool clear_cache = false);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
184 };
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
185
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
186 template <class E, MEMFLAGS F>
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
187 class StackIterator: public StackObj
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
188 {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
189 public:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
190 StackIterator(Stack<E, F>& stack): _stack(stack) { sync(); }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
191
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
192 Stack<E, F>& stack() const { return _stack; }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
193
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
194 bool is_empty() const { return _cur_seg == NULL; }
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
195
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
196 E next() { return *next_addr(); }
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
197 E* next_addr();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
198
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
199 void sync(); // Sync the iterator's state to the stack's current state.
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
200
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
201 private:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
202 Stack<E, F>& _stack;
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
203 size_t _cur_seg_size;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
204 E* _cur_seg;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
205 size_t _full_seg_size;
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
206 };
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
207
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
208 #ifdef __GNUC__
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
209 #undef inline
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents:
diff changeset
210 #endif // __GNUC__
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
211
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
212 #endif // SHARE_VM_UTILITIES_STACK_HPP