This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.
Regression in NetBeans Platform Dev (Build 201201241116) Scenario: - Create C/C++ Application with main - add "int aa = 1;" into main - Call context menu on 'aa' and select Refactor|Rename - Type aa22 and press Refactor button - Push Refactor|Undo [Rename "aa" to "aa2"] ==> ok - Push Refactor|Redo [Rename "aa" to "aa2"] ==> no changes in text
This is caused by http://hg.netbeans.org/cnd-main/rev/211330 registerListeners is now redirected into EDT and UndoManager.transactionEnded continues execution, so "UndoManager.undo" finishes and UndoAction.performAction calles undoManager.saveAll(); saveAll calls unregisterListeners (=>listenersRegistered=false) and then registerListeners (holding allCES lock) registerListeners passes check if (listenersRegistered) return; and goes to the next line at the same time EDT redirected registerListeners enters registerListeners whithout acquisition of any locks and also passes check if (listenersRegistered) return; so UndoManager is added as listener twice and next unregisterListeners will remove only one instance from listeners => I see clear of redoList as [1] which cause redo doesn't work because UndoManager.undo exists by check if (isRedoAvailable()) [1] java.lang.Exception at org.netbeans.modules.refactoring.spi.impl.UndoManager.clear(UndoManager.java:277) at org.netbeans.modules.refactoring.spi.impl.UndoManager.invalidate(UndoManager.java:457) at org.netbeans.modules.refactoring.spi.impl.UndoManager.removeUpdate(UndoManager.java:532) at org.netbeans.lib.editor.util.swing.PriorityDocumentListenerList.removeUpdate(PriorityDocumentListenerList.java:116) at javax.swing.text.AbstractDocument.fireRemoveUpdate(AbstractDocument.java:243) at org.netbeans.editor.BaseDocument.fireRemoveUpdate(BaseDocument.java:1569) at org.netbeans.editor.BaseDocument.handleRemove(BaseDocument.java:966) at org.netbeans.editor.BaseDocument.remove(BaseDocument.java:892) at org.openide.text.CloneableEditorSupport$4.run(CloneableEditorSupport.java:828) at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317) at org.openide.text.NbDocument.runAtomic(NbDocument.java:422) at org.openide.text.CloneableEditorSupport.clearDocument(CloneableEditorSupport.java:822) at org.openide.text.CloneableEditorSupport.access$1700(CloneableEditorSupport.java:129) at org.openide.text.CloneableEditorSupport$6$1Query.call(CloneableEditorSupport.java:1774) at org.openide.text.CloneableEditorSupport$6.run(CloneableEditorSupport.java:1787) at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317) at org.openide.text.NbDocument.runAtomic(NbDocument.java:422) at org.openide.text.CloneableEditorSupport.reloadDocument(CloneableEditorSupport.java:1737) at org.openide.text.CloneableEditorSupport.checkReload(CloneableEditorSupport.java:2286) at org.openide.text.CloneableEditorSupport.access$2600(CloneableEditorSupport.java:129) at org.openide.text.CloneableEditorSupport$Listener$1.run(CloneableEditorSupport.java:2893) at org.netbeans.editor.GuardedDocument.runAtomic(GuardedDocument.java:317) at org.openide.text.NbDocument.runAtomic(NbDocument.java:422) at org.openide.text.CloneableEditorSupport$Listener$1.run(CloneableEditorSupport.java:2885) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641) at java.awt.EventQueue.access$000(EventQueue.java:84) at java.awt.EventQueue$1.run(EventQueue.java:602) at java.awt.EventQueue$1.run(EventQueue.java:600) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:611) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:162) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
I have to backout 211330:31d505fcdf08 to recover after regression. http://hg.netbeans.org/cnd-main/rev/054c260bad8a Please, improve unregisterListeners/registerListeners logic by correctly holding locks or some other way Thanks.
(In reply to comment #1) > I see clear of redoList as [1] which cause redo doesn't work because > UndoManager.undo exists by check > if (isRedoAvailable()) misprint, I meant: UndoManager.redo exists by check if (isRedoAvailable())
I work on complete rewrite of undo/redo. Tis bug will be obsolete as soon as I push my changes. Anyway thanks for backout.
Refactoring Undo was integrated with Editor Undo. This bug is no more valid. Please verify