|
49 | 49 | import java.util.Arrays; |
50 | 50 | import java.util.HashMap; |
51 | 51 | import java.util.HashSet; |
| 52 | +import java.util.Iterator; |
| 53 | +import java.util.Map.Entry; |
52 | 54 | import java.util.Set; |
53 | 55 | import java.util.WeakHashMap; |
54 | 56 | import java.util.concurrent.ConcurrentHashMap; |
@@ -643,26 +645,34 @@ private static boolean tableEntryRemoved(HandleContext context, PythonNativeWrap |
643 | 645 | return true; |
644 | 646 | } |
645 | 647 |
|
646 | | - public static void freeNativeReplacementStructs(PythonContext context, HandleContext handleContext) { |
| 648 | + public static void deallocNativeReplacements(PythonContext context, HandleContext handleContext) { |
647 | 649 | assert context.ownsGil(); |
648 | 650 | ArrayList<Long> referencesToBeFreed = new ArrayList<>(); |
| 651 | + Iterator<Entry<Long, IdReference<?>>> iterator = handleContext.nativeLookup.entrySet().iterator(); |
| 652 | + while (iterator.hasNext()) { |
| 653 | + IdReference<?> ref = iterator.next().getValue(); |
| 654 | + if (ref instanceof PythonObjectReference reference) { |
| 655 | + if (!reference.isAllocatedFromJava()) { |
| 656 | + // This memory must be free from C |
| 657 | + referencesToBeFreed.add(reference.pointer); |
| 658 | + iterator.remove(); |
| 659 | + } |
| 660 | + } |
| 661 | + } |
| 662 | + releaseNativeObjects(context, referencesToBeFreed); |
| 663 | + } |
| 664 | + |
| 665 | + public static void freeNativeReplacementStructs(PythonContext context, HandleContext handleContext) { |
| 666 | + assert context.ownsGil(); |
649 | 667 | handleContext.nativeLookup.forEach((l, ref) -> { |
650 | 668 | if (ref instanceof PythonObjectReference reference) { |
651 | 669 | // We don't expect references to wrappers that would have a native object stub. |
652 | 670 | assert reference.handleTableIndex == -1; |
653 | | - /* |
654 | | - * The ref may denote: (a) class wrappers, where some of them are backed by static |
655 | | - * native memory and some of them were allocated in heap, and (b) struct wrappers, |
656 | | - * which may be freed manually in a separate step. |
657 | | - */ |
658 | | - if (reference.isAllocatedFromJava()) { |
659 | | - freeNativeStruct(reference); |
660 | | - } else { |
661 | | - referencesToBeFreed.add(reference.pointer); |
662 | | - } |
| 671 | + // We expect at this point that there are only references allocated from Java |
| 672 | + assert reference.isAllocatedFromJava(); |
| 673 | + freeNativeStruct(reference); |
663 | 674 | } |
664 | 675 | }); |
665 | | - releaseNativeObjects(context, referencesToBeFreed); |
666 | 676 | handleContext.nativeLookup.clear(); |
667 | 677 | } |
668 | 678 |
|
|
0 commit comments