From 90b39d97067a43621de99604a7b8ab4a7a6fe1ff Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 1 Jun 2012 23:41:05 +0400 Subject: [PATCH] fix leak of direct byte buffers --- .../intellij/util/io/DirectBufferWrapper.java | 23 +++++++++++++++++++ .../intellij/util/io/MappedBufferWrapper.java | 18 +-------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/platform/util/src/com/intellij/util/io/DirectBufferWrapper.java b/platform/util/src/com/intellij/util/io/DirectBufferWrapper.java index 00049a0619fa..329d2704239b 100644 --- a/platform/util/src/com/intellij/util/io/DirectBufferWrapper.java +++ b/platform/util/src/com/intellij/util/io/DirectBufferWrapper.java @@ -16,10 +16,15 @@ package com.intellij.util.io; import com.intellij.openapi.diagnostic.Logger; +import org.jetbrains.annotations.Nullable; +import sun.misc.Cleaner; +import sun.nio.ch.DirectBuffer; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; public abstract class DirectBufferWrapper extends ByteBufferWrapper { protected static final Logger LOG = Logger.getInstance("#com.intellij.util.io.DirectBufferWrapper"); @@ -49,6 +54,24 @@ public abstract class DirectBufferWrapper extends ByteBufferWrapper { @Override public void unmap() { if (isDirty()) flush(); + if (myBuffer != null) disposeDirectBuffer((DirectBuffer)myBuffer); myBuffer = null; } + + static boolean disposeDirectBuffer(final DirectBuffer buffer) { + return AccessController.doPrivileged(new PrivilegedAction() { + @Nullable + public Object run() { + try { + Cleaner cleaner = buffer.cleaner(); + if (cleaner != null) cleaner.clean(); // Already cleaned otherwise + return null; + } + catch (Exception e) { + return buffer; + } + } + }) == null; + } + } diff --git a/platform/util/src/com/intellij/util/io/MappedBufferWrapper.java b/platform/util/src/com/intellij/util/io/MappedBufferWrapper.java index 0f86ffa4d433..56ce86c62e7a 100644 --- a/platform/util/src/com/intellij/util/io/MappedBufferWrapper.java +++ b/platform/util/src/com/intellij/util/io/MappedBufferWrapper.java @@ -16,16 +16,12 @@ package com.intellij.util.io; import com.intellij.openapi.diagnostic.Logger; -import org.jetbrains.annotations.Nullable; -import sun.misc.Cleaner; import sun.nio.ch.DirectBuffer; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; -import java.security.AccessController; -import java.security.PrivilegedAction; /** * @author max @@ -81,19 +77,7 @@ public abstract class MappedBufferWrapper extends ByteBufferWrapper { return false; } - return AccessController.doPrivileged(new PrivilegedAction() { - @Nullable - public Object run() { - try { - Cleaner cleaner = ((DirectBuffer)buffer).cleaner(); - if (cleaner != null) cleaner.clean(); // Already cleaned otherwise - return null; - } - catch (Exception e) { - return buffer; - } - } - }) == null; + return DirectBufferWrapper.disposeDirectBuffer((DirectBuffer)buffer); } private static boolean tryForce(MappedByteBuffer buffer) {