OpenJDK / amber / amber
changeset 10359:2eff81585f6b
7068328: BufferPoolMXBean and PlatformLoggingMXBean getObjectName may return null
Reviewed-by: alanb
Contributed-by: spoole@uk.ibm.com
author | mchung |
---|---|
date | Tue, 23 Aug 2011 10:35:50 -0700 |
parents | 5a4ec0a5f7ee |
children | d1a6fafde2fa |
files | jdk/src/share/classes/sun/management/ManagementFactoryHelper.java jdk/test/java/lang/management/ManagementFactory/GetObjectName.java |
diffstat | 2 files changed, 79 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/share/classes/sun/management/ManagementFactoryHelper.java Mon Aug 22 18:21:43 2011 -0700 +++ b/jdk/src/share/classes/sun/management/ManagementFactoryHelper.java Tue Aug 23 10:35:50 2011 -0700 @@ -171,7 +171,8 @@ ObjectName result = objname; if (result == null) { synchronized (this) { - if (objname == null) { + result = objname; + if (result == null) { result = Util.newObjectName(LOGGING_MXBEAN_NAME); objname = result; } @@ -228,7 +229,8 @@ ObjectName result = objname; if (result == null) { synchronized (this) { - if (objname == null) { + result = objname; + if (result == null) { result = Util.newObjectName(BUFFER_POOL_MXBEAN_NAME + ",name=" + pool.getName()); objname = result;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/GetObjectName.java Tue Aug 23 10:35:50 2011 -0700 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 7068328 + * @summary Test if getObjectName handles properly when called by + * multiple threads simultaneously. Run in othervm mode to + * make sure the object name is not initialized to begin with. + * @run main/othervm GetObjectName + */ + +import java.lang.management.BufferPoolMXBean; +import java.lang.management.ManagementFactory; +import java.lang.management.PlatformLoggingMXBean; +import java.lang.management.PlatformManagedObject; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +public class GetObjectName { + private static boolean failed = false; + public static void main(String[] args) throws Exception { + int tasks = 10000; + ExecutorService executor = Executors.newFixedThreadPool(10); + submitTasks(executor, tasks); + executor.shutdown(); + executor.awaitTermination(10, TimeUnit.SECONDS); + if (!failed) { + System.out.println("Test passed."); + } + } + + static void submitTasks(ExecutorService executor, int count) { + for (int i=0; i < count && !failed; i++) { + executor.execute(new Runnable() { + @Override + public void run() { + List<PlatformManagedObject> mbeans = new ArrayList<>(); + mbeans.add(ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class)); + mbeans.addAll(ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class)); + for (PlatformManagedObject pmo : mbeans) { + // Name should not be null + if (pmo.getObjectName() == null) { + failed = true; + throw new RuntimeException("TEST FAILED: getObjectName() returns null"); + } + } + } + }); + } + } +}