src.org.python.modules.jffi.AllocatedNativeMemory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-installer Show documentation
Show all versions of jython-installer Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
package org.python.modules.jffi;
import org.python.core.Py;
class AllocatedNativeMemory extends BoundedNativeMemory implements AllocatedDirectMemory {
private volatile boolean released = false;
private volatile boolean autorelease = true;
/** The real memory address */
private final long storage;
/**
* Allocates native memory
*
* @param size The number of bytes to allocate
* @param clear Whether the memory should be cleared (zeroed)
* @return A new {@link AllocatedDirectMemory}
*/
static final AllocatedNativeMemory allocate(int size, boolean clear) {
return allocateAligned(size, 1, clear);
}
/**
* Allocates native memory, aligned to a minimum boundary.
*
* @param size The number of bytes to allocate
* @param align The minimum alignment of the memory
* @param clear Whether the memory should be cleared (zeroed)
* @return A new {@link AllocatedDirectMemory}
*/
static final AllocatedNativeMemory allocateAligned(int size, int align, boolean clear) {
long memory = IO.allocateMemory(size + align - 1, clear);
if (memory == 0) {
throw Py.RuntimeError("failed to allocate " + size + " bytes");
}
return new AllocatedNativeMemory(memory, size, align);
}
private AllocatedNativeMemory(long address, int size, int align) {
super(((address - 1) & ~(align - 1)) + align, size);
this.storage = address;
}
public void free() {
if (!released) {
IO.freeMemory(storage);
released = true;
}
}
public void setAutoRelease(boolean release) {
this.autorelease = release;
}
@Override
protected void finalize() throws Throwable {
try {
if (!released && autorelease) {
IO.freeMemory(storage);
released = true;
}
} finally {
super.finalize();
}
}
}