@RandomlyFails // NB-Core-Build #8241 public void testTheStarvation37045() throws Exception { org.openide.util.Task task; synchronized (this) { org.openide.util.RequestProcessor.getDefault().post(support); // wait for the support (another thread) to try to open and block wait(); // now post there another task task = org.openide.util.RequestProcessor.getDefault().post(support); // wait for it to block, any amount of time is likely to do it Thread.sleep(500); // notify the first edit(), to continue (and throw exception) notify(); } // check for deadlock for (int i = 0; i < 5; i++) { if (task.isFinished()) break; Thread.sleep(500); } // uncomment the next line if you want to see real starvation threaddump // task.waitFinished (); assertTrue("Should be finished, but there is a starvation", task.isFinished()); }
@Override public Task prepareDocument() { Task task = super.prepareDocument(); // Avoid listening to the same task more than once. if (task != prepareTask2) { prepareTask2 = task; task.addTaskListener( new TaskListener() { public void taskFinished(Task task) { QuietUndoManager undo = getUndoManager(); StyledDocument doc = getDocument(); synchronized (undo) { // Now that the document is ready, pass it to the manager. undo.setDocument((AbstractDocument) doc); if (!undo.isCompound()) { // The superclass prepareDocument() adds the undo/redo // manager as a listener -- we need to remove it since // we will initially listen to the model instead. doc.removeUndoableEditListener(undo); // If not listening to document, then listen to model. addUndoManagerToModel(undo); } } prepareTask2 = null; } }); } return task; }
@Override public Task reloadDocument() { Task task = super.reloadDocument(); task.addTaskListener( new TaskListener() { public void taskFinished(Task task) { EventQueue.invokeLater( new Runnable() { public void run() { QuietUndoManager undo = getUndoManager(); StyledDocument doc = getDocument(); // The superclass reloadDocument() adds the undo // manager as an undoable edit listener. synchronized (undo) { if (!undo.isCompound()) { doc.removeUndoableEditListener(undo); } } } }); } }); return task; }