提交 28e20b1a 编写于 作者: D dcherepanov

6796915: Deadlock in XAWT when switching virtual desktops

Reviewed-by: art, anthony
上级 6d676e1e
...@@ -534,71 +534,71 @@ final class XDropTargetRegistry { ...@@ -534,71 +534,71 @@ final class XDropTargetRegistry {
return entry.getSite(x, y); return entry.getSite(x, y);
} }
/*
* Note: this method should be called under AWT lock.
*/
public void registerDropSite(long window) { public void registerDropSite(long window) {
assert XToolkit.isAWTLockHeldByCurrentThread();
if (window == 0) { if (window == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
XDropTargetEventProcessor.activate(); XDropTargetEventProcessor.activate();
XToolkit.awtLock(); long toplevel = getToplevelWindow(window);
try {
long toplevel = getToplevelWindow(window);
/*
* No window with WM_STATE property is found.
* Since the window can be a plugin window reparented to the browser
* toplevel, we cannot determine which window will eventually have
* WM_STATE property set. So we schedule a timer callback that will
* periodically attempt to find an ancestor with WM_STATE and
* register the drop site appropriately.
*/
if (toplevel == 0) {
addDelayedRegistrationEntry(window);
return;
}
if (toplevel == window) { /*
Iterator dropTargetProtocols = * No window with WM_STATE property is found.
XDragAndDropProtocols.getDropTargetProtocols(); * Since the window can be a plugin window reparented to the browser
* toplevel, we cannot determine which window will eventually have
* WM_STATE property set. So we schedule a timer callback that will
* periodically attempt to find an ancestor with WM_STATE and
* register the drop site appropriately.
*/
if (toplevel == 0) {
addDelayedRegistrationEntry(window);
return;
}
while (dropTargetProtocols.hasNext()) { if (toplevel == window) {
XDropTargetProtocol dropTargetProtocol = Iterator dropTargetProtocols =
(XDropTargetProtocol)dropTargetProtocols.next(); XDragAndDropProtocols.getDropTargetProtocols();
dropTargetProtocol.registerDropTarget(toplevel);
} while (dropTargetProtocols.hasNext()) {
} else { XDropTargetProtocol dropTargetProtocol =
registerEmbeddedDropSite(toplevel, window); (XDropTargetProtocol)dropTargetProtocols.next();
dropTargetProtocol.registerDropTarget(toplevel);
} }
} finally { } else {
XToolkit.awtUnlock(); registerEmbeddedDropSite(toplevel, window);
} }
} }
/*
* Note: this method should be called under AWT lock.
*/
public void unregisterDropSite(long window) { public void unregisterDropSite(long window) {
assert XToolkit.isAWTLockHeldByCurrentThread();
if (window == 0) { if (window == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
XToolkit.awtLock(); long toplevel = getToplevelWindow(window);
try {
long toplevel = getToplevelWindow(window);
if (toplevel == window) { if (toplevel == window) {
Iterator dropProtocols = Iterator dropProtocols =
XDragAndDropProtocols.getDropTargetProtocols(); XDragAndDropProtocols.getDropTargetProtocols();
removeDelayedRegistrationEntry(window); removeDelayedRegistrationEntry(window);
while (dropProtocols.hasNext()) { while (dropProtocols.hasNext()) {
XDropTargetProtocol dropProtocol = (XDropTargetProtocol)dropProtocols.next(); XDropTargetProtocol dropProtocol = (XDropTargetProtocol)dropProtocols.next();
dropProtocol.unregisterDropTarget(window); dropProtocol.unregisterDropTarget(window);
}
} else {
unregisterEmbeddedDropSite(toplevel, window);
} }
} finally { } else {
XToolkit.awtUnlock(); unregisterEmbeddedDropSite(toplevel, window);
} }
} }
......
...@@ -1757,25 +1757,36 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, ...@@ -1757,25 +1757,36 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
} }
} }
// should be synchronized on awtLock
private int dropTargetCount = 0; private int dropTargetCount = 0;
public synchronized void addDropTarget() { public void addDropTarget() {
if (dropTargetCount == 0) { XToolkit.awtLock();
long window = getWindow(); try {
if (window != 0) { if (dropTargetCount == 0) {
XDropTargetRegistry.getRegistry().registerDropSite(window); long window = getWindow();
if (window != 0) {
XDropTargetRegistry.getRegistry().registerDropSite(window);
}
} }
dropTargetCount++;
} finally {
XToolkit.awtUnlock();
} }
dropTargetCount++;
} }
public synchronized void removeDropTarget() { public void removeDropTarget() {
dropTargetCount--; XToolkit.awtLock();
if (dropTargetCount == 0) { try {
long window = getWindow(); dropTargetCount--;
if (window != 0) { if (dropTargetCount == 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window); long window = getWindow();
if (window != 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window);
}
} }
} finally {
XToolkit.awtUnlock();
} }
} }
void addRootPropertyEventDispatcher() { void addRootPropertyEventDispatcher() {
...@@ -1838,13 +1849,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, ...@@ -1838,13 +1849,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
} }
} }
protected synchronized void updateDropTarget() { protected void updateDropTarget() {
if (dropTargetCount > 0) { XToolkit.awtLock();
long window = getWindow(); try {
if (window != 0) { if (dropTargetCount > 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window); long window = getWindow();
XDropTargetRegistry.getRegistry().registerDropSite(window); if (window != 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window);
XDropTargetRegistry.getRegistry().registerDropSite(window);
}
} }
} finally {
XToolkit.awtUnlock();
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册