Skip to content

Commit 3d04110

Browse files
committed
Simpler and direct raw malloc, realloc, free calls
1 parent 39c9be7 commit 3d04110

File tree

6 files changed

+46
-16
lines changed

6 files changed

+46
-16
lines changed

lib/truffle/truffle/fiddle_backend.rb

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,15 @@ def self.dlunwrap(*args)
154154
end
155155

156156
def self.malloc(size)
157-
ptr = Truffle::FFI::MemoryPointer.new(size)
158-
ptr.autorelease = false
159-
ptr.to_i
157+
Truffle.invoke_primitive :pointer_raw_malloc, size
160158
end
161159

162-
def self.realloc(*args)
163-
raise 'not implemented'
160+
def self.realloc(address, size)
161+
Truffle.invoke_primitive :pointer_raw_realloc, address, size
164162
end
165163

166-
def self.free(*args)
167-
raise 'not implemented'
164+
def self.free(address)
165+
Truffle.invoke_primitive :pointer_raw_free, address
168166
end
169167

170168
class Function

src/main/java/org/truffleruby/cext/ValueWrapperManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void addFinalizer(ValueWrapper wrapper, Pointer handle) {
117117
private Runnable createFinalizer(Pointer handle) {
118118
return () -> {
119119
this.removeFromHandleMap(handle.getAddress());
120-
handle.freeNoAutorelease();
120+
handle.free();
121121
};
122122

123123
}

src/main/java/org/truffleruby/core/support/IONodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ public static Pointer getBuffer(RubyContext context, long size) {
490490
if (buffer.getSize() >= size) {
491491
return buffer;
492492
} else {
493-
buffer.freeNoAutorelease();
493+
buffer.free();
494494
final Pointer newBuffer = Pointer.malloc(Math.max(size * 2, 1024));
495495
Layouts.THREAD.setIoBuffer(rubyThread, newBuffer);
496496
return newBuffer;

src/main/java/org/truffleruby/core/thread/ThreadManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ public void cleanup(DynamicObject thread, Thread javaThread) {
337337
final FiberManager fiberManager = Layouts.THREAD.getFiberManager(thread);
338338
fiberManager.shutdown(javaThread);
339339

340-
Layouts.THREAD.getIoBuffer(thread).freeNoAutorelease();
340+
Layouts.THREAD.getIoBuffer(thread).free();
341341

342342
unregisterThread(thread);
343343
Layouts.THREAD.setThread(thread, null);

src/main/java/org/truffleruby/extra/ffi/Pointer.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public Pointer(long address, long size) {
6060
this.size = size;
6161
}
6262

63+
public Pointer realloc(long size) {
64+
return new Pointer(UNSAFE.reallocateMemory(address, size));
65+
}
66+
6367
public void writeByte(long offset, byte b) {
6468
assert address + offset != 0;
6569
UNSAFE.putByte(address + offset, b);
@@ -225,17 +229,14 @@ public synchronized void free(FinalizationService finalizationService) {
225229
UNSAFE.freeMemory(address);
226230
}
227231

228-
@TruffleBoundary
229-
public synchronized void freeNoAutorelease() {
230-
if (autorelease) {
231-
throw new UnsupportedOperationException("Calling freeNoAutorelease() on a autorelease Pointer");
232-
}
232+
public synchronized void free() {
233+
assert !autorelease;
233234
UNSAFE.freeMemory(address);
234235
}
235236

236237
@Override
237238
public void close() {
238-
freeNoAutorelease();
239+
free();
239240
}
240241

241242
public long getAddress() {

src/main/java/org/truffleruby/extra/ffi/PointerNodes.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,4 +928,35 @@ public DynamicObject writePointer(long address, long value) {
928928

929929
}
930930

931+
@Primitive(name = "pointer_raw_malloc")
932+
public static abstract class PointerRawMallocPrimitiveNode extends PrimitiveArrayArgumentsNode {
933+
934+
@Specialization
935+
public long malloc(long size) {
936+
return Pointer.malloc(size).getAddress();
937+
}
938+
939+
}
940+
941+
@Primitive(name = "pointer_raw_realloc")
942+
public static abstract class PointerRawReallocPrimitiveNode extends PrimitiveArrayArgumentsNode {
943+
944+
@Specialization
945+
public long malloc(long address, long size) {
946+
return new Pointer(address).realloc(size).getAddress();
947+
}
948+
949+
}
950+
951+
@Primitive(name = "pointer_raw_free")
952+
public static abstract class PointerRawFreePrimitiveNode extends PrimitiveArrayArgumentsNode {
953+
954+
@Specialization
955+
public long free(long address) {
956+
new Pointer(address).free();
957+
return address;
958+
}
959+
960+
}
961+
931962
}

0 commit comments

Comments
 (0)