I am working on Python interop. Internally, Python keeps reference counters for all objects via Py_IncRef and Py_DecRef. I want to ensure proper finalization of pointers to Python objects, so I am trying to create a class PyHandle derived from SafeHandle, that would call Py_DecRef on ReleaseHandle.
Problem is: unlike, for example, Windows API, Python does not increment refcount before returning a pointer to an object. So when interop creates an instance of PyHandle, I want it to call Py_IncRef on the pointer. However, I do not see a method I could override for that to happen. SafeHandle constructor takes invalid handle value, and there is no AcquireHandle to override. CoreCLR code also has non-overridable SetHandle method (see SafeHandle.cs).
What can I do to make the call to Py_IncRef when PyHandle is constructed by interop?
Is SafeHandle the right tool for the task?
SafeHandlehas no public method to pass a handle to it. So feel free to callPy_IncRefbefore you pass the handle to the protected base methods.However,
SafeHandlemight be somewhat overkill for your purpose as it maintains its own reference counter which is not really required for a handle that maintains it's own reference count.