Deadlock while calling "Toolkit.getDefaultToolkit()" in an OSGi environment [message #526602] |
Mon, 12 April 2010 08:07  |
Eclipse User |
|
|
|
Hi,
My use case is: I want to render an image on the server side. I'm using the AWT-APIs for this.
My problem: I'm getting a deadlock when calling the method "Toolkit.getDefaultToolkit()" in an OSGi environment (equinox or felix).
Here is a test case to reproduce the problem:
http://support.isr.de/download/isr/awt-osgi-problem.zip
Run the .cmd-file "run-with-equinox.cmd". If you get the message "After 10 seconds, the AWT Toolkit still could not be initialized. This is a bug!" you have reproduced the error.
The error only occurs an a windows system. On an ubuntu system (probably on every unix based system) the test case produces no error.
I noticed some strange behavior while trying to solve the problem:
- pressing "enter" in the console from which I control the OSGi runtime resolves the lock
- jvisualvm cannot create a thread dump while the deadlock exists
Has anyone an idea? Where is the error?
Thanks!
p.s.: To understand the error I stepped through the sourcecode and got finally into the class "sun.awt.window.WToolkit". For a better understanding of the problem have a look at the sourcecode of "WToolkit.java" (see end of the post for a shortened version)
In the constructor of this class a new deamon thread is started. After starting this thread "wait()" is called. The deamon thread should notify the main thread after finishing. This deamon thread calls the native method "init()" from the library "awt.dll" to do some initializing stuff. This call does not return and so the thread never calls the method notifyAll() to notify the main thread.
[..]
public class WToolkit extends SunToolkit implements Runnable {
[..]
public WToolkit() {
// Startup toolkit threads
if (PerformanceLogger.loggingEnabled()) {
PerformanceLogger.setTime("WToolkit construction");
}
sun.java2d.Disposer.addRecord(anchor, new ToolkitDisposer());
synchronized (this) {
// Fix for bug #4046430 -- Race condition
// where notifyAll can be called before
// the "AWT-Windows" thread's parent thread is
// waiting, resulting in a deadlock on startup.
/*
* Fix for 4701990.
* AWTAutoShutdown state must be changed before the toolkit thread
* starts to avoid race condition.
*/
AWTAutoShutdown.notifyToolkitThreadBusy();
if (!startToolkitThread(this)) {
Thread toolkitThread = new Thread(this, "AWT-Windows");
toolkitThread.setDaemon(true);
toolkitThread.start();
}
try {
wait();
}
catch (InterruptedException x) {
}
}
SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
// Enabled "live resizing" by default. It remains controlled
// by the native system though.
setDynamicLayout(true);
}
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
boolean startPump = init();
[..]
synchronized(this) {
notifyAll();
}
if (startPump) {
eventLoop(); // will Dispose Toolkit when shutdown hook executes
}
}
[..]
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.11693 seconds