Mercurial > hg > graal-jvmci-8
view src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp @ 1358:72f725c5a7be
6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
Summary: Calling the methods region_stack_push() and region_stack_pop() concurrent is not MT-safe. The assumption is that we will only call region_stack_push() during a GC pause and region_stack_pop() during marking. Unfortunately, we also call region_stack_push() during marking which seems to be introducing subtle marking failures. This change introduces lock-based methods for pushing / popping to be called during marking.
Reviewed-by: iveresov, johnc
author | tonyp |
---|---|
date | Mon, 05 Apr 2010 12:19:22 -0400 |
parents | 37f87013dfd8 |
children | c18cbe5936b8 |
line wrap: on
line source
/* * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. * */ inline HeapRegion* HeapRegionSeq::addr_to_region(const void* addr) { assert(_seq_bottom != NULL, "bad _seq_bottom in addr_to_region"); if ((char*) addr >= _seq_bottom) { size_t diff = (size_t) pointer_delta((HeapWord*) addr, (HeapWord*) _seq_bottom); int index = (int) (diff >> HeapRegion::LogOfHRGrainWords); assert(index >= 0, "invariant / paranoia"); if (index < _regions.length()) { HeapRegion* hr = _regions.at(index); assert(hr->is_in_reserved(addr), "addr_to_region is wrong..."); return hr; } } return NULL; }