Commit 605d10f7 by Fernando Nasser Committed by Fernando Nasser

EventQueue.java (pop): Prevent racing condition to add events to the queue out…

EventQueue.java (pop): Prevent racing condition to add events to the queue out of order by acquiring...

        * java/awt/EventQueue.java (pop): Prevent racing condition to add
        events to the queue out of order by acquiring locks in the proper
        order and not by releasing one before acquiring the other.

From-SVN: r76161
parent 8f9f8d71
2004-01-19 Fernando Nasser <fnasser@redhat.com>
* java/awt/EventQueue.java (pop): Prevent racing condition to add
events to the queue out of order by acquiring locks in the proper
order and not by releasing one before acquiring the other.
2004-01-19 Fernando Nasser <fnasser@redhat.com>
* gnu/java/awt/peer/gtk/TestAWT.java (DialogWindow): Make text not
visible so that dialog can be reused.
......
......@@ -358,32 +358,34 @@ public class EventQueue
if (prev == null)
throw new EmptyStackException();
// Don't synchronize both this and prev at the same time, or deadlock could
// occur.
/* The order is important here, we must get the prev lock first,
or deadlock could occur as callers usually get here following
prev's next pointer, and thus obtain prev's lock before trying
to get this lock. */
synchronized (prev)
{
prev.next = next;
if (next != null)
next.prev = prev;
}
synchronized (this)
{
int i = next_out;
while (i != next_in)
synchronized (this)
{
prev.postEvent(queue[i]);
next_out = i;
if (++i == queue.length)
i = 0;
}
// Empty the queue so it can be reused
next_in = 0;
next_out = 0;
int i = next_out;
while (i != next_in)
{
prev.postEvent(queue[i]);
next_out = i;
if (++i == queue.length)
i = 0;
}
// Empty the queue so it can be reused
next_in = 0;
next_out = 0;
// Tell our EventDispatchThread that it can end execution
dispatchThread.interrupt ();
dispatchThread = null;
// Tell our EventDispatchThread that it can end execution
dispatchThread.interrupt ();
dispatchThread = null;
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment