Skip to content

Commit 4b7b875

Browse files
committed
bulk close only every so often
1 parent 6995b60 commit 4b7b875

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

graalpython/com.oracle.graal.python.jni/src/hpy_jni.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ static JNIEnv* jniEnv;
7171
UPCALL(TypeGenericNew, SIG_HPY, SIG_HPY) \
7272
UPCALL(AsStruct, SIG_HPY, SIG_PTR) \
7373
UPCALL(Close, SIG_HPY, SIG_VOID) \
74+
UPCALL(BulkClose, SIG_PTR SIG_INT, SIG_VOID) \
7475
UPCALL(FloatFromDouble, SIG_DOUBLE, SIG_HPY) \
7576
UPCALL(FloatAsDouble, SIG_HPY, SIG_DOUBLE) \
7677
UPCALL(LongAsLong, SIG_HPY, SIG_LONG) \
@@ -322,12 +323,25 @@ static HPy augment_LongFromLong(HPyContext *ctx, long l) {
322323
}
323324
}
324325

326+
#define MAX_UNCLOSED_HANDLES 32
327+
static int32_t unclosedHandleTop = 0;
328+
static uint64_t unclosedHandles[MAX_UNCLOSED_HANDLES] = { 0 };
329+
325330
static void augment_Close(HPyContext *ctx, HPy h) {
326331
uint64_t bits = toBits(h);
327332
if (!bits) {
328333
return;
329334
} else if (isBoxedHandle(bits)) {
330-
return original_Close(ctx, h);
335+
if (bits < IMMUTABLE_HANDLES) {
336+
return;
337+
}
338+
if (unclosedHandleTop < MAX_UNCLOSED_HANDLES) {
339+
unclosedHandles[unclosedHandleTop++] = bits;
340+
} else {
341+
DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), BulkClose, unclosedHandles, unclosedHandleTop);
342+
memset(unclosedHandles, 0, sizeof(uint64_t) * unclosedHandleTop);
343+
unclosedHandleTop = 0;
344+
}
331345
}
332346
}
333347

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContext.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ public enum Counter {
13731373
UpcallTrackerClose,
13741374
UpcallTrackerAdd,
13751375
UpcallClose,
1376+
UpcallBulkClose,
13761377
UpcallTrackerNew,
13771378
UpcallGetItemI,
13781379
UpcallSetItem,
@@ -1571,6 +1572,17 @@ public final void ctxClose(long handle) {
15711572
closeNativeHandle(handle);
15721573
}
15731574

1575+
public final void ctxBulkClose(long unclosedHandlePtr, int size) {
1576+
Counter.UpcallBulkClose.increment();
1577+
for (int i = 0; i < size; i++) {
1578+
long handle = unsafe.getLong(unclosedHandlePtr);
1579+
unclosedHandlePtr += 8;
1580+
assert GraalHPyBoxing.isBoxedHandle(handle);
1581+
assert handle >= IMMUTABLE_HANDLE_COUNT;
1582+
getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)).closeAndInvalidate(this);
1583+
}
1584+
}
1585+
15741586
public final long ctxDup(long handle) {
15751587
Counter.UpcallDup.increment();
15761588
if (GraalHPyBoxing.isBoxedHandle(handle)) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/resources/jni-config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
{"name":"ctxSetItemi","parameterTypes":["long","long","long"] },
1414
{"name":"ctxLength","parameterTypes":["long"] },
1515
{"name":"ctxListCheck","parameterTypes":["long"] },
16+
{"name":"ctxBulkClose","parameterTypes":["long","int"] },
1617
{"name":"ctxListNew","parameterTypes":["long"] },
1718
{"name":"ctxLongAsLong","parameterTypes":["long"] },
1819
{"name":"ctxLongAsDouble","parameterTypes":["long"] },

0 commit comments

Comments
 (0)