Mercurial > hg > truffle
view agent/src/share/classes/sun/jvm/hotspot/RMIHelper.java @ 441:da9cb4e97a5f
6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
6660573: G1: BigApps Failure : guarantee(satb_mq_set.completed_buffers_num() == 0,"invariant")
Summary: When exiting a mutator thread is removed from the thread list before it has a chance to flush its SATB and barrier queues. If GC happens at this moment the objects that are refererred from these queues can be moved, which will case a crash. The fix is simply to flush the buffers before removing a thread from the list.
Reviewed-by: jcoomes, tonyp
author | iveresov |
---|---|
date | Fri, 14 Nov 2008 14:23:05 -0800 |
parents | a61af66fc99e |
children | c18cbe5936b8 |
line wrap: on
line source
/* * Copyright 2004 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. * */ package sun.jvm.hotspot; import java.io.*; import java.net.*; import java.rmi.*; import java.rmi.registry.*; import sun.jvm.hotspot.debugger.DebuggerException; public class RMIHelper { private static final boolean startRegistry; private static int port; private static String serverNamePrefix; static { String tmp = System.getProperty("sun.jvm.hotspot.rmi.startRegistry"); if (tmp != null && tmp.equals("false")) { startRegistry = false; } else { // by default, we attempt to start rmiregistry startRegistry = true; } port = Registry.REGISTRY_PORT; tmp = System.getProperty("sun.jvm.hotspot.rmi.port"); if (tmp != null) { try { port = Integer.parseInt(tmp); } catch (NumberFormatException nfe) { System.err.println("invalid port supplied, assuming default"); } } tmp = System.getProperty("sun.jvm.hotspot.rmi.serverNamePrefix"); serverNamePrefix = (tmp != null)? serverNamePrefix : "SARemoteDebugger"; } public static void rebind(String uniqueID, Remote object) throws DebuggerException { String name = getName(uniqueID); try { Naming.rebind(name, object); } catch (RemoteException re) { if (startRegistry) { // may be the user didn't start rmiregistry, try to start it try { LocateRegistry.createRegistry(port); Naming.rebind(name, object); } catch (Exception exp) { throw new DebuggerException(exp); } } else { throw new DebuggerException(re); } } catch (Exception exp) { throw new DebuggerException(exp); } } public static void unbind(String uniqueID) throws DebuggerException { String name = getName(uniqueID); try { Naming.unbind(name); } catch (Exception exp) { throw new DebuggerException(exp); } } public static Remote lookup(String debugServerID) throws DebuggerException { // debugServerID follows the pattern [unique_id@]host[:port] // we have to transform this as //host[:port]/<serverNamePrefix>['_'<unique_id>] int index = debugServerID.indexOf('@'); StringBuffer nameBuf = new StringBuffer("//"); String uniqueID = null; if (index != -1) { nameBuf.append(debugServerID.substring(index + 1)); uniqueID = debugServerID.substring(0, index); } else { nameBuf.append(debugServerID); } nameBuf.append('/'); nameBuf.append(serverNamePrefix); if (uniqueID != null) { nameBuf.append('_'); nameBuf.append(uniqueID); } try { return Naming.lookup(nameBuf.toString()); } catch (Exception exp) { throw new DebuggerException(exp); } } private static String getName(String uniqueID) { String name = null; if (uniqueID != null) { name = serverNamePrefix + "_" + uniqueID; } else { name = serverNamePrefix; } if (port != Registry.REGISTRY_PORT) { name = "//localhost:" + port + "/" + name; } return name; } }