### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/BufferCache.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BufferCache.java,v retrieving revision 1.16 diff -u -r1.16 BufferCache.java --- model/org/eclipse/jdt/internal/core/BufferCache.java 10 May 2006 18:03:47 -0000 1.16 +++ model/org/eclipse/jdt/internal/core/BufferCache.java 27 Feb 2007 16:35:14 -0000 @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.jdt.internal.core; +import java.util.ArrayList; + import org.eclipse.jdt.core.IBuffer; import org.eclipse.jdt.internal.core.util.LRUCache; @@ -17,6 +19,8 @@ * An LRU cache of IBuffers. */ public class BufferCache extends OverflowingLRUCache { + + private ArrayList buffersToClose = new ArrayList(); /** * Constructs a new buffer cache of the given size. */ @@ -44,10 +48,18 @@ if (!((Openable)buffer.getOwner()).canBufferBeRemovedFromCache(buffer)) { return false; } else { - buffer.close(); + this.buffersToClose.add(buffer); return true; } } + +void closeBuffers() { + ArrayList buffers = this.buffersToClose; + this.buffersToClose = new ArrayList(); + for (int i = 0, length = buffers.size(); i < length; i++) { + ((IBuffer) buffers.get(i)).close(); + } +} /** * Returns a new instance of the reciever. */ Index: model/org/eclipse/jdt/internal/core/BufferManager.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/BufferManager.java,v retrieving revision 1.24 diff -u -r1.24 BufferManager.java --- model/org/eclipse/jdt/internal/core/BufferManager.java 10 May 2006 18:03:47 -0000 1.24 +++ model/org/eclipse/jdt/internal/core/BufferManager.java 27 Feb 2007 16:35:14 -0000 @@ -32,7 +32,7 @@ * LRU cache of buffers. The key and value for an entry * in the table is the identical buffer. */ - protected OverflowingLRUCache openBuffers = new BufferCache(60); + private BufferCache openBuffers = new BufferCache(60); /** * @deprecated @@ -54,7 +54,11 @@ String owner = ((Openable)buffer.getOwner()).toStringWithAncestors(); System.out.println("Adding buffer for " + owner); //$NON-NLS-1$ } - this.openBuffers.put(buffer.getOwner(), buffer); + synchronized (this.openBuffers) { + this.openBuffers.put(buffer.getOwner(), buffer); + } + // close buffers that were removed from the cache if space was needed + this.openBuffers.closeBuffers(); if (VERBOSE) { System.out.println("-> Buffer cache filling ratio = " + NumberFormat.getInstance().format(this.openBuffers.fillingRatio()) + "%"); //$NON-NLS-1$//$NON-NLS-2$ } @@ -74,7 +78,9 @@ * buffer associated with it. */ public IBuffer getBuffer(IOpenable owner) { - return (IBuffer)this.openBuffers.get(owner); + synchronized (this.openBuffers) { + return (IBuffer)this.openBuffers.get(owner); + } } /** * Returns the default buffer manager. @@ -101,10 +107,14 @@ * @return Enumeration of IBuffer */ public Enumeration getOpenBuffers() { + Enumeration result; synchronized (this.openBuffers) { this.openBuffers.shrink(); - return this.openBuffers.elements(); + result = this.openBuffers.elements(); } + // close buffers that were removed from the cache if space was needed + this.openBuffers.closeBuffers(); + return result; } /** @@ -115,7 +125,11 @@ String owner = ((Openable)buffer.getOwner()).toStringWithAncestors(); System.out.println("Removing buffer for " + owner); //$NON-NLS-1$ } - this.openBuffers.remove(buffer.getOwner()); + synchronized (this.openBuffers) { + this.openBuffers.remove(buffer.getOwner()); + } + // close buffers that were removed from the cache (should be only one) + this.openBuffers.closeBuffers(); if (VERBOSE) { System.out.println("-> Buffer cache filling ratio = " + NumberFormat.getInstance().format(this.openBuffers.fillingRatio()) + "%"); //$NON-NLS-1$//$NON-NLS-2$ }