提交 a34f6fb5 编写于 作者: R rupashka

7071775: javax/swing/JFileChooser/6396844/TwentyThousandTest.java failed on winxp

Reviewed-by: alexp
上级 3dd637c1
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,29 +26,30 @@ ...@@ -26,29 +26,30 @@
* @bug 6396844 * @bug 6396844
* @summary Tests memory leak for 20000 files * @summary Tests memory leak for 20000 files
* @author Sergey Malenkov * @author Sergey Malenkov
* @run main/othervm/timeout=1000 -mx256m TwentyThousandTest * @library ../../regtesthelpers
* @build Util
* @run main/othervm/timeout=1000 -mx128m TwentyThousandTest
*/ */
import sun.java2d.Disposer;
import sun.java2d.DisposerRecord;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.HierarchyEvent;
import java.awt.event.ActionListener; import java.awt.event.HierarchyListener;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
public class TwentyThousandTest implements ActionListener, Runnable { public class TwentyThousandTest {
private static final int FILES = 20000; private static final int FILES = 20000;
private static final int ATTEMPTS = 100; private static final int ATTEMPTS = 20;
private static final int INTERVAL = 100; private static final int INTERVAL = 100;
private static final boolean ALWAYS_NEW_INSTANCE = false;
private static final boolean UPDATE_UI_EACH_INTERVAL = true;
private static final boolean AUTO_CLOSE_DIALOG = true;
private static JFileChooser CHOOSER;
private static String tmpDir; private static String tmpDir;
private static volatile boolean disposerComplete;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
tmpDir = System.getProperty("java.io.tmpdir"); tmpDir = System.getProperty("java.io.tmpdir");
...@@ -77,15 +78,13 @@ public class TwentyThousandTest implements ActionListener, Runnable { ...@@ -77,15 +78,13 @@ public class TwentyThousandTest implements ActionListener, Runnable {
System.out.println("Do " + ATTEMPTS + " attempts for " + laf.getClassName()); System.out.println("Do " + ATTEMPTS + " attempts for " + laf.getClassName());
for ( int i = 0; i < ATTEMPTS; i++ ) { for (int i = 0; i < ATTEMPTS; i++) {
System.out.print(i + " "); System.out.print(i + " ");
doAttempt(); doAttempt();
} }
System.out.println(); System.out.println();
CHOOSER = null;
} }
System.out.println("Removing " + FILES + " files"); System.out.println("Removing " + FILES + " files");
...@@ -94,7 +93,7 @@ public class TwentyThousandTest implements ActionListener, Runnable { ...@@ -94,7 +93,7 @@ public class TwentyThousandTest implements ActionListener, Runnable {
getTempFile(i).delete(); getTempFile(i).delete();
} }
System.out.println( "Test passed successfully" ); System.out.println("Test passed successfully");
} }
private static File getTempFile(int i) { private static File getTempFile(int i) {
...@@ -104,48 +103,55 @@ public class TwentyThousandTest implements ActionListener, Runnable { ...@@ -104,48 +103,55 @@ public class TwentyThousandTest implements ActionListener, Runnable {
private static void doAttempt() throws Exception { private static void doAttempt() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() { SwingUtilities.invokeAndWait(new Runnable() {
public void run() { public void run() {
if ( ALWAYS_NEW_INSTANCE || ( CHOOSER == null ) ) final JFileChooser chooser = new JFileChooser(tmpDir);
CHOOSER = new JFileChooser(tmpDir);
chooser.updateUI();
if ( UPDATE_UI_EACH_INTERVAL )
CHOOSER.updateUI(); // Postpone JFileChooser closing until it becomes visible
chooser.addHierarchyListener(new HierarchyListener() {
if ( AUTO_CLOSE_DIALOG ) { @Override
Thread t = new Thread( new TwentyThousandTest( CHOOSER ) ); public void hierarchyChanged(HierarchyEvent e) {
t.start(); if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
CHOOSER.showOpenDialog( null ); if (chooser.isShowing()) {
} else { Thread thread = new Thread(new Runnable() {
CHOOSER.showOpenDialog( null ); public void run() {
} try {
Thread.sleep(INTERVAL);
// Close JFileChooser
SwingUtilities.invokeLater(new Runnable() {
public void run() {
chooser.cancelSelection();
}
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
thread.start();
}
}
}
});
chooser.showOpenDialog(null);
} }
}); });
// Allow to collect garbage by GC DisposerRecord disposerRecord = new DisposerRecord() {
Thread.sleep(1000); public void dispose() {
disposerComplete = true;
System.gc(); }
} };
private final JFileChooser chooser; disposerComplete = false;
TwentyThousandTest( JFileChooser chooser ) { Disposer.addRecord(new Object(), disposerRecord);
this.chooser = chooser;
}
public void run() { while (!disposerComplete) {
while ( !this.chooser.isShowing() ) { Util.generateOOME();
try {
Thread.sleep( 30 );
} catch ( InterruptedException exception ) {
exception.printStackTrace();
}
} }
Timer timer = new Timer( INTERVAL, this );
timer.setRepeats( false );
timer.start();
}
public void actionPerformed( ActionEvent event ) {
this.chooser.cancelSelection();
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册