<Swing Dev> [9] Review Request for 8030702: Deadlock between subclass of AbstractDocument and UndoManager

Semyon Sadetsky semyon.sadetsky at oracle.com
Thu Sep 10 16:30:52 UTC 2015



On 9/10/2015 6:46 PM, Alexander Scherbatiy wrote:
> On 9/10/2015 6:26 PM, Semyon Sadetsky wrote:
>>
>>
>> On 9/10/2015 5:13 PM, Alexander Scherbatiy wrote:
>>> On 9/10/2015 5:07 PM, Semyon Sadetsky wrote:
>>>>
>>>>
>>>> On 9/10/2015 3:45 PM, Alexander Scherbatiy wrote:
>>>>> On 9/10/2015 3:39 PM, Semyon Sadetsky wrote:
>>>>>>
>>>>>>
>>>>>> On 9/10/2015 2:44 PM, Alexander Scherbatiy wrote:
>>>>>>> On 9/8/2015 6:11 PM, Semyon Sadetsky wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 9/8/2015 2:10 PM, Alexander Scherbatiy wrote:
>>>>>>>>> On 9/8/2015 2:06 PM, Semyon Sadetsky wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 9/8/2015 1:07 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>> On 9/8/2015 12:48 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On 9/8/2015 12:26 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>> On 9/8/2015 11:28 AM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On 9/7/2015 5:56 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>> On 9/7/2015 5:08 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 9/7/2015 2:41 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>>>> On 9/4/2015 9:00 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On 9/4/2015 6:11 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>> On 9/3/2015 10:01 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> On 8/5/2015 4:50 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On 8/5/2015 2:39 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>>>>> On 8/5/2015 2:00 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> On 8/5/2015 1:04 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 8:13 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 6:17 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 3:13 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 2:03 PM, Alexander Scherbatiy 
>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 12:32 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/4/2015 11:47 AM, Alexander Scherbatiy 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/3/2015 4:19 PM, Semyon Sadetsky wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 8/3/2015 3:12 PM, Alexander 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 7/31/2015 9:44 AM, Semyon Sadetsky 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Good question. But I did not add a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> concrete class.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The problem is that UndoManager 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> provided by JDK wants to be serialized 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> but undoable objects knows nothing 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> about that. The contract between 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManager and undoable is 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEditListener which only 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> notifies UndoManager to add a new 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> edit. AbstractDocument does not care 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> about the specific UndoManager 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation and it can contain 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> plenty different UndoableEditListener. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> That is the current API approach.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If our specific UndoManager wants to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be serialized it should also take into 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> account that the undoable it controls 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> may require serialization. For that it 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> needs undoable's synchronization 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> monitor and AbstractDocument can 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> provide it using 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> writeLock()/writeUnlock() methods. I 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> assumed that in the first turn 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManger should work well with JDK 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> undoables than to serve as a general 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation. Also I tried to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> preserve the current API.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> And your suggestion is to change the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> existing UndoableEditListener API by 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> introducing synchronization methods in 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it. Am I correctly understand you?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    What I said is that UndoManager can 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be used not only by AbstractDocument 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> but also in other classes which can 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> have the same synchronization problems.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    There should be a way to solve these 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> problems without storing links of 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> external classes inside the UndoManager.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> As well as AbstractDocument can use 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> another undo managers. It can be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> addressed to both parties. They need 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> each others locks to serialize changes 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> without deadlock.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> AbstarctDocument is related to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEditListener as one to many that 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> means a lock should be taken for each 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> undo manager before the document change.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Undo manager does not have any methods 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to get its lock because it is an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEditListener implementation. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> AbstarctDocument has API to receive its 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> lock.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Do you still propose to fix the issue on 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument side? 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    Yes.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Could you clarify how do you see such fix?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     Put an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEdit/UndoableEditEvent/necessary 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> information to a queue instead of firing 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the undoable edit event under the write 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> lock. Do not read the queue under the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> write lock. The queue allows to preserve 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the order of UndoableEdit's adding to an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManager.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Is not it the same as the previous attempt 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to fix this issue (see 8030118 )?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>      8030118 fix does a strange thing like 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> firing InsertUpdate document event out of 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> the lock. Do not do that.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Document change event need to be fired 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> under write lock because the change to the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> document should be atomic. Queue of 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> changes is undo manager's responsibility 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not the document.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> And such queue in the AbstractDocument 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would require complex coordination with 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> all its undo managers queues. What if undo 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> called on undo manager during the doc's 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> queue processing? The right undo/redo 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> requests and edit events order need to be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> preserved in this case and it would be too 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> complex or we would have to change the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> concept and make AbstractDocument to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> maintain its undo/redo history internally 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> instead of external undo managers.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>     It only needs to pass undoable edits in 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> the right order from abstract document to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> the UndoManager.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> Consider the scenario: UndoManager executes 
>>>>>>>>>>>>>>>>>>>>>>>>>>> undo/redo before it receives the undoable 
>>>>>>>>>>>>>>>>>>>>>>>>>>> edits. As result it will undo not the last 
>>>>>>>>>>>>>>>>>>>>>>>>>>> edit but intermediate and it will crash 
>>>>>>>>>>>>>>>>>>>>>>>>>>> because the document state is changed and 
>>>>>>>>>>>>>>>>>>>>>>>>>>> intermediate the undoable edit cannot be 
>>>>>>>>>>>>>>>>>>>>>>>>>>> applied to the final document state.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>     This is a good point. But this does not 
>>>>>>>>>>>>>>>>>>>>>>>>>> work neither with the current behavior nor 
>>>>>>>>>>>>>>>>>>>>>>>>>> with your proposed fix.
>>>>>>>>>>>>>>>>>>>>>>>>>>     Consider the following scenario:
>>>>>>>>>>>>>>>>>>>>>>>>>> -----------------------
>>>>>>>>>>>>>>>>>>>>>>>>>> document.insertString("AAA") // "AAA" 
>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEdit is added to the UndoManager
>>>>>>>>>>>>>>>>>>>>>>>>>> document.insertString("BBB")
>>>>>>>>>>>>>>>>>>>>>>>>>> writeLock();
>>>>>>>>>>>>>>>>>>>>>>>>>> handleInsertString();
>>>>>>>>>>>>>>>>>>>>>>>>>>           // a user press undo, the "AAA" 
>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEdit is selected in UndoManager but 
>>>>>>>>>>>>>>>>>>>>>>>>>> not executed, because of the write lock
>>>>>>>>>>>>>>>>>>>>>>>>>> fireUndoableEditUpdate("BBB") // UndoManager 
>>>>>>>>>>>>>>>>>>>>>>>>>> is waiting for the "AAA" UndoableEdit execution
>>>>>>>>>>>>>>>>>>>>>>>>>> writeUnlock() // "AAA" UndoableEdit is 
>>>>>>>>>>>>>>>>>>>>>>>>>> executed instead of "BBB"
>>>>>>>>>>>>>>>>>>>>>>>>>> // "BBB" UndoableEdit is added to the 
>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManager
>>>>>>>>>>>>>>>>>>>>>>>>>> -----------------------
>>>>>>>>>>>>>>>>>>>>>>>>> It will work after the fix. When undo() method 
>>>>>>>>>>>>>>>>>>>>>>>>> is called it will be blocked on the document 
>>>>>>>>>>>>>>>>>>>>>>>>> lock until the edit is done in another thread. 
>>>>>>>>>>>>>>>>>>>>>>>>> Then undo() will acquire the document lock and 
>>>>>>>>>>>>>>>>>>>>>>>>> call editToBeUndone() method which will return 
>>>>>>>>>>>>>>>>>>>>>>>>> the actual last edit added with addEdit() 
>>>>>>>>>>>>>>>>>>>>>>>>> during the undoable callback execution.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>    Is it possible to use the same undo manager 
>>>>>>>>>>>>>>>>>>>>>>>> with several abstract documents? If so, how are 
>>>>>>>>>>>>>>>>>>>>>>>> you going to map a document lock with the 
>>>>>>>>>>>>>>>>>>>>>>>> document undoable edit without querying it?
>>>>>>>>>>>>>>>>>>>>>>> That scenario is possible. As well as several 
>>>>>>>>>>>>>>>>>>>>>>> undo managers can be assigned to the same 
>>>>>>>>>>>>>>>>>>>>>>> document. I think I can improve the fix in that 
>>>>>>>>>>>>>>>>>>>>>>> direction when you agree with the general approach.
>>>>>>>>>>>>>>>>>>>>>>      It is interesting how it is possible to do 
>>>>>>>>>>>>>>>>>>>>>> that without querying an undoable edit. Your fix 
>>>>>>>>>>>>>>>>>>>>>> is relaying that an abstract document lock should 
>>>>>>>>>>>>>>>>>>>>>> precede the undo manager lock but to get the 
>>>>>>>>>>>>>>>>>>>>>> right abstract manager lock you need to take an 
>>>>>>>>>>>>>>>>>>>>>> undoable edit under the undo manager lock first.
>>>>>>>>>>>>>>>>>>>>> We always have only two possible directions 
>>>>>>>>>>>>>>>>>>>>> forward and backward so it will require only 2 
>>>>>>>>>>>>>>>>>>>>> references.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Hi Alexander,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Please, take a look on the updated version which 
>>>>>>>>>>>>>>>>>>>> works for any number documents shared one undo 
>>>>>>>>>>>>>>>>>>>> manager.
>>>>>>>>>>>>>>>>>>>> Also I removed the reference you did not like. This 
>>>>>>>>>>>>>>>>>>>> has some disadvantages but I think they are 
>>>>>>>>>>>>>>>>>>>> negligible.
>>>>>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~ssadetsky/8030702/webrev.01/ 
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>    You code looks like:
>>>>>>>>>>>>>>>>>>> ----------------------
>>>>>>>>>>>>>>>>>>> public void undo() throws CannotUndoException {
>>>>>>>>>>>>>>>>>>>   synchronized (this) {
>>>>>>>>>>>>>>>>>>>     lockedDoc = getLockedDocument(edit);
>>>>>>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>   // TP: 1
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>   while (!done) {
>>>>>>>>>>>>>>>>>>>     lockedDoc.writeLock();
>>>>>>>>>>>>>>>>>>>     // ...
>>>>>>>>>>>>>>>>>>>     lockedDoc.writeUnlock();
>>>>>>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>> ----------------------
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>   Is it possible that on the line "TP: 1" a new 
>>>>>>>>>>>>>>>>>>> UndoableEdit will be added to the UndoManager so the 
>>>>>>>>>>>>>>>>>>> the lockedDoc will not point to the latest 
>>>>>>>>>>>>>>>>>>> UndoableEdit which is taken on the line 438.
>>>>>>>>>>>>>>>>>> No. It is not possible because of
>>>>>>>>>>>>>>>>>> 438 UndoableEdit edit = editToBeUndone();
>>>>>>>>>>>>>>>>>> It always return the last significant edit so we 
>>>>>>>>>>>>>>>>>> preserve the consistency.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>     I see.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    There is one more question about the undoOrRedo() 
>>>>>>>>>>>>>>>>> method there the synchronization is removed.
>>>>>>>>>>>>>>>>>    Lets look at the sequences of calls to an UndoManager:
>>>>>>>>>>>>>>>>>     addEdit(anEdit1), addEdit(anEdit2), undoOrRedo(), 
>>>>>>>>>>>>>>>>> undoOrRedo().
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    The result for two undoOrRedo() calls should 
>>>>>>>>>>>>>>>>> neutralize each other (it is just undo and redo calls).
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>   Is it possible that after the fix the the first 
>>>>>>>>>>>>>>>>> undoOrRedo() from one thread fails to do the redo and 
>>>>>>>>>>>>>>>>> before starting to do the undo
>>>>>>>>>>>>>>>>>   the second undoOrRedo() call from another thread 
>>>>>>>>>>>>>>>>> also fails to do a redo action?
>>>>>>>>>>>>>>>>>   In this cases two undo actions could be called 
>>>>>>>>>>>>>>>>> instead of undo and redo.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> It does not make any sense to make atomic the 
>>>>>>>>>>>>>>>> convenience method undoOrRedo() because undo() and 
>>>>>>>>>>>>>>>> redo() are not atomic.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>      All UndoManager.undo()/redo()/undoOrRedo() have 
>>>>>>>>>>>>>>> synchronization.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>      For the sample described above two undoOrRedo() 
>>>>>>>>>>>>>>> calls always invoke undo() at first and redo() at the 
>>>>>>>>>>>>>>> second step.
>>>>>>>>>>>>>>>      After the fix it is possible that two undo() 
>>>>>>>>>>>>>>> methods can be called.  It means that there will be a 
>>>>>>>>>>>>>>> regression in the undoOrRedo() method behavior after the 
>>>>>>>>>>>>>>> fix.
>>>>>>>>>>>>>> The spec of the method to not promise any deterministic 
>>>>>>>>>>>>>> behavior for two consequent calls.
>>>>>>>>>>>>>
>>>>>>>>>>>>> javadoc for UndoManager.undoOrRedo() method [1]:
>>>>>>>>>>>>>   "Convenience method that invokes one of undo or redo. If 
>>>>>>>>>>>>> any edits have been undone (the index of the next edit is 
>>>>>>>>>>>>> less than the length of the edits list) this invokes redo, 
>>>>>>>>>>>>> otherwise it invokes undo."
>>>>>>>>>>>>>
>>>>>>>>>>>>> For the sequence of calls addEdit(anEdit1), 
>>>>>>>>>>>>> addEdit(anEdit2), undoOrRedo(), undoOrRedo():
>>>>>>>>>>>>> Step 1: call undoOrRedo() - there are no undone edits, the 
>>>>>>>>>>>>> undo should be invoked.
>>>>>>>>>>>>> Step 2: call undoOrRedo() - there is one undone edit, the 
>>>>>>>>>>>>> redo should be invoked.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> [1] 
>>>>>>>>>>>>> http://docs.oracle.com/javase/8/docs/api/javax/swing/undo/UndoManager.html#undoOrRedo--
>>>>>>>>>>>>>
>>>>>>>>>>>> I think it is obvious that this never worked if addEdit() 
>>>>>>>>>>>> and undoOrRedo() are called from different threads without 
>>>>>>>>>>>> the external synchronization.
>>>>>>>>>>>> The fix changes nothing here. It works fine in a single 
>>>>>>>>>>>> thread approach.
>>>>>>>>>>>
>>>>>>>>>>>     The javadoc does not mention that it is not thread safe 
>>>>>>>>>>> to use the undoOrRedo() method from different treads.
>>>>>>>>>>>     You can get all permutations of the "addEdit(anEdit1), 
>>>>>>>>>>> addEdit(anEdit2), undoOrRedo(), undoOrRedo()" calls and 
>>>>>>>>>>> check the the fix does not break cases which worked before 
>>>>>>>>>>> the fix.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> A sequence of calls can be permuted in a single thread? How?
>>>>>>>>>
>>>>>>>>>   Why are you asking about a single thread? The UndoManager 
>>>>>>>>> class is designed to work with multiple threads.
>>>>>>>>>
>>>>>>>>>    You need to look at the all possible cases which can be 
>>>>>>>>> called by an application from different threads like:
>>>>>>>>>    - addEdit(anEdit1), addEdit(anEdit2), undoOrRedo(), 
>>>>>>>>> undoOrRedo()
>>>>>>>>>    - addEdit(anEdit1), undoOrRedo(), addEdit(anEdit2), 
>>>>>>>>> undoOrRedo()
>>>>>>>>>    - ...
>>>>>>>>>
>>>>>>>>>   and check that there are no regressions in the behavior 
>>>>>>>>> after the fix.
>>>>>>>> Are you kidding? This UndoManager sample has never worked in 
>>>>>>>> multithreading because of deadlock issue we are fixing.
>>>>>>>> What the regression are you talking about?
>>>>>>>
>>>>>>>   I am sorry. I do not understand your sense of humor.
>>>>>>>
>>>>>>>   Do you mean that the deadlock happens every time when an 
>>>>>>> UndoEdiale is added to a UndoManager and undo() is called and 
>>>>>>> because of this the the UndoManager is totally unusable?
>>>>>> In you suggestion you want to run addEdit(anEdit1), 
>>>>>> addEdit(anEdit2), undoOrRedo(), undoOrRedo() not in single thread 
>>>>>> but from different threads two times: before the fix and after it 
>>>>>> then to compare the results. But it is just impossible to get any 
>>>>>> valuable results from the run without the fix because it will 
>>>>>> crash with the deadlock. The deadlock we are trying to fix.
>>>>>> Do you see why it is not possible or you need extra explanation?
>>>>>
>>>>>   Even though something does not work before the fix the 
>>>>> UndoManager has been designed to work in the multi-tread 
>>>>> environment and the undoOrRedo() method should work in the 
>>>>> predicted way.
>>>> The sample is related to singlethreaded usage of cause.
>>>>>
>>>>>   If you think that it can't be fixed with this fix you can file a 
>>>>> new issue that it is  a problem which we aware of.
>>>> We discussed that already. The order is not deterministic without 
>>>> the external fair lock. And I think it is not needed for 99.(9)% of 
>>>> usages. Nobody cares if an undo button pressed 1 ms early or 1 ms 
>>>> later. It shouldn't be critical otherwise it is anti-pattern. If 
>>>> the background editing is allowed concurrently along the user 
>>>> interaction one need to use an external synchronization or simply 
>>>> disable undo/redo until the editing is done.
>>>> For me it absolutely clear that it is a degenerated scenario when a 
>>>> UI document is modified concurrently from two different threads, 
>>>> but we should not allow deadlocks anyway and have to fix it.
>>>>>
>>>>>  Thanks,
>>>>>  Alexandr.
>>>>>
>>>>>
>>>>>>>   Do you think that it is a good idea to remove a 
>>>>>>> synchronization from the undoOrRedo method because there is the 
>>>>>>> deadlock?
>>>>>>>   If so, may be you can just remove the synchronization keyword 
>>>>>>> form the undo() and redo() methods as well and the deadlock just 
>>>>>>> goes away?
>>>>>>>   No new interfaces, no locks from an abstract document. That 
>>>>>>> would be the simplest solution of the issue.
>>>
>>>    Could you answer on the question why do you suggest so 
>>> complicated fix? Just remove the synchronization from the undo() and 
>>> redo() methods and you really fix the deadlock.
>>>    It seems that you believe that it is possible because: "If the 
>>> background editing is allowed concurrently along the user 
>>> interaction one need to use an external synchronization or simply 
>>> disable undo/redo until the editing is done."
>> Strange suggestion. We cannot remove synchronization it is required 
>> to guarantee consistency. 
>
>    The same is for the undoOrRedo() method. You need to provide a 
> synchronization for it or create an new issue on it.
undoOrRedo() just calls undo() or redo() which contain all necessary 
synchronization.
>
>    Thanks,
>    Alexandr.
>> Also synchronization is needed to provide coherency with the state of 
>> the document. If those two are not provided the document can be 
>> corrupted.  This is enough most usages.
>>>
>>>   Thanks,
>>>   Alexandr.
>>>
>>>
>>>>>>>
>>>>>>>
>>>>>>>   Thanks,
>>>>>>>   Alexandr.
>>>>>>>
>>>>>>>>>
>>>>>>>>>   Thanks,
>>>>>>>>>   Alexandr.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>>    Alexandr.
>>>>>>>>>> It is
>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>  I still think that updating the UndoableManager for 
>>>>>>>>>>>>>>>>>>> one particular AbstarctManager class can be made 
>>>>>>>>>>>>>>>>>>> only after investigation of other possibilities.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>    You could start with choosing behavior which you 
>>>>>>>>>>>>>>>>>>> want to achieve or to keep, like:
>>>>>>>>>>>>>>>>>>>    - fix the deadlock
>>>>>>>>>>>>>>>>>>>    - atomic  undo() method
>>>>>>>>>>>>>>>>>>>    - serialization
>>>>>>>>>>>>>>>>>>>    - immediate roll back action
>>>>>>>>>>>>>>>>>>>    - abstract document consistency after undo() action
>>>>>>>>>>>>>>>>>>>   - ...
>>>>>>>>>>>>>>>>>> We need to pay attention to the deadlock at first of 
>>>>>>>>>>>>>>>>>> cause.
>>>>>>>>>>>>>>>>>> Serialization and consistency are achieved. Any 
>>>>>>>>>>>>>>>>>> concrete doubts?
>>>>>>>>>>>>>>>>>> immediate roll back action -- ?what is that?
>>>>>>>>>>>>>>>>>      "if user starts a long edit operation and press 
>>>>>>>>>>>>>>>>> undo after that he expects when the long edit is 
>>>>>>>>>>>>>>>>> finished it will be rolled back immediately." - what 
>>>>>>>>>>>>>>>>> ever does it mean.
>>>>>>>>>>>>>>>> Got it. It will work within the fairness. We have 
>>>>>>>>>>>>>>>> discussed this allready.
>>>>>>>>>>>>>>>>>> I sacrificed undo/redo call atomicity because you did 
>>>>>>>>>>>>>>>>>> not like doc references in undo manager. I think it 
>>>>>>>>>>>>>>>>>> is not important for the most multithreaded undo/redo 
>>>>>>>>>>>>>>>>>> scenarios.
>>>>>>>>>>>>>>>>>    Could you give more details about it. Which doc 
>>>>>>>>>>>>>>>>> references do you mean?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Your statement a dozen iterations ago was: "There 
>>>>>>>>>>>>>>>> should be a way to solve these problems without storing 
>>>>>>>>>>>>>>>> links of external classes inside the UndoManager."
>>>>>>>>>>>>>>>> I guess you used "link" term for references. I would 
>>>>>>>>>>>>>>>> recommend to use standard terminology: reference to the 
>>>>>>>>>>>>>>>> object, dependency on the class, etc... to avoid 
>>>>>>>>>>>>>>>> misunderstanding.
>>>>>>>>>>>>>>>> Usually "link" is in a browser document or a tool that 
>>>>>>>>>>>>>>>> produces executables after compilation.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>  and look which of the following approaches can 
>>>>>>>>>>>>>>>>>>> better solve them (where the fist is more preferred 
>>>>>>>>>>>>>>>>>>> and the last is less preferred case):
>>>>>>>>>>>>>>>>>>>   - using UndoManager as is without adding links 
>>>>>>>>>>>>>>>>>>> from some specific classes to it
>>>>>>>>>>>>>>>>>>>   - provide an API for UndoManager to work with 
>>>>>>>>>>>>>>>>>>> UndoableEdit-s which have synchronization for 
>>>>>>>>>>>>>>>>>>> undo/redo methods
>>>>>>>>>>>>>>>>>>>   - adding links of external classes directly to 
>>>>>>>>>>>>>>>>>>> UndoManager
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> What do you mean under link term? A reference or 
>>>>>>>>>>>>>>>>>> dependency?
>>>>>>>>>>>>>>>>>     There are two options. If UndoManager is a class 
>>>>>>>>>>>>>>>>> designed to be only used with the AbstractDocument and 
>>>>>>>>>>>>>>>>> placed in the javax.swing.text package it definitly 
>>>>>>>>>>>>>>>>> can have special code to handle an abstract document 
>>>>>>>>>>>>>>>>> instance in a special way.
>>>>>>>>>>>>>>>>>    If   UndoManager is a general purpose class, it 
>>>>>>>>>>>>>>>>> looks strange that it handles some special classes in 
>>>>>>>>>>>>>>>>> different way as all others. It usually mean that 
>>>>>>>>>>>>>>>>> there are some design problems in this class. That is 
>>>>>>>>>>>>>>>>> why I just asked to look at other ways at first. Only 
>>>>>>>>>>>>>>>>> if other solutions are not suitable it has sense to 
>>>>>>>>>>>>>>>>> look at the way that you are provided.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Correct. I introduced extra dependency. It is optional, 
>>>>>>>>>>>>>>>> but anyway. Of cause there is a design problem in undo 
>>>>>>>>>>>>>>>> javax.swing.undo package. But I cannot rewrite the API 
>>>>>>>>>>>>>>>> because we will get a compatibility problem then. I 
>>>>>>>>>>>>>>>> mentioned this several times in this thread.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> We are constrained by compatibility requirements. 
>>>>>>>>>>>>>>>>>> UndoManager is a broadly used class we cannot change 
>>>>>>>>>>>>>>>>>> the API so drastically.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    I think that you can generalize your solution just 
>>>>>>>>>>>>>>>>> adding an internal interface like 
>>>>>>>>>>>>>>>>> sun.swing.UndoableEditLock.
>>>>>>>>>>>>>>>>>    Every UndoableEdit which implements this interface 
>>>>>>>>>>>>>>>>> can provide a lock for its synchronization.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    If this will work it can be made public in some 
>>>>>>>>>>>>>>>>> days so other application can also have proper 
>>>>>>>>>>>>>>>>> synchronization for their undo/redo actions.
>>>>>>>>>>>>>>>> OK. I added it.
>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~ssadetsky/8030702/webrev.02/
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>    - We can return a public class that implements an 
>>>>>>>>>>>>>>> internal interface, but we can't expose an internal API 
>>>>>>>>>>>>>>> in the public class definition.
>>>>>>>>>>>>>>>      May be it is possible to wrap an UndoableEdit to 
>>>>>>>>>>>>>>> the UndoableEditLockSupport in the UndoableEditEvent or 
>>>>>>>>>>>>>>> in some other place.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>    - The similar code is used both in the 
>>>>>>>>>>>>>>> UndoManager.undo() and redo() methods. Is it possible to 
>>>>>>>>>>>>>>> move this code to one method that does undo or redo 
>>>>>>>>>>>>>>> depending on the given argument?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>> OK. accepted.
>>>>>>>>>>>>>> http://cr.openjdk.java.net/~ssadetsky/8030702/webrev.03/
>>>>>>>>>>>>>
>>>>>>>>>>>>>    - UndoManager.undo/redo methods
>>>>>>>>>>>>>      In your previous fix inProgress variable and the 
>>>>>>>>>>>>> super call were used under the lock. It may leads to some 
>>>>>>>>>>>>> synchronization issues if you decide to omit it.
>>>>>>>>>>>>>   - UndoManager.tryUndoOrRedo()
>>>>>>>>>>>>>     It is possible to get rid of 'done' variable just 
>>>>>>>>>>>>> using an infinity loop and return the exact result where 
>>>>>>>>>>>>> the loop is terminated.
>>>>>>>>>>>>>    - AbstractDocument.DefaultDocumentEventUndoableWrapper 
>>>>>>>>>>>>> implements both UndoableEdit and UndoableEditLockSupport 
>>>>>>>>>>>>> interfaces but UndoableEditLockSupport already extends 
>>>>>>>>>>>>> UndoableEdit.
>>>>>>>>>>>>>    - "@since 1.9" javadoc for 
>>>>>>>>>>>>> DefaultDocumentEventUndoableWrapper.lockEdit()/unlockEdit() methods 
>>>>>>>>>>>>> really belongs to the UndoableEditLockSupport methods.
>>>>>>>>>>>>>      In this case there is no need for {@inheritDoc} tag.
>>>>>>>>>>>>>
>>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> "adding links of external classes directly to 
>>>>>>>>>>>>>>>>>> UndoManager" - Sorry, did not catch what are you 
>>>>>>>>>>>>>>>>>> about? Could you clarify?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> --Semyon
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> --Semyon
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> There is a mistake in your scenario steps: 
>>>>>>>>>>>>>>>>>>>>>>>>> fireUndoableEditUpdate() is called before the 
>>>>>>>>>>>>>>>>>>>>>>>>> freeing the lock (see 
>>>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument.handleInsertString() method).
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Yet another argument do not do this from 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the user experience: if user starts a long 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> edit operation and press undo after that 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> he expects when the long edit is finished 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it will be rolled back immediately. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>     It is not true. The first process adds 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> his undo edit to the UndoManager. While a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> user trying to press undo the second long 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> process can be started.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> That is what led to this issue because when 
>>>>>>>>>>>>>>>>>>>>>>>>>>> undo is in progress document writing should 
>>>>>>>>>>>>>>>>>>>>>>>>>>> be allowed.
>>>>>>>>>>>>>>>>>>>>>>>>>>> Sorry but I didn't see why is "It not true"? 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Then what is your expectation when you press 
>>>>>>>>>>>>>>>>>>>>>>>>>>> undo button while edit is not finished yet 
>>>>>>>>>>>>>>>>>>>>>>>>>>> and there is no way to abort it?
>>>>>>>>>>>>>>>>>>>>>>>>>>     It would be good if it works as you 
>>>>>>>>>>>>>>>>>>>>>>>>>> described. But it does not work in this way 
>>>>>>>>>>>>>>>>>>>>>>>>>> with or without your fix.
>>>>>>>>>>>>>>>>>>>>>>>>>>     undo() action has writeLock in 
>>>>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument and because of it is always 
>>>>>>>>>>>>>>>>>>>>>>>>>> executed after insert string action.
>>>>>>>>>>>>>>>>>>>>>>>>>>     If a user sees that undo is available, he 
>>>>>>>>>>>>>>>>>>>>>>>>>> can call it but the second long insertString 
>>>>>>>>>>>>>>>>>>>>>>>>>> process can start earlier and acquire the 
>>>>>>>>>>>>>>>>>>>>>>>>>> writeLock.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> That is what we are going to fix. And this 
>>>>>>>>>>>>>>>>>>>>>>>>> does work after this fix. Undo call will be 
>>>>>>>>>>>>>>>>>>>>>>>>> blocked by the long edit until the last is 
>>>>>>>>>>>>>>>>>>>>>>>>> done without any deadlocks. And when edit is 
>>>>>>>>>>>>>>>>>>>>>>>>> done undo() will acquire the lock and prevent 
>>>>>>>>>>>>>>>>>>>>>>>>> any new edits until undo() is done. Please 
>>>>>>>>>>>>>>>>>>>>>>>>> provide a scenario when in your opinion it 
>>>>>>>>>>>>>>>>>>>>>>>>> does not wok.
>>>>>>>>>>>>>>>>>>>>>>>>      The first process starts for 5 minutes. 
>>>>>>>>>>>>>>>>>>>>>>>> When it is finished a user sees that he can 
>>>>>>>>>>>>>>>>>>>>>>>> press undo. While he is pressing undo button, 
>>>>>>>>>>>>>>>>>>>>>>>> the second long process starts for 10 minutes 
>>>>>>>>>>>>>>>>>>>>>>>> and acquire the write lock. The user presses 
>>>>>>>>>>>>>>>>>>>>>>>> undo but he needs to wait 10 more minutes until 
>>>>>>>>>>>>>>>>>>>>>>>> the second process is finished.
>>>>>>>>>>>>>>>>>>>>>>> Actually, if two or more threads are waiting for 
>>>>>>>>>>>>>>>>>>>>>>> a monitor it is not determined which one will 
>>>>>>>>>>>>>>>>>>>>>>> get the control after the signal. To order that 
>>>>>>>>>>>>>>>>>>>>>>> the ReentrantLock API could be used but 
>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument uses wait/notify for locking. I 
>>>>>>>>>>>>>>>>>>>>>>> think it is not worth to dig so deep. It does 
>>>>>>>>>>>>>>>>>>>>>>> not cause any issues 
>>>>>>>>>>>>>>>>>>>>>>     The issue that is considered is "if user 
>>>>>>>>>>>>>>>>>>>>>> starts a long edit operation and press undo after 
>>>>>>>>>>>>>>>>>>>>>> that he expects when the long edit is finished it 
>>>>>>>>>>>>>>>>>>>>>> will be rolled back immediately."
>>>>>>>>>>>>>>>>>>>>>>     If you are agree that it is not always 
>>>>>>>>>>>>>>>>>>>>>> possible to do the roll back "immediately" there 
>>>>>>>>>>>>>>>>>>>>>> is no point to discussion.
>>>>>>>>>>>>>>>>>>>>> I agree. On that level it is not possible to 
>>>>>>>>>>>>>>>>>>>>> predict the order exactly in such scenario. But 
>>>>>>>>>>>>>>>>>>>>> the state of the document will be consistent. And 
>>>>>>>>>>>>>>>>>>>>> it is possible to have it predictable using lock 
>>>>>>>>>>>>>>>>>>>>> fairness.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> because undo() always get the last edit anyway. 
>>>>>>>>>>>>>>>>>>>>>>> If it will be important for somebody to preserve 
>>>>>>>>>>>>>>>>>>>>>>> the execution order on that level of details we 
>>>>>>>>>>>>>>>>>>>>>>> will fix it.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> So undo should be executed after the edit 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is fully performed because the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> corresponding UndoableEdit which undos 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this edit can be produced only after the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> edit is done.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think at first we need to look on the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> situation externally rather than 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> concentrate on implementation questions 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> like in which class do references go.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>    Yes, please look on this situation from 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> a user point of view which wants to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> implement simple Java Painter.
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>> But could you describe this scenario? Just 
>>>>>>>>>>>>>>>>>>>>>>>>>>> steps when this simple Painter fails under 
>>>>>>>>>>>>>>>>>>>>>>>>>>> the proposed fix?I
>>>>>>>>>>>>>>>>>>>>>>>>>>> Note, if this Painter's content is not an 
>>>>>>>>>>>>>>>>>>>>>>>>>>> AbstarctDocument it will work as before the 
>>>>>>>>>>>>>>>>>>>>>>>>>>> fix.
>>>>>>>>>>>>>>>>>>>>>>>>>>   Any application that uses UndoManager and 
>>>>>>>>>>>>>>>>>>>>>>>>>> wants to have the same synchronization (have 
>>>>>>>>>>>>>>>>>>>>>>>>>> the same lock both for UndoableEdit adding 
>>>>>>>>>>>>>>>>>>>>>>>>>> and undo() method execution) will have the 
>>>>>>>>>>>>>>>>>>>>>>>>>> same deadlock problems.
>>>>>>>>>>>>>>>>>>>>>>>>>>    As I have already written:
>>>>>>>>>>>>>>>>>>>>>>>>>> ---------------
>>>>>>>>>>>>>>>>>>>>>>>>>>    Consider someone writes Java Painter 
>>>>>>>>>>>>>>>>>>>>>>>>>> application where it is possible to draw 
>>>>>>>>>>>>>>>>>>>>>>>>>> lines and images and uses UndoManager for 
>>>>>>>>>>>>>>>>>>>>>>>>>> undo/redo actions.
>>>>>>>>>>>>>>>>>>>>>>>>>>    He might want that it was possible to work 
>>>>>>>>>>>>>>>>>>>>>>>>>> with copied images. He can get lock on ctrl+v 
>>>>>>>>>>>>>>>>>>>>>>>>>> action, process an image, prepare 
>>>>>>>>>>>>>>>>>>>>>>>>>> UndoableEdit and notify the UndoManager.
>>>>>>>>>>>>>>>>>>>>>>>>>>    He also can use lock/unlock in the undo 
>>>>>>>>>>>>>>>>>>>>>>>>>> action to have a consistent state with the 
>>>>>>>>>>>>>>>>>>>>>>>>>> processed image. If someone calls undo action 
>>>>>>>>>>>>>>>>>>>>>>>>>> during the image processing and gets a 
>>>>>>>>>>>>>>>>>>>>>>>>>> deadlock does it mean that link from Java 
>>>>>>>>>>>>>>>>>>>>>>>>>> Painter need to be added to the UndoManager?
>>>>>>>>>>>>>>>>>>>>>>>>>> ---------------
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> Still do not understand the steps for your 
>>>>>>>>>>>>>>>>>>>>>>>>> Painter scenario. A link (reference?) can be 
>>>>>>>>>>>>>>>>>>>>>>>>> added if it is required to implement 
>>>>>>>>>>>>>>>>>>>>>>>>> functionality. If the content is not an 
>>>>>>>>>>>>>>>>>>>>>>>>> AbstarctDocument it may be required to 
>>>>>>>>>>>>>>>>>>>>>>>>> implement custom UndoManager to support the 
>>>>>>>>>>>>>>>>>>>>>>>>> same behavior.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>     What is the difference between the 
>>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument and other classes (in Swing or 
>>>>>>>>>>>>>>>>>>>>>>>> user defined)? Do you mean that the UndoManager 
>>>>>>>>>>>>>>>>>>>>>>>> is intended only to be used with 
>>>>>>>>>>>>>>>>>>>>>>>> AbstractDocument and it shouldn't be used in 
>>>>>>>>>>>>>>>>>>>>>>>> other cases where undo/redo actions are 
>>>>>>>>>>>>>>>>>>>>>>>> required for non text data?
>>>>>>>>>>>>>>>>>>>>>>> No, undo manager can be used with any classes. 
>>>>>>>>>>>>>>>>>>>>>>> But since we have it assigned to 
>>>>>>>>>>>>>>>>>>>>>>> AbstarctDocument so often we need to do our best 
>>>>>>>>>>>>>>>>>>>>>>> to make undo manager working with it correctly 
>>>>>>>>>>>>>>>>>>>>>>> because users do not like deadlocks usualy. For 
>>>>>>>>>>>>>>>>>>>>>>> other classes we cannot provide synchronization 
>>>>>>>>>>>>>>>>>>>>>>> by default because there is no API to get the 
>>>>>>>>>>>>>>>>>>>>>>> lock. So it remains up to user how to provide 
>>>>>>>>>>>>>>>>>>>>>>> the undo manager synchronization with the object 
>>>>>>>>>>>>>>>>>>>>>>> it controls for other classes
>>>>>>>>>>>>>>>>>>>>>>     What we should do just to understand that the 
>>>>>>>>>>>>>>>>>>>>>> same deadlock can happen in an user applications 
>>>>>>>>>>>>>>>>>>>>>> because he wants to use the same synchronization 
>>>>>>>>>>>>>>>>>>>>>> both for the data processing and for the undo 
>>>>>>>>>>>>>>>>>>>>>> action. If so, there should be two investigations:
>>>>>>>>>>>>>>>>>>>>>>   1. Is it possible to achieve the requested 
>>>>>>>>>>>>>>>>>>>>>> goals without changing UndoManager? In other 
>>>>>>>>>>>>>>>>>>>>>> words The UndoManager should be used in proper 
>>>>>>>>>>>>>>>>>>>>>> way as it is required by its design.
>>>>>>>>>>>>>>>>>>>>>>   2. Is it possible to update the UndoManager API 
>>>>>>>>>>>>>>>>>>>>>> to provide functionality that meets new requests?
>>>>>>>>>>>>>>>>>>>>> With API change it is reachable. But I would 
>>>>>>>>>>>>>>>>>>>>> preserve the current API as less constrained. If 
>>>>>>>>>>>>>>>>>>>>> we add some methods for locking we will determine 
>>>>>>>>>>>>>>>>>>>>> the way how a user should synchronize his undoable 
>>>>>>>>>>>>>>>>>>>>> content. And user may not need any synchronization 
>>>>>>>>>>>>>>>>>>>>> at all. We should keep in mind this opportunity as 
>>>>>>>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>   Only after this discussion there can be a 
>>>>>>>>>>>>>>>>>>>>>> reason to look to other ways.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> I think our undo manager implementation do not 
>>>>>>>>>>>>>>>>>>>>>>> pretend to be used as the global undo manager 
>>>>>>>>>>>>>>>>>>>>>>> for big complex applications and it cannot cover 
>>>>>>>>>>>>>>>>>>>>>>> all possible undo approaches. But some basic 
>>>>>>>>>>>>>>>>>>>>>>> functionality can be provided and it should be 
>>>>>>>>>>>>>>>>>>>>>>> usable. Without edits serialization approach it 
>>>>>>>>>>>>>>>>>>>>>>> is not usable for multithreaded use. So either 
>>>>>>>>>>>>>>>>>>>>>>> we do not pretend to provide a multithreaded 
>>>>>>>>>>>>>>>>>>>>>>> undo manager and remove all synchronize keywords 
>>>>>>>>>>>>>>>>>>>>>>> from UndoManager class, either we need to 
>>>>>>>>>>>>>>>>>>>>>>> support serialization approach which does not 
>>>>>>>>>>>>>>>>>>>>>>> cause deadlocks.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>  Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>  Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>> I don't see a contradiction here, could you 
>>>>>>>>>>>>>>>>>>>>>>>>> point on it more precisely?
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>  Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>  Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>    Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --Semyon
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --Semyon
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 7/30/2015 5:27 PM, Alexander 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Scherbatiy wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    Consider someone writes Java 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Painter application where it is 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> possible to draw lines and images and 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> uses UndoManager for undo/redo actions.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    He might want that it was possible 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to work with copied images. He can 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> get lock on ctrl+v action, process an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> image, prepare UndoableEdit and 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> notify the UndoManager.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    He also can use lock/unlock in the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> undo action to have a consistent 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> state with the processed image. If 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> someone calls undo action during the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> image processing and gets a deadlock 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> does it mean that link from Java 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Painter need to be added to the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManager?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It looks like AbstractDocument 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> violates UndoManager 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> synchronization contract when it 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> both use lock to work with 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UndoManager and in the implemented 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> undo() method.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   Alexandr.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --Semyon
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>




More information about the swing-dev mailing list