Re: [Python-Dev] ctypes, memory mapped files and context manager

2017年1月04日 18:40:37 -0800

On 5 January 2017 at 10:28, Hans-Peter Jansen <[email protected]> wrote:
> In order to get this working properly, the ctypes mapping needs a method to
> free the mapping actively. E.g.:
>
> @contextmanager
> def map_struct(m, n):
> m.resize(n * mmap.PAGESIZE)
> yield T.from_buffer(m)
> T.unmap_buffer(m)
>
> Other attempts with weakref and the like do not work due to the nature of the
> ctypes types.
I don't know ctypes well enough myself to comment on the idea of
offering fully deterministic cleanup, but the closest you could get to
that without requiring a change to ctypes is to have the context
manager introduce a layer of indirection:
 class _T_data(ctypes.Structure):
 _fields = [("foo", ctypes.c_uint32)]
 class T:
 def __init__(self, buffer):
 self.data = _T_data.from_buffer(buffer)
 def close(self):
 self.data = None
 @contextmanager
 def map_struct(m, n):
 m.resize(n * mmap.PAGESIZE)
 mapped = T(m)
 try:
 yield mapped
 finally:
 mapped.close()
Client code would then need to consistently access the struct through
the data attribute:
 with map_struct(m, 1) as a:
 a.data.foo = 1
 with map_struct(m, 2) as b:
 b.data.foo = 2
Something like http://wrapt.readthedocs.io/en/latest/wrappers.html#object-proxy
would let you make the indirection to a contained object transparent,
but as far as I can tell, wrapt doesn't currently support "closing" a
proxy by replacing the reference to the internal object with a
reference to None (adding that might be possible, but I don't
personally know wrapt well enough to guess the feasibility of doing
so).
Cheers,
Nick.
-- 
Nick Coghlan | [email protected] | Brisbane, Australia
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to