addPending = new();
+ public static void AddNamespace(string name) => addPending.Enqueue(name);
+
+ internal static int AddPendingNamespaces()
+ {
+ int added = 0;
+ while (addPending.TryDequeue(out string ns))
+ {
+ AddNamespaceWithGIL(ns);
+ added++;
+ }
+ return added;
+ }
+
+ internal static void AddNamespaceWithGIL(string name)
{
var pyNs = Runtime.PyString_FromString(name);
try
{
- var nsSet = Runtime.PyDict_GetItemString(new BorrowedReference(root.dict), availableNsKey);
+ var nsSet = Runtime.PyDict_GetItemString(root.DictRef, availableNsKey);
if (!(nsSet.IsNull || nsSet.DangerousGetAddress() == Runtime.PyNone))
{
if (Runtime.PySet_Add(nsSet, new BorrowedReference(pyNs)) != 0)
diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs
index c2614b1d8..569d2e00c 100644
--- a/src/runtime/moduleobject.cs
+++ b/src/runtime/moduleobject.cs
@@ -535,8 +535,9 @@ public static Assembly AddReference(string name)
// method because it may be called from other threads, leading to deadlocks
// if it is called while Python code is executing.
var currNs = AssemblyManager.GetNamespaces().Except(origNs);
- foreach(var ns in currNs){
- ImportHook.AddNamespace(ns);
+ foreach(var ns in currNs)
+ {
+ ImportHook.AddNamespaceWithGIL(ns);
}
return assembly;
}
@@ -602,5 +603,9 @@ public static ModuleObject _load_clr_module(PyObject spec)
mod = ImportHook.Import(modname.ToString());
return mod;
}
+
+ [ModuleFunction]
+ [ForbidPythonThreads]
+ public static int _add_pending_namespaces() => ImportHook.AddPendingNamespaces();
}
}
diff --git a/src/runtime/native/TypeOffset.cs b/src/runtime/native/TypeOffset.cs
index b5957a9c7..a3b4f4a24 100644
--- a/src/runtime/native/TypeOffset.cs
+++ b/src/runtime/native/TypeOffset.cs
@@ -161,7 +161,8 @@ static void ValidateRequiredOffsetsPresent(PropertyInfo[] offsetProperties)
"Initialize",
"InitializeSlots",
"ListAssemblies",
- "_load_clr_module",
+ nameof(CLRModule._load_clr_module),
+ nameof(CLRModule._add_pending_namespaces),
"Release",
"Reset",
"set_SuppressDocs",
diff --git a/tests/test_module.py b/tests/test_module.py
index d0378e91e..3737dccf6 100644
--- a/tests/test_module.py
+++ b/tests/test_module.py
@@ -232,11 +232,11 @@ def test_explicit_assembly_load():
from System.Reflection import Assembly
import System, sys
- assembly = Assembly.LoadWithPartialName('System.Runtime')
+ assembly = Assembly.LoadWithPartialName('Microsoft.CSharp')
assert assembly is not None
- import System.Runtime
- assert 'System.Runtime' in sys.modules
+ import Microsoft.CSharp
+ assert 'Microsoft.CSharp' in sys.modules
assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam')
assert assembly is None
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy