pytest-dev / py

Python development support library (note: maintenance only)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ForkedFunc raises EOFError if function exits with status 0

vermaport opened this issue · comments

waitfinish() assumes that if the forked child process exited with exitstatus == 0, that _child() ran to completion and wrote out the retval. This is not true if the function run in the child process hard exited with status 0, e.g. os._exit(0) (or even sys.exit(0)).

I added a new test for this and will submit a PR to fix the issue shortly.

=========================================================== FAILURES ============================================================
__________________________________________________________ test_exit0 ___________________________________________________________

    def test_exit0():
        def exit0():
            os._exit(0)
>       result = py.process.ForkedFunc(exit0).waitfinish()

testing/process/test_forkedfunc.py:40:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <py._process.forkedfunc.ForkedFunc object at 0x7f81dee546d8>, waiter = <built-in function waitpid>

    def waitfinish(self, waiter=os.waitpid):
        pid, systemstatus = waiter(self.pid, 0)
        if systemstatus:
            if os.WIFSIGNALED(systemstatus):
                exitstatus = os.WTERMSIG(systemstatus) + 128
            else:
                exitstatus = os.WEXITSTATUS(systemstatus)
        else:
            exitstatus = 0
        signal = systemstatus & 0x7f
        if not exitstatus and not signal:
            retval = self.RETVAL.open('rb')
            try:
                retval_data = retval.read()
            finally:
                retval.close()
>           retval = marshal.loads(retval_data)
E           EOFError: EOF read where object expected