# HG changeset patch # User Oleg Oshmyan # Date 1339010538 -3600 # Node ID ebb35960b5bc6343008d76581aa0196e58082afe # Parent a78349b7bbc4dd98c2240cf7ae87feff8ac116d3 Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows diff -r a78349b7bbc4 -r ebb35960b5bc upreckon/win32.py --- a/upreckon/win32.py Fri May 04 17:25:29 2012 +0100 +++ b/upreckon/win32.py Wed Jun 06 20:22:18 2012 +0100 @@ -1,4 +1,4 @@ -# Copyright (c) 2010-2011 Chortos-2 +# Copyright (c) 2010-2012 Chortos-2 from __future__ import division, with_statement @@ -146,6 +146,7 @@ __del__ = Close CHAR = c_char +CREATE_BREAKAWAY_FROM_JOB = 0x01000000 INVALID_HANDLE_VALUE = HANDLE(-1).value LPDWORD = POINTER(DWORD) LPFILETIME = POINTER(FILETIME) @@ -472,19 +473,27 @@ ProcessMemoryLimit=ceil((case.maxmemory or 0)*1048576), ) SetInformationJobObject(job, JobObjectExtendedLimitInformation, limits) + kwargs['creationflags'] = kwargs.get('creationflags', 0) | CREATE_BREAKAWAY_FROM_JOB try: case.process = Popen(*args, **kwargs) except OSError: raise CannotStartTestee(sys.exc_info()[1]) case.time_started = clock() - try: - AssignProcessToJobObject(job, case.process._handle) - except WindowsError: + while True: try: - if case.process.poll() is None: - raise CannotStartTestee(sys.exc_info()[1]) + AssignProcessToJobObject(job, case.process._handle) except WindowsError: - raise CannotStartTestee(sys.exc_info()[1]) + e = sys.exc_info()[1] + try: + if case.process.poll() is not None: + break + except WindowsError: + e = sys.exc_info()[1] + if e.winerror != ERROR_ACCESS_DENIED: + raise CannotStartTestee(e) + time.sleep(0) + else: + break if not console_input: if case.maxwalltime: if (WaitForSingleObject(case.process._handle, case.maxwalltime) !=