René's URL Explorer Experiment


Title: Python 3.14 free-threaded support by greateggsgreg · Pull Request #2721 · pythonnet/pythonnet · GitHub

Open Graph Title: Python 3.14 free-threaded support by greateggsgreg · Pull Request #2721 · pythonnet/pythonnet

X Title: Python 3.14 free-threaded support by greateggsgreg · Pull Request #2721 · pythonnet/pythonnet

Description: First step toward Python 3.14 free-threaded (Py_GIL_DISABLED) support, tracked under #2720 (and the umbrella #2610). After this PR, pythonnet runs the full pytest suite on python3.14t against both .NET 8 and .NET 10 on Linux. Existing GIL builds (3.11 - 3.14) are unaffected. What changes Free-threaded PyObject layout + refcount FT PyObject is 16 bytes longer (ob_tid + ob_flags + ob_mutex + ob_gc_bits + ob_ref_local + ob_ref_shared replaces ob_refcnt) and the refcount is split, so there is no single offset to read. ABI.Initialize detects the build via sys._is_gil_enabled() and sets ObjectHeadOffset = 16 on FT, shifting the generated TypeOffset* values to absolute PyHeapTypeObject offsets. Runtime.Refcount prefers a P/Invoke into Py_REFCNT (a real symbol on CPython 3.14+, required on FT). Older Pythons fall back to the existing direct read. Atomic type creation in ReflectedClrType.GetOrCreate / TypeManager.GetType The classic check-then-act on ClassManager.cache and TypeManager.cache raced two ways under FT: duplicate cache.Add (ArgumentException), and partial-type visibility from outside-the-lock readers observing a half-initialised type during recursive class init. Two-cache design: cache — only fully-initialised types; outside-the-lock fast path is safe. _inProgressCache — partial types visible only to the lock-holding builder, so self-referential definitions resolve via the reentrant lock. Serialisation snapshots remain Dictionary<,> on the wire for binary compatibility. Atomic GCHandle ownership in tp_clear / tp_dealloc subtype_clear (main thread) and the .NET finalizer thread can both reach a CLR-bound Python object's GCHandle slot. Previous read-then-zero in ManagedType.TryFreeGCHandle and ClassDerivedObject.tp_dealloc (strong→weak swap) let two threads observe the same handle and double-free it. Both paths now use Interlocked.Exchange to atomically claim the slot. Reflection.Emit is not thread-safe Concurrent TypeBuilder / ModuleBuilder operations corrupt the IL stream or throw "Duplicate type name within an assembly". Two emit-and-bake sequences are now serialised: ClassDerivedObject.CreateDerivedType (Python subclasses of CLR types) on _buildersLock. DelegateManager.GetDispatcher (Python callables → CLR delegates) on a new _emitLock. Concurrent collections / atomics on shared state Plain Dictionary<,>, HashSet<>, and counters that the GIL implicitly serialised tear under FT. ConcurrentDictionary<,>: ExtensionType.loadedExtensions, CLRObject.reflectedObjects, ClassManager.cache, TypeManager.cache, ModuleObject.cache / allNames, Interop.delegateTypes, ClassBase.ClearVisited, InternString._string2interns / _intern2strings. Interlocked + Volatile: Finalizer._throttled (counter), Runtime.run (epoch), PyBuffer.disposedValue (dispose flag — finalizer + explicit Dispose no longer double-free _view). Lock-protected (where nested mutation or list-with-equality semantics rule out lock-free containers): GenericUtil.mapping (nested Dictionary/List), PythonEngine.ShutdownHandlers, Runtime._pyRefs. volatile bool: Runtime._isInitialized / _typesInitialized, PythonEngine.initialized, Finalizer.started. Guard the .NET-finalizer / Python-shutdown interaction The .NET finalizer thread can dispatch Py_DecRef concurrently with Py_Finalize; a stale ob_ref_local read after teardown crashes the process. Runtime._Py_IsFinalizing() guards on Finalizer.ThrottledCollect, PyObject's finalizer, and the Refcount > 0 Debug.Assert in XDecref / AddFinalizedObject (kept on GIL, skipped on FT). Tests + CI New tests in tests/test_thread.py cover the refcount/ABI invariants, the ConcurrentDictionary caches, atomic GCHandle ownership, the two Reflection.Emit locks, and the ShutdownHandlers lock. Some tests are marked @freethreaded_only because the GIL-build code path triggers a separate pre-existing pythonnet crash under high-contention CLR allocation that's reproducible on master and out of scope for this PR. .github/workflows/main.yml adds 3.14t to the Linux/macOS matrix and skips Mono on 3.14t (clr-loader's mono backend isn't yet validated against free-threaded Python). Verification Linux aarch64, full pytest suite (tests/, --ignore=tests/domain_tests): .NET 8 .NET 10 3.11 - 3.14 478 passed, 11 skipped 478 passed, 11 skipped 3.14t 484 passed, 5 skipped 484 passed, 5 skipped (11 skipped on GIL = 5 pre-existing + 6 FT-only tests; 5 skipped on FT = the 5 pre-existing skips.) 3.13t is not in the matrix because cffi <2.0 does not support free-threaded 3.13 and clr-loader requires cffi.

Open Graph Description: First step toward Python 3.14 free-threaded (Py_GIL_DISABLED) support, tracked under #2720 (and the umbrella #2610). After this PR, pythonnet runs the full pytest suite on python3.14t against both ...

X Description: First step toward Python 3.14 free-threaded (Py_GIL_DISABLED) support, tracked under #2720 (and the umbrella #2610). After this PR, pythonnet runs the full pytest suite on python3.14t against both ...

Opengraph URL: https://github.com/pythonnet/pythonnet/pull/2721

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/commits/:range(.:format)
route-controllerpull_requests
route-actioncommits
fetch-noncev2:d5bbce20-e107-ed66-6902-24854e652db2
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idCE0A:1E0640:334DF0B:4417F66:6A65422D
html-safe-noncea2e17951643bb3d89bc68cd3dcd439d5861ec80e59beb4de6bbe5f5a5be80d25
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDRTBBOjFFMDY0MDozMzRERjBCOjQ0MTdGNjY6NkE2NTQyMkQiLCJ2aXNpdG9yX2lkIjoiMzg3NDU0MDMyNzkzMzM5NTUwMSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacee89fd4ec40b04223dc51664069d2a8afd84598e47cfd17eed13fb822fd01735
hovercard-subject-tagpull_request:3655997459
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/commits
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
twitter:imagehttps://avatars.githubusercontent.com/u/36009512?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/36009512?s=400&v=4
og:image:altFirst step toward Python 3.14 free-threaded (Py_GIL_DISABLED) support, tracked under #2720 (and the umbrella #2610). After this PR, pythonnet runs the full pytest suite on python3.14t against both ...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None52c76df668885aaff23b50bdca1fa1ea44ac9c1553e888ebc70ff1e4daa4625b
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/pythonnet/pythonnet git https://github.com/pythonnet/pythonnet.git
octolytics-dimension-user_id6050430
octolytics-dimension-user_loginpythonnet
octolytics-dimension-repository_id14748123
octolytics-dimension-repository_nwopythonnet/pythonnet
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id14748123
octolytics-dimension-repository_network_root_nwopythonnet/pythonnet
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release309153364422b3c499922d1a2a6404910a58ed8e
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpythonnet%2Fpythonnet%2Fpull%2F2721%2Fcommits%2F99a99db0646cc5e81a74074eadeb67d16a9fa99c
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpythonnet%2Fpythonnet%2Fpull%2F2721%2Fcommits%2F99a99db0646cc5e81a74074eadeb67d16a9fa99c
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Fcommits&source=header-repo&source_repo=pythonnet%2Fpythonnet
Reloadhttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Reloadhttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Reloadhttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
pythonnet https://github.com/pythonnet
pythonnethttps://github.com/pythonnet/pythonnet
Notifications https://github.com/login?return_to=%2Fpythonnet%2Fpythonnet
Fork 777 https://github.com/login?return_to=%2Fpythonnet%2Fpythonnet
Star 5.5k https://github.com/login?return_to=%2Fpythonnet%2Fpythonnet
Code https://github.com/pythonnet/pythonnet
Issues 151 https://github.com/pythonnet/pythonnet/issues
Pull requests 17 https://github.com/pythonnet/pythonnet/pulls
Discussions https://github.com/pythonnet/pythonnet/discussions
Actions https://github.com/pythonnet/pythonnet/actions
Projects https://github.com/pythonnet/pythonnet/projects
Wiki https://github.com/pythonnet/pythonnet/wiki
Security and quality 0 https://github.com/pythonnet/pythonnet/security
Insights https://github.com/pythonnet/pythonnet/pulse
Code https://github.com/pythonnet/pythonnet
Issues https://github.com/pythonnet/pythonnet/issues
Pull requests https://github.com/pythonnet/pythonnet/pulls
Discussions https://github.com/pythonnet/pythonnet/discussions
Actions https://github.com/pythonnet/pythonnet/actions
Projects https://github.com/pythonnet/pythonnet/projects
Wiki https://github.com/pythonnet/pythonnet/wiki
Security and quality https://github.com/pythonnet/pythonnet/security
Insights https://github.com/pythonnet/pythonnet/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fpythonnet%2Fpythonnet%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fpythonnet%2Fpythonnet%2Fissues%2Fnew%2Fchoose
greateggsgreghttps://github.com/greateggsgreg
pythonnet:masterhttps://github.com/pythonnet/pythonnet/tree/master
greateggsgreg:freethreading-prephttps://github.com/greateggsgreg/pythonnet/tree/freethreading-prep
Conversation 1 https://github.com/pythonnet/pythonnet/pull/2721
Commits 37 https://github.com/pythonnet/pythonnet/pull/2721/commits
Checks 33 https://github.com/pythonnet/pythonnet/pull/2721/checks
Files changed https://github.com/pythonnet/pythonnet/pull/2721/files
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Python 3.14 free-threaded support https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c#top
Show all changes 37 commits https://github.com/pythonnet/pythonnet/pull/2721/files
ebd0a95 Thread-safety prep for free-threading builds greateggsgreg May 9, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/ebd0a95717fb69cb1fa274230b497807a06c8138
cf8372a Initialise pythonnet on free-threaded Python (#2720) greateggsgreg May 9, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/cf8372ad89d6cdf61829c7bf5142d16dd0cd426c
441954f Make extension/CLR-object registries thread-safe greateggsgreg May 9, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/441954f7e589554c988ce1f7026115bcc88ad41b
19c7f59 Atomic type creation in ReflectedClrType.GetOrCreate / TypeManager.Ge… greateggsgreg May 9, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/19c7f591be318824450ebd89d949d4db99f3f2f5
1029c62 Add free-threaded thread-stress tests and 3.14t to CI matrix greateggsgreg May 9, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/1029c62c72f4a048d630477e573bbc177142af78
3158ca5 Atomic GCHandle ownership and finalizer-thread shutdown guards greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/3158ca5a57de6277296f67604fc0056b915e31b7
1149295 Make additional internal registries thread-safe greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/11492952e27bab10d51919a9c0673e223b16a44d
e8afa85 test_thread: join worker threads before returning greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/e8afa853766973f5a2c948cc5dd445a46689b987
3954df3 test_thread: cover ModuleObject thread-safe registries greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/3954df302a7a01480acfc78406430fddf9c0c3ef
28013af Wider thread-safety audit fixes for free-threaded Python greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/28013af87cf80112e872bf95730ff4d6df03fa2b
9a3dd59 Document lock acquisition sites and strong->weak GCHandle swap greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/9a3dd59bb7e0d02ffe476fdebc37c1344804da48
cb1dcde Preserve InternString single-write invariant under DEBUG greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/cb1dcde69dbbdfa4f1e122ea1f214dda3e7caffd
74d12f1 test_thread: cover real-world consumer patterns greateggsgreg May 10, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/74d12f14298d602510b15fc8881f0a626ea41abb
a30c84e Auto-detect free-threaded libpython in venv home greateggsgreg May 12, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/a30c84ec7fa70a3d9f6a3c59f6d7f0d67d77dde3
be5ba34 Snapshot pypath, use ConcurrentDictionary for thunks and slot holders greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/be5ba3473218927187d278f2b24877bee3165266
946785e Fix handling of python runtime suffixes m/t greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/946785e9c09707aa235b04110f9e6fe2f272b258
77ca497 Fix threadtest race greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/77ca4972edbefabec8e76beb56fff09f3e1000e6
af518bb Fix double-free in chained ClassDerived Finalize greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/af518bb57bfc5f3eaf0529a20b1f7d716112e8ff
ed735ac Enable Mono CI jobs on free-threaded Python 3.14 greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/ed735ac587ad1847c9a2d90643c31a138f138cb0
bd3f0bf Inline freethreaded_only as pytest.mark.skipif at call sites greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/bd3f0bfef07a01f4b8120b117507fc68ddefc461
c4688b3 Fix InterruptTest assertion on free-threaded Python 3.14 greateggsgreg May 13, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/c4688b39676d74442154806b909810aa93461b3d
84cd07c Add concurrent stress tests for PyBuffer.Dispose and CLR-cycle gc.col… greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/84cd07cebb327ff1a68272adc6e0a61db9c55e3f
d9b658d Trim concurrent overhead on hot paths from free-threading prep greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/d9b658dc283c3a9a5f291eac06730161d123e1d4
20c51ad Pre-warm ctor binder in concurrent-gc test to avoid first-call race greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/20c51ad560ec5af4dddcf8b1dee5bf25e3cd7161
f5f8ab0 Make MethodBinder.GetMethods lazy init thread-safe under free-threading greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/f5f8ab0dd32abcbd992a19d86d742aaf012ef3ea
c5097eb Precompute method precedence to avoid quadratic GetParameters allocat… greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/c5097ebaf563ccbf0196e5acab30a6a55b1bef7b
18e4901 Zero the slot in ClassDerived.tp_dealloc when tp_clear already ran to… greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/18e4901b6f329afe4d0a35be86bc702e8c95b46a
e0569d0 Keep ClassDerived wrapper alive across the NewObjectToPython slot dem… greateggsgreg May 15, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/e0569d0f46a05f3c91517867a9fad1d719e35abb
2c9f861 Document private helpers added during free-threading prep greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/2c9f861ed2be795a57a861b356a63b44f1c1aae6
ee3add4 Add debug echoes and a 6-minute step timeout to the Mono test job greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/ee3add404dbc34ddf6a7d84c7351884a811e6c99
414ce70 Drop the per-loop CLR GC.Collect from concurrent-gc test to avoid Mon… greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/414ce700d6e127e6f769f95105e7bec503614baa
99a99db Add temporary Mono-step diagnostics on Linux/macOS to locate the x64-… greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
8e7c2ba Revert temporary Mono-step diagnostics now that the underlying race i… greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/8e7c2bac47579bcbcc0cdca997ab6d8850424ae0
f8b69a2 Merge branch 'master' into freethreading-prep greateggsgreg May 16, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/f8b69a21cb12c6ac0a01c66c4e1165e7cbaf2afa
8f2804c Add user-facing threading guide covering GIL, free-threading, and com… greateggsgreg May 18, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/8f2804ca6498f2d152cf1a3ed864526554220413
9c369ed Harden CollectBasicObject against .NET-GC timing differences greateggsgreg May 18, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/9c369edb84e5d9b110aaa2ab0b2d6eeb7208238a
d1b4daa Merge branch 'master' into freethreading-prep greateggsgreg May 25, 2026 https://github.com/pythonnet/pythonnet/pull/2721/commits/d1b4daae358028400bfe95a4ef356717f07637a4
Clear filters https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
Prev https://github.com/pythonnet/pythonnet/pull/2721/commits/414ce700d6e127e6f769f95105e7bec503614baa
Next https://github.com/pythonnet/pythonnet/pull/2721/commits/8e7c2bac47579bcbcc0cdca997ab6d8850424ae0
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
https://github.com/greateggsgreg
greateggsgreghttps://github.com/pythonnet/pythonnet/commits?author=greateggsgreg
.github/workflows/main.ymlhttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3
View file https://github.com/pythonnet/pythonnet/blob/99a99db0646cc5e81a74074eadeb67d16a9fa99c/.github/workflows/main.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/pythonnet/pythonnet/pull/2721/commits/{{ revealButtonHref }}
https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3
https://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c#diff-7829468e86c1cc5d5133195b5cb48e1ff6c75e3e9203777f6b2e379d9e4882b3
Please reload this pagehttps://github.com/pythonnet/pythonnet/pull/2721/commits/99a99db0646cc5e81a74074eadeb67d16a9fa99c
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.