fix leak of direct byte buffers

This commit is contained in:
Maxim.Mossienko
2012-06-01 23:43:14 +04:00
parent d790c05d58
commit 90b39d9706
2 changed files with 24 additions and 17 deletions
@@ -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<Object>() {
@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;
}
}
@@ -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<Object>() {
@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) {