1 /* |
1 /* |
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
23 */ |
23 */ |
24 |
24 |
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |
27 |
27 |
|
28 #include "gc_implementation/g1/heapRegion.hpp" |
28 #include "gc_implementation/g1/heapRegionSeq.hpp" |
29 #include "gc_implementation/g1/heapRegionSeq.hpp" |
29 |
30 |
30 inline HeapRegion* HeapRegionSeq::addr_to_region(const void* addr) { |
31 inline size_t HeapRegionSeq::addr_to_index_biased(HeapWord* addr) const { |
31 assert(_seq_bottom != NULL, "bad _seq_bottom in addr_to_region"); |
32 assert(_heap_bottom <= addr && addr < _heap_end, |
32 if ((char*) addr >= _seq_bottom) { |
33 err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT" end: "PTR_FORMAT, |
33 size_t diff = (size_t) pointer_delta((HeapWord*) addr, |
34 addr, _heap_bottom, _heap_end)); |
34 (HeapWord*) _seq_bottom); |
35 size_t index = (size_t) addr >> _region_shift; |
35 int index = (int) (diff >> HeapRegion::LogOfHRGrainWords); |
36 return index; |
36 assert(index >= 0, "invariant / paranoia"); |
37 } |
37 if (index < _regions.length()) { |
38 |
38 HeapRegion* hr = _regions.at(index); |
39 inline HeapRegion* HeapRegionSeq::addr_to_region_unsafe(HeapWord* addr) const { |
39 assert(hr->is_in_reserved(addr), |
40 assert(_heap_bottom <= addr && addr < _heap_end, |
40 "addr_to_region is wrong..."); |
41 err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT" end: "PTR_FORMAT, |
41 return hr; |
42 addr, _heap_bottom, _heap_end)); |
42 } |
43 size_t index_biased = addr_to_index_biased(addr); |
|
44 HeapRegion* hr = _regions_biased[index_biased]; |
|
45 assert(hr != NULL, "invariant"); |
|
46 return hr; |
|
47 } |
|
48 |
|
49 inline HeapRegion* HeapRegionSeq::addr_to_region(HeapWord* addr) const { |
|
50 if (addr != NULL && addr < _heap_end) { |
|
51 assert(addr >= _heap_bottom, |
|
52 err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT, addr, _heap_bottom)); |
|
53 return addr_to_region_unsafe(addr); |
43 } |
54 } |
44 return NULL; |
55 return NULL; |
45 } |
56 } |
46 |
57 |
|
58 inline HeapRegion* HeapRegionSeq::at(size_t index) const { |
|
59 assert(index < length(), "pre-condition"); |
|
60 HeapRegion* hr = _regions[index]; |
|
61 assert(hr != NULL, "sanity"); |
|
62 assert(hr->hrs_index() == index, "sanity"); |
|
63 return hr; |
|
64 } |
|
65 |
47 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |
66 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_INLINE_HPP |