ctypes and garbage collection

Ulrich Eckhardt eckhardt at satorlaser.com
Mon Sep 6 15:11:14 CEST 2010


Joakim Hove wrote:
> I have used ctypes to wrap a C-library
> [...] 
> Observe that the c_container_get_node() function does _not_ allocate
> memory, it just returns a opaque handle to a node structure, still
> fully owned by the container structure.
[...]
> 
> class Container:
>      def __init__(self , filename):
>           self.c_ptr = c_container_alloc( filename )
> 
>     def __del__( self ):
>          c_container_free( self.c_ptr )
> 
>     def get_node( self , node_id):
>          Node( c_container_get_node( self , node_id ))
> 
> 
> class Node:
>      def __init__( self , c_ptr ):
>           self.c_ptr = c_ptr
> 
>      def __del__( self ):
>           pass
> 
> 
> Now, a use scenario might be like this:
> 
> 1. Instantiate a Container() instance.
> 2. Instantiate a Node() instance with the Container.get_node()
> function.
> 3. Forget about the Container instance and work happily with the Node
> instance.
> 4. Out of the blue comes the gc - and then? Will the Node instance be
> enough to protect the Container instance from beeing garbage
> collected?

No. You should be able to even see that by logging calls to alloc/free of
your library.

> I thought maybe the get_node() function should have something like a
> incref() call, and the Node.__del__() function a corresponding
> decref()? Or ??

I'd add an "__owner" field to the node, initialised with the owning
container instance.

Uli

-- 
Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932




More information about the Python-list mailing list