[New-bugs-announce] [issue23060] Assert fails in multiprocessing.heap.Arena.__setstate__ on Windows

Steve Dower report at bugs.python.org
Tue Dec 16 03:29:55 CET 2014


New submission from Steve Dower:

Currently, the implementation of __setstate__ at Lib/multiprocessing/heap.py:54 looks like this:

def __setstate__(self, state):
    self.size, self.name = self._state = state
    self.buffer = mmap.mmap(-1, self.size, tagname=self.name)
    assert _winapi.GetLastError() == _winapi.ERROR_ALREADY_EXISTS

This assertion can fail when the assignment to buffer triggers memory [re]allocation, which could clear the last error result. So far, this fails reliably on debug builds using VS 2015 (which causes some tests to timeout when all of the child processes fail to start), but could also fail in threaded code at any time.

I don't know why release builds or builds with VS 2010 did not trigger this, but I would speculate that either VS 2015 is using a different API to allocate memory or Windows 8.1 has changed the behaviour of an API. Whether a function resets the last error code is deliberately unspecified (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx - "some functions set the last-error code to 0 on success and others do not").

In my opinion, the assertion should just be removed.

A hack that appears to work currently is to add "self.buffer = None" before the existing assignment (to pre-expand self.__dict__ and avoid the allocation).

If the assertion is important, someone may want to add a parameter to mmap() to require that the memory-mapped file already exists and throws otherwise, but I am not volunteering to do this.

----------
components: Windows
messages: 232697
nosy: jnoller, sbt, steve.dower, tim.golden, zach.ware
priority: normal
severity: normal
status: open
title: Assert fails in multiprocessing.heap.Arena.__setstate__ on Windows
versions: Python 3.5

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue23060>
_______________________________________


More information about the New-bugs-announce mailing list