提交 c9fd19ad 编写于 作者: R robm

Merge

...@@ -109,6 +109,7 @@ final class ScreenMenu extends Menu ...@@ -109,6 +109,7 @@ final class ScreenMenu extends Menu
final Component[] items = fInvoker.getMenuComponents(); final Component[] items = fInvoker.getMenuComponents();
if (needsUpdate(items, childHashArray)) { if (needsUpdate(items, childHashArray)) {
removeAll(); removeAll();
fItems.clear();
if (count <= 0) return; if (count <= 0) return;
childHashArray = new int[count]; childHashArray = new int[count];
...@@ -232,7 +233,7 @@ final class ScreenMenu extends Menu ...@@ -232,7 +233,7 @@ final class ScreenMenu extends Menu
synchronized (getTreeLock()) { synchronized (getTreeLock()) {
super.addNotify(); super.addNotify();
if (fModelPtr == 0) { if (fModelPtr == 0) {
fInvoker.addContainerListener(this); fInvoker.getPopupMenu().addContainerListener(this);
fInvoker.addComponentListener(this); fInvoker.addComponentListener(this);
fPropertyListener = new ScreenMenuPropertyListener(this); fPropertyListener = new ScreenMenuPropertyListener(this);
fInvoker.addPropertyChangeListener(fPropertyListener); fInvoker.addPropertyChangeListener(fPropertyListener);
...@@ -266,7 +267,7 @@ final class ScreenMenu extends Menu ...@@ -266,7 +267,7 @@ final class ScreenMenu extends Menu
if (fModelPtr != 0) { if (fModelPtr != 0) {
removeMenuListeners(fModelPtr); removeMenuListeners(fModelPtr);
fModelPtr = 0; fModelPtr = 0;
fInvoker.removeContainerListener(this); fInvoker.getPopupMenu().removeContainerListener(this);
fInvoker.removeComponentListener(this); fInvoker.removeComponentListener(this);
fInvoker.removePropertyChangeListener(fPropertyListener); fInvoker.removePropertyChangeListener(fPropertyListener);
} }
...@@ -287,11 +288,10 @@ final class ScreenMenu extends Menu ...@@ -287,11 +288,10 @@ final class ScreenMenu extends Menu
@Override @Override
public void componentRemoved(final ContainerEvent e) { public void componentRemoved(final ContainerEvent e) {
final Component child = e.getChild(); final Component child = e.getChild();
final MenuItem sm = fItems.get(child); final MenuItem sm = fItems.remove(child);
if (sm == null) return; if (sm == null) return;
remove(sm); remove(sm);
fItems.remove(sm);
} }
/** /**
......
...@@ -147,8 +147,7 @@ public class CDataTransferer extends DataTransferer { ...@@ -147,8 +147,7 @@ public class CDataTransferer extends DataTransferer {
String separator = System.getProperty("line.separator"); String separator = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if(strings.length > 0) { if(strings.length > 0) {
sb.append(strings[0]); for(int i = 0; i < strings.length; i++) {
for(int i = 1; i < strings.length; i++) {
sb.append(strings[i]); sb.append(strings[i]);
sb.append(separator); sb.append(separator);
} }
......
...@@ -322,19 +322,6 @@ class LinuxWatchService ...@@ -322,19 +322,6 @@ class LinuxWatchService
bytesRead = 0; bytesRead = 0;
} }
// process any pending requests
if ((nReady > 1) || (nReady == 1 && bytesRead == 0)) {
try {
read(socketpair[0], address, BUFFER_SIZE);
boolean shutdown = processRequests();
if (shutdown)
break;
} catch (UnixException x) {
if (x.errno() != UnixConstants.EAGAIN)
throw x;
}
}
// iterate over buffer to decode events // iterate over buffer to decode events
int offset = 0; int offset = 0;
while (offset < bytesRead) { while (offset < bytesRead) {
...@@ -369,6 +356,19 @@ class LinuxWatchService ...@@ -369,6 +356,19 @@ class LinuxWatchService
offset += (SIZEOF_INOTIFY_EVENT + len); offset += (SIZEOF_INOTIFY_EVENT + len);
} }
// process any pending requests
if ((nReady > 1) || (nReady == 1 && bytesRead == 0)) {
try {
read(socketpair[0], address, BUFFER_SIZE);
boolean shutdown = processRequests();
if (shutdown)
break;
} catch (UnixException x) {
if (x.errno() != UnixConstants.EAGAIN)
throw x;
}
}
} }
} catch (UnixException x) { } catch (UnixException x) {
x.printStackTrace(); x.printStackTrace();
......
/*
* Copyright (c) 2016 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 8158325
* @summary Memory leak in com.apple.laf.ScreenMenu: removed JMenuItems are still referenced
* @requires (os.family == "mac")
* @run main/timeout=300/othervm -Xmx16m ScreenMenuMemoryLeakTest
*/
import java.awt.EventQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.util.Objects;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.WindowConstants;
public class ScreenMenuMemoryLeakTest {
private static byte[] sBytes;
private static WeakReference<JMenuItem> sMenuItem;
private static JFrame sFrame;
private static JMenu sMenu;
public static void main(String[] args) throws InvocationTargetException, InterruptedException {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
System.setProperty("apple.laf.useScreenMenuBar", "true");
showUI();
}
});
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
removeMenuItemFromMenu();
}
});
System.gc();
System.runFinalization();
JMenuItem menuItem = sMenuItem.get();
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
sFrame.dispose();
}
});
if (menuItem != null) {
throw new RuntimeException("The menu item should have been GC-ed");
}
}
private static void showUI() {
sFrame = new JFrame();
sFrame.add(new JLabel("Some dummy content"));
JMenuBar menuBar = new JMenuBar();
sMenu = new JMenu("Menu");
JMenuItem item = new JMenuItem("Item");
sMenu.add(item);
sMenuItem = new WeakReference<>(item);
menuBar.add(sMenu);
sFrame.setJMenuBar(menuBar);
sFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
sFrame.pack();
sFrame.setVisible(true);
}
private static void removeMenuItemFromMenu() {
JMenuItem menuItem = sMenuItem.get();
Objects.requireNonNull(menuItem, "The menu item should still be available at this point");
sMenu.remove(menuItem);
}
}
\ No newline at end of file
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
/* /*
@test @test
@bug 8081787 8136763 @bug 8081787 8136763 8160941
@author Mikhail Cherkasov @author Mikhail Cherkasov
@run main/manual MacOsXFileAndMultipleFileCopingTest @run main/manual MacOsXFileAndMultipleFileCopingTest
*/ */
......
/*
* Copyright (c) 2015, 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 8145981
* @summary LinuxWatchService sometimes reports inotify events against wrong directory
* @run main UpdateInterference
*/
import java.io.IOException;
import java.nio.file.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static java.nio.file.StandardWatchEventKinds.*;
public class UpdateInterference {
public static void main(String[] args) throws IOException, InterruptedException {
final Path root = Files.createTempDirectory("test");
final Path foo = root.resolve("foo");
final Path bar = root.resolve("bar");
final Path baz = root.resolve("baz");
Files.createDirectory(foo);
Files.createDirectory(bar);
Files.createDirectory(baz);
final WatchService watcher = root.getFileSystem().newWatchService();
final WatchKey fooKey = foo.register(watcher, ENTRY_CREATE);
final WatchKey barKey = bar.register(watcher, ENTRY_CREATE);
new Thread() {
{ setDaemon(true); }
@Override
public void run() {
while (true) {
try {
final Path temp = Files.createTempFile(foo, "temp", ".tmp");
Files.delete(temp);
Thread.sleep(10);
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}.start();
new Thread() {
{ setDaemon(true); }
@Override
public void run() {
WatchKey bazKeys[] = new WatchKey[32];
while (true) {
try {
for( int i = 0; i < bazKeys.length; i++) {
bazKeys[i] = baz.register(watcher, ENTRY_CREATE);
}
for( int i = 0; i < bazKeys.length; i++) {
bazKeys[i].cancel();
}
Thread.sleep(1);
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}.start();
long time = System.currentTimeMillis();
while ((System.currentTimeMillis() - time) < 15000) {
final WatchKey key = watcher.poll(60, TimeUnit.SECONDS);
if (key == null) continue;
if (key != fooKey) {
List<WatchEvent<?>> pollEvents = key.pollEvents();
for (WatchEvent<?> watchEvent : pollEvents) {
System.out.println(watchEvent.count() + " " +
watchEvent.kind() + " " +
watchEvent.context());
}
throw new RuntimeException("Event received for unexpected key");
}
key.reset();
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册