Skip to content

Commit 6a92c8d

Browse files
committed
[GR-24233] Do not eagerly remove resurrected native object references.
PullRequest: graalpython/1041
2 parents 1510d4b + 281138c commit 6a92c8d

File tree

2 files changed

+24
-36
lines changed
  • graalpython
    • com.oracle.graal.python.cext/src
    • com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi

2 files changed

+24
-36
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -402,18 +402,23 @@ Py_ssize_t PyTruffle_SUBREF(PyObject* obj, Py_ssize_t value) {
402402
Py_ssize_t PyTruffle_bulk_SUBREF(PyObject* ptrArray[], Py_ssize_t values[], int64_t len) {
403403
int64_t i;
404404
PyObject* obj;
405+
Py_ssize_t value;
405406

406407
for (i=0; i < len; i++) {
407408
obj = ptrArray[i];
408-
Py_ssize_t new_value = ((obj->ob_refcnt) -= values[i]);
409-
if (new_value == 0) {
410-
_Py_Dealloc(obj);
411-
}
409+
value = values[i];
410+
/* IMPORTANT: 'value == 0' indicates we should not process the reference at all */
411+
if (value > 0) {
412+
Py_ssize_t new_value = ((obj->ob_refcnt) -= value);
413+
if (new_value == 0) {
414+
_Py_Dealloc(obj);
415+
}
412416
#ifdef Py_REF_DEBUG
413-
else if (new_value < 0) {
414-
_Py_NegativeRefcount(filename, lineno, op);
415-
}
417+
else if (new_value < 0) {
418+
_Py_NegativeRefcount(filename, lineno, op);
419+
}
416420
#endif
421+
}
417422
}
418423
return 0;
419424
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import java.lang.ref.Reference;
4444
import java.lang.ref.ReferenceQueue;
4545
import java.lang.ref.WeakReference;
46-
import java.util.ArrayDeque;
4746
import java.util.ArrayList;
4847
import java.util.Arrays;
4948
import java.util.HashMap;
@@ -319,7 +318,6 @@ public Object execute(VirtualFrame frame) {
319318
CalleeContext.enter(frame, customLocalsProfile);
320319
try {
321320
NativeObjectReference[] nativeObjectReferences = (NativeObjectReference[]) PArguments.getArgument(frame, 0);
322-
NativeObjectReference nativeObjectReference;
323321
int cleaned = 0;
324322
long allocatedNativeMem = cApiContext.allocatedMemory;
325323
long startTime = 0;
@@ -339,18 +337,23 @@ public Object execute(VirtualFrame frame) {
339337
}
340338

341339
for (int i = 0; i < n; i++) {
342-
nativeObjectReference = nativeObjectReferences[i];
343-
cApiContext.nativeObjectWrapperList.remove(nativeObjectReference.id);
340+
NativeObjectReference nativeObjectReference = nativeObjectReferences[i];
344341
Object pointerObject = nativeObjectReference.ptrObject;
345-
if (!nativeObjectReference.resurrect && !pointerObjectLib.isNull(pointerObject)) {
346-
cApiContext.checkAccess(pointerObject, pointerObjectLib);
347-
LOGGER.finer(() -> "Cleaning native object reference to " + CApiContext.asHex(pointerObject));
348-
cleaned++;
342+
if (!nativeObjectReference.resurrect) {
343+
cApiContext.nativeObjectWrapperList.remove(nativeObjectReference.id);
344+
if (!nativeObjectReference.resurrect && !pointerObjectLib.isNull(pointerObject)) {
345+
cApiContext.checkAccess(pointerObject, pointerObjectLib);
346+
LOGGER.finer(() -> "Cleaning native object reference to " + CApiContext.asHex(pointerObject));
347+
cleaned++;
348+
}
349349
}
350350
}
351351
} else {
352352
for (int i = 0; i < n; i++) {
353-
cApiContext.nativeObjectWrapperList.remove(nativeObjectReferences[i].id);
353+
NativeObjectReference nativeObjectReference = nativeObjectReferences[i];
354+
if (!nativeObjectReference.resurrect) {
355+
cApiContext.nativeObjectWrapperList.remove(nativeObjectReference.id);
356+
}
354357
}
355358
}
356359

@@ -377,26 +380,6 @@ public Object execute(VirtualFrame frame) {
377380
return PNone.NONE;
378381
}
379382

380-
@TruffleBoundary
381-
private static NativeObjectReference pollFirst(ArrayDeque<NativeObjectReference> deque) {
382-
return deque.pollFirst();
383-
}
384-
385-
@TruffleBoundary
386-
private static int size(ArrayList<NativeObjectReference> deque) {
387-
return deque.size();
388-
}
389-
390-
@TruffleBoundary
391-
private static NativeObjectReference get(ArrayList<NativeObjectReference> deque, int i) {
392-
return deque.get(i);
393-
}
394-
395-
@TruffleBoundary
396-
private static NativeObjectReference clear(ArrayList<NativeObjectReference> deque, int i) {
397-
return deque.set(i, null);
398-
}
399-
400383
@Override
401384
public Signature getSignature() {
402385
return SIGNATURE;

0 commit comments

Comments
 (0)