annotate src/share/vm/runtime/virtualspace.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents bd02caa94611
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 656
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // ReservedSpace is a data structure for reserving a contiguous address range.
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class ReservedSpace VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
28 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
30 char* _base;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 size_t _size;
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
32 size_t _noaccess_prefix;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
33 size_t _alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 bool _special;
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
35 bool _executable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // ReservedSpace
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
38 ReservedSpace(char* base, size_t size, size_t alignment, bool special,
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
39 bool executable);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40 void initialize(size_t size, size_t alignment, bool large,
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
41 char* requested_address,
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
42 const size_t noaccess_prefix,
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
43 bool executable);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Release parts of an already-reserved memory region [addr, addr + len) to
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // get a new region that has "compound alignment." Return the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // resulting region, or NULL on failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // The region is logically divided into a prefix and a suffix. The prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // starts at the result address, which is aligned to prefix_align. The suffix
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // starts at result address + prefix_size, which is aligned to suffix_align.
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // The total size of the result region is size prefix_size + suffix_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 char* align_reserved_region(char* addr, const size_t len,
a61af66fc99e Initial load
duke
parents:
diff changeset
54 const size_t prefix_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const size_t prefix_align,
a61af66fc99e Initial load
duke
parents:
diff changeset
56 const size_t suffix_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
57 const size_t suffix_align);
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Reserve memory, call align_reserved_region() to alignment it and return the
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // result.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 char* reserve_and_align(const size_t reserve_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const size_t prefix_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 const size_t prefix_align,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 const size_t suffix_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 const size_t suffix_align);
a61af66fc99e Initial load
duke
parents:
diff changeset
66
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
67 protected:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
68 // Create protection page at the beginning of the space.
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
69 void protect_noaccess_prefix(const size_t size);
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
70
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
73 ReservedSpace(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 ReservedSpace(size_t size, size_t alignment, bool large,
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
75 char* requested_address = NULL,
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
76 const size_t noaccess_prefix = 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 ReservedSpace(const size_t prefix_size, const size_t prefix_align,
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
78 const size_t suffix_size, const size_t suffix_align,
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 337
diff changeset
79 char* requested_address,
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 337
diff changeset
80 const size_t noaccess_prefix = 0);
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
81 ReservedSpace(size_t size, size_t alignment, bool large, bool executable);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Accessors
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
84 char* base() const { return _base; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
85 size_t size() const { return _size; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
86 size_t alignment() const { return _alignment; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
87 bool special() const { return _special; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
88 bool executable() const { return _executable; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
89 size_t noaccess_prefix() const { return _noaccess_prefix; }
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
90 bool is_reserved() const { return _base != NULL; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 void release();
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Splitting
a61af66fc99e Initial load
duke
parents:
diff changeset
94 ReservedSpace first_part(size_t partition_size, size_t alignment,
a61af66fc99e Initial load
duke
parents:
diff changeset
95 bool split = false, bool realloc = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 ReservedSpace last_part (size_t partition_size, size_t alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // These simply call the above using the default alignment.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 inline ReservedSpace first_part(size_t partition_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 bool split = false, bool realloc = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 inline ReservedSpace last_part (size_t partition_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static size_t page_align_size_up(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 static size_t page_align_size_down(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static size_t allocation_align_size_up(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static size_t allocation_align_size_down(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 };
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 ReservedSpace
a61af66fc99e Initial load
duke
parents:
diff changeset
111 ReservedSpace::first_part(size_t partition_size, bool split, bool realloc)
a61af66fc99e Initial load
duke
parents:
diff changeset
112 {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 return first_part(partition_size, alignment(), split, realloc);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 ReservedSpace ReservedSpace::last_part(size_t partition_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
117 {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 return last_part(partition_size, alignment());
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
121 // Class encapsulating behavior specific of memory space reserved for Java heap
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
122 class ReservedHeapSpace : public ReservedSpace {
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
123 public:
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
124 // Constructor
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
125 ReservedHeapSpace(size_t size, size_t forced_base_alignment,
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
126 bool large, char* requested_address);
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
127 ReservedHeapSpace(const size_t prefix_size, const size_t prefix_align,
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 337
diff changeset
128 const size_t suffix_size, const size_t suffix_align,
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 337
diff changeset
129 char* requested_address);
237
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
130 };
1fdb98a17101 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 0
diff changeset
131
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
132 // Class encapsulating behavior specific memory space for Code
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
133 class ReservedCodeSpace : public ReservedSpace {
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
134 public:
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
135 // Constructor
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
136 ReservedCodeSpace(size_t r_size, size_t rs_align, bool large);
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
137 };
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
138
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // VirtualSpace is data structure for committing a previously reserved address range in smaller chunks.
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 class VirtualSpace VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Reserved area
a61af66fc99e Initial load
duke
parents:
diff changeset
145 char* _low_boundary;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 char* _high_boundary;
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Committed area
a61af66fc99e Initial load
duke
parents:
diff changeset
149 char* _low;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 char* _high;
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // The entire space has been committed and pinned in memory, no
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // os::commit_memory() or os::uncommit_memory().
a61af66fc99e Initial load
duke
parents:
diff changeset
154 bool _special;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
656
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
156 // Need to know if commit should be executable.
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
157 bool _executable;
6bdd6923ba16 6541756: Reduce executable C-heap
coleenp
parents: 642
diff changeset
158
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // MPSS Support
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Each virtualspace region has a lower, middle, and upper region.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Each region has an end boundary and a high pointer which is the
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // high water mark for the last allocated byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // The lower and upper unaligned to LargePageSizeInBytes uses default page.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // size. The middle region uses large page size.
a61af66fc99e Initial load
duke
parents:
diff changeset
165 char* _lower_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 char* _middle_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 char* _upper_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 char* _lower_high_boundary;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 char* _middle_high_boundary;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 char* _upper_high_boundary;
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 size_t _lower_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 size_t _middle_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 size_t _upper_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // MPSS Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
178 char* lower_high() const { return _lower_high; }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 char* middle_high() const { return _middle_high; }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 char* upper_high() const { return _upper_high; }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 char* lower_high_boundary() const { return _lower_high_boundary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 char* middle_high_boundary() const { return _middle_high_boundary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 char* upper_high_boundary() const { return _upper_high_boundary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 size_t lower_alignment() const { return _lower_alignment; }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 size_t middle_alignment() const { return _middle_alignment; }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 size_t upper_alignment() const { return _upper_alignment; }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Committed area
a61af66fc99e Initial load
duke
parents:
diff changeset
192 char* low() const { return _low; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 char* high() const { return _high; }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Reserved area
a61af66fc99e Initial load
duke
parents:
diff changeset
196 char* low_boundary() const { return _low_boundary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 char* high_boundary() const { return _high_boundary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 bool special() const { return _special; }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
203 VirtualSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 bool initialize(ReservedSpace rs, size_t committed_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Destruction
a61af66fc99e Initial load
duke
parents:
diff changeset
207 ~VirtualSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Testers (all sizes are byte sizes)
a61af66fc99e Initial load
duke
parents:
diff changeset
210 size_t committed_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 size_t reserved_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 size_t uncommitted_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 bool contains(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Operations
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // returns true on success, false otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
217 bool expand_by(size_t bytes, bool pre_touch = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void release();
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 void check_for_contiguity() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void print() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 };