From d10553d12ab9d08e95fec5fbe69e018691d49fe2 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Sun, 7 Dec 2025 12:26:56 +0100 Subject: [PATCH] Take the GIL in sequence and list wrappers (cherry picked from commit 698bf009871a4eeb9fba6d263ca6ad5ee16e0a08) --- src/runtime/CollectionWrappers/ListWrapper.cs | 3 +++ .../CollectionWrappers/SequenceWrapper.cs | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/runtime/CollectionWrappers/ListWrapper.cs b/src/runtime/CollectionWrappers/ListWrapper.cs index 41ccb8fae..91c156c32 100644 --- a/src/runtime/CollectionWrappers/ListWrapper.cs +++ b/src/runtime/CollectionWrappers/ListWrapper.cs @@ -14,12 +14,14 @@ public T this[int index] { get { + using var _ = Py.GIL(); var item = Runtime.PyList_GetItem(pyObject, index); var pyItem = new PyObject(item); return pyItem.As()!; } set { + using var _ = Py.GIL(); var pyItem = value.ToPython(); var result = Runtime.PyList_SetItem(pyObject, index, new NewReference(pyItem).Steal()); if (result == -1) @@ -37,6 +39,7 @@ public void Insert(int index, T item) if (IsReadOnly) throw new InvalidOperationException("Collection is read-only"); + using var _ = Py.GIL(); var pyItem = item.ToPython(); int result = Runtime.PyList_Insert(pyObject, index, pyItem); diff --git a/src/runtime/CollectionWrappers/SequenceWrapper.cs b/src/runtime/CollectionWrappers/SequenceWrapper.cs index fcc5c23f4..feb0e515d 100644 --- a/src/runtime/CollectionWrappers/SequenceWrapper.cs +++ b/src/runtime/CollectionWrappers/SequenceWrapper.cs @@ -14,10 +14,14 @@ public int Count { get { - var size = Runtime.PySequence_Size(pyObject.Reference); - if (size == -1) + nint size = -1; { - Runtime.CheckExceptionOccurred(); + using var _ = Py.GIL(); + size = Runtime.PySequence_Size(pyObject.Reference); + if (size == -1) + { + Runtime.CheckExceptionOccurred(); + } } return checked((int)size); @@ -38,6 +42,7 @@ public void Clear() { if (IsReadOnly) throw new NotImplementedException(); + using var _ = Py.GIL(); int result = Runtime.PySequence_DelSlice(pyObject, 0, Count); if (result == -1) { @@ -77,12 +82,16 @@ protected bool removeAt(int index) if (index >= Count || index < 0) return false; - int result = Runtime.PySequence_DelItem(pyObject, index); - if (result == 0) - return true; + { + using var _ = Py.GIL(); + int result = Runtime.PySequence_DelItem(pyObject, index); + + if (result == 0) + return true; - Runtime.CheckExceptionOccurred(); + Runtime.CheckExceptionOccurred(); + } return false; }