From: <sh...@us...> - 2011-05-13 12:35:28
|
Revision: 19532 http://jedit.svn.sourceforge.net/jedit/?rev=19532&view=rev Author: shlomy Date: 2011-05-13 12:35:21 +0000 (Fri, 13 May 2011) Log Message: ----------- Fixed a deadlock when dragging a file from a file manager into jEdit. Dropping the file in jEdit causes a background thread to add it to the edit pane and then synchronously send an EditPaneUpdate message (where the EBHandlers are invoked in the AWT-EventQueue thread). The background thread holds the bufferListLock, and the handler in ConfigurableFoldPlugin (which runs in the AWT-EventQueue thread) calls getBuffers() which blocks on it - causing a deadlock. getBuffers() was called in order to remove bufferStrings entries for closed buffers; however, the right way to clean bufferStrings is by listening to BufferUpdate.CLOSED messages and removing the closed buffer from the map. Modified Paths: -------------- plugins/ConfigurableFoldHandler/trunk/configurablefoldhandler/ConfigurableFoldHandlerPlugin.java Modified: plugins/ConfigurableFoldHandler/trunk/configurablefoldhandler/ConfigurableFoldHandlerPlugin.java =================================================================== --- plugins/ConfigurableFoldHandler/trunk/configurablefoldhandler/ConfigurableFoldHandlerPlugin.java 2011-05-12 18:42:00 UTC (rev 19531) +++ plugins/ConfigurableFoldHandler/trunk/configurablefoldhandler/ConfigurableFoldHandlerPlugin.java 2011-05-13 12:35:21 UTC (rev 19532) @@ -25,7 +25,6 @@ import java.io.File; import java.util.HashMap; -import java.util.Iterator; import javax.swing.JOptionPane; @@ -41,7 +40,6 @@ import org.gjt.sp.jedit.io.VFSManager; import org.gjt.sp.jedit.msg.BufferUpdate; import org.gjt.sp.jedit.msg.PropertiesChanged; -import org.gjt.sp.jedit.msg.EditPaneUpdate; import org.gjt.sp.jedit.textarea.JEditTextArea; import org.gjt.sp.jedit.textarea.Selection; @@ -81,15 +79,6 @@ readProperties(); } - @EBHandler - public void handleEditPaneUpdate(EditPaneUpdate epu) - { - // the only message I can see when a buffer is closed is this one - // so at this point check if the old buffer has closed - if (epu.getWhat().equals(EditPaneUpdate.BUFFER_CHANGED)) - checkBuffers(); - } - private static String getFoldFileFor(Buffer buffer) { String path = buffer.getPath(); @@ -100,6 +89,7 @@ // Loads persistent manual folds for a loaded buffer, and saves // persistent manual folds for a closed / saved buffer. + // Removes a closed buffer from bufferStrings. @EBHandler public void handleBufferUpdate(BufferUpdate bu) { @@ -132,30 +122,11 @@ if (mf != null) mf.save(path); } + // Remove a closed buffer from bufferStrings + if (what.equals(BufferUpdate.CLOSED)) + bufferStrings.remove(buffer); } - /** - * checks if any of the buffers with their own fold strings have closed and - * if so removes references to them from bufferStrings - */ - private void checkBuffers() - { - Buffer[] buffers = jEdit.getBuffers(); - int i; - -loop: for(Iterator<JEditBuffer> iter = bufferStrings.keySet().iterator(); - iter.hasNext(); ) - { - Buffer curBuffer = (Buffer)iter.next(); - - for(i = 0; i < buffers.length; i++) - if(buffers[i] == curBuffer) - continue loop; - - bufferStrings.remove(curBuffer); - } - } - public void start() { super.start(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |