mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fix leak of direct byte buffers
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user