Skip to content

Commit

Permalink
Fix access violation exception on shutdown (#1977)
Browse files Browse the repository at this point in the history
When nulling the GC handles on shutdown the reference count of all objects pointed to by the IntPtr in the `CLRObject.reflectedObjects` are zero.
This caused an exception in some scenarios because `Runtime.PyObject_TYPE(reflectedClrObject)` is called while the reference counter is at zero.

After `TypeManager.RemoveTypes();` is called in the `Runtime.Shutdown()` method, reference count decrements to zero do not invoke `ClassBase.tp_clear` for managed objects anymore which normally is responsible for removing references from `CLRObject.reflectedObjects`. Collecting objects referenced in `CLRObject.reflectedObjects` only after leads to an unstable state in which the reference count for these object addresses is zero while still maintaining them to be used for further pseudo-cleanup. In that time, the memory could have been reclaimed already which leads to the exception.
  • Loading branch information
Frawak committed May 13, 2024
1 parent b112885 commit d496959
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 2 deletions.
1 change: 1 addition & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
- Dmitriy Se ([@dmitriyse](https://github.com/dmitriyse))
- Félix Bourbonnais ([@BadSingleton](https://github.com/BadSingleton))
- Florian Treurniet ([@ftreurni](https://github.com/ftreurni))
- Frank Witscher ([@Frawak](https://github.com/Frawak))
- He-chien Tsai ([@t3476](https://github.com/t3476))
- Inna Wiesel ([@inna-w](https://github.com/inna-w))
- Ivan Cronyn ([@cronan](https://github.com/cronan))
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].

- Fixed RecursionError for reverse operators on C# operable types from python. See #2240
- Fixed probing for assemblies in `sys.path` failing when a path in `sys.path` has invalid characters. See #2376
- Fixed possible access violation exception on shutdown. See ([#1977][i1977])

## [3.0.3](https://github.com/pythonnet/pythonnet/releases/tag/v3.0.3) - 2023-10-11

Expand Down Expand Up @@ -970,3 +971,4 @@ This version improves performance on benchmarks significantly compared to 2.3.
[i1481]: https://github.com/pythonnet/pythonnet/issues/1481
[i1672]: https://github.com/pythonnet/pythonnet/pull/1672
[i2311]: https://github.com/pythonnet/pythonnet/issues/2311
[i1977]: https://github.com/pythonnet/pythonnet/issues/1977
6 changes: 4 additions & 2 deletions src/runtime/Runtime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ internal static void Shutdown()
ClearClrModules();
RemoveClrRootModule();

TryCollectingGarbage(MaxCollectRetriesOnShutdown, forceBreakLoops: true);

NullGCHandles(ExtensionType.loadedExtensions);
ClassManager.RemoveClasses();
TypeManager.RemoveTypes();
Expand All @@ -295,8 +297,8 @@ internal static void Shutdown()
PyObjectConversions.Reset();

PyGC_Collect();
bool everythingSeemsCollected = TryCollectingGarbage(MaxCollectRetriesOnShutdown,
forceBreakLoops: true);
bool everythingSeemsCollected = TryCollectingGarbage(MaxCollectRetriesOnShutdown);

Debug.Assert(everythingSeemsCollected);

Finalizer.Shutdown();
Expand Down

0 comments on commit d496959

Please sign in to comment.