Index: src/org/openide/text/DocumentLine.java =================================================================== RCS file: /cvs/openide/src/org/openide/text/DocumentLine.java,v retrieving revision 1.51 diff -u -r1.51 DocumentLine.java --- src/org/openide/text/DocumentLine.java 30 Sep 2003 16:45:38 -0000 1.51 +++ src/org/openide/text/DocumentLine.java 8 Dec 2003 14:54:26 -0000 @@ -892,7 +892,7 @@ int newLine = listener.getLine (line); int offset = NbDocument.findLineOffset (listener.doc, newLine); - return this.registerLine(createLine(offset)); + return safelyRegisterLine(createLine(offset)); } /* Creates current line. @@ -903,7 +903,7 @@ public Line getCurrent (int line) throws IndexOutOfBoundsException { int offset = NbDocument.findLineOffset (listener.doc, line); - return this.registerLine(createLine(offset)); + return safelyRegisterLine(createLine(offset)); } /** Creates a {@link Line} for a given offset. @@ -912,6 +912,26 @@ */ protected abstract Line createLine (int offset); + /** Registers line, but only after obtaining the lock of the document. + * This is a fix to issue 37767 as this creates ordering of locks (first + * of all obtain documentrenderer, then ask for any other locks like + * Line.Set.lines. + * + * @param line line we want to register + * @return the line or some line that already was registered + */ + private Line safelyRegisterLine (final Line line) { + class DocumentRenderer implements Runnable { + public Line result; + + public void run () { + result = DocumentLine.Set.super.registerLine (line); + } + } + DocumentRenderer renderer = new DocumentRenderer (); + listener.doc.render (renderer); + return renderer.result; + } }