Issue #28448: Fix C implemented asyncio.Future didn't work on Windows

This commit is contained in:
INADA Naoki 2016-10-21 12:30:15 +09:00
parent 56b2cf5e85
commit a83636247e
8 changed files with 109 additions and 8 deletions

View File

@ -247,10 +247,10 @@ class Future:
if self._state != _PENDING: if self._state != _PENDING:
return False return False
self._state = _CANCELLED self._state = _CANCELLED
self._schedule_callbacks() self.__schedule_callbacks()
return True return True
def _schedule_callbacks(self): def __schedule_callbacks(self):
"""Internal: Ask the event loop to call all callbacks. """Internal: Ask the event loop to call all callbacks.
The callbacks are scheduled to be called as soon as possible. Also The callbacks are scheduled to be called as soon as possible. Also
@ -352,7 +352,7 @@ class Future:
raise InvalidStateError('{}: {!r}'.format(self._state, self)) raise InvalidStateError('{}: {!r}'.format(self._state, self))
self._result = result self._result = result
self._state = _FINISHED self._state = _FINISHED
self._schedule_callbacks() self.__schedule_callbacks()
def set_exception(self, exception): def set_exception(self, exception):
"""Mark the future done and set an exception. """Mark the future done and set an exception.
@ -369,7 +369,7 @@ class Future:
"and cannot be raised into a Future") "and cannot be raised into a Future")
self._exception = exception self._exception = exception
self._state = _FINISHED self._state = _FINISHED
self._schedule_callbacks() self.__schedule_callbacks()
if compat.PY34: if compat.PY34:
self._log_traceback = True self._log_traceback = True
else: else:

View File

@ -171,8 +171,13 @@ class _WaitCancelFuture(_BaseWaitHandleFuture):
def cancel(self): def cancel(self):
raise RuntimeError("_WaitCancelFuture must not be cancelled") raise RuntimeError("_WaitCancelFuture must not be cancelled")
def _schedule_callbacks(self): def set_result(self, result):
super(_WaitCancelFuture, self)._schedule_callbacks() super().set_result(result)
if self._done_callback is not None:
self._done_callback(self)
def set_exception(self, exception):
super().set_exception(exception)
if self._done_callback is not None: if self._done_callback is not None:
self._done_callback(self) self._done_callback(self)

View File

@ -20,6 +20,8 @@ Core and Builtins
Library Library
------- -------
- Issue #28448: Fix C implemented asyncio.Future didn't work on Windows.
- Issue #28480: Fix error building socket module when multithreading is - Issue #28480: Fix error building socket module when multithreading is
disabled. disabled.

77
PCbuild/_asyncio.vcxproj Normal file
View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="PGInstrument|Win32">
<Configuration>PGInstrument</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="PGInstrument|x64">
<Configuration>PGInstrument</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="PGUpdate|Win32">
<Configuration>PGUpdate</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="PGUpdate|x64">
<Configuration>PGUpdate</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{384C224A-7474-476E-A01B-750EA7DE918C}</ProjectGuid>
<RootNamespace>_asyncio</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="python.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup>
<TargetExt>.pyd</TargetExt>
</PropertyGroup>
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="pyproject.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
</PropertyGroup>
<ItemGroup>
<ClCompile Include="..\Modules\_asynciomodule.c" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\PC\python_nt.rc" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="pythoncore.vcxproj">
<Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ResourceCompile Include="..\PC\python_nt.rc" />
</ItemGroup>
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{2422278e-eeeb-4241-8182-433e2bc5a7fc}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\Modules\_asynciomodule.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -51,7 +51,7 @@
<!-- _freeze_importlib --> <!-- _freeze_importlib -->
<Projects Include="_freeze_importlib.vcxproj" /> <Projects Include="_freeze_importlib.vcxproj" />
<!-- Extension modules --> <!-- Extension modules -->
<ExtensionModules Include="_ctypes;_decimal;_elementtree;_msi;_multiprocessing;_overlapped;pyexpat;select;unicodedata;winsound" /> <ExtensionModules Include="_asyncio;_ctypes;_decimal;_elementtree;_msi;_multiprocessing;_overlapped;pyexpat;select;unicodedata;winsound" />
<!-- Extension modules that require external sources --> <!-- Extension modules that require external sources -->
<ExternalModules Include="_bz2;_lzma;_sqlite3" /> <ExternalModules Include="_bz2;_lzma;_sqlite3" />
<!-- _ssl will build _socket as well, which may cause conflicts in parallel builds --> <!-- _ssl will build _socket as well, which may cause conflicts in parallel builds -->

View File

@ -94,6 +94,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyshellext", "pyshellext.vc
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsole.vcxproj", "{B244E787-C445-441C-BDF4-5A4F1A3A1E51}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsole.vcxproj", "{B244E787-C445-441C-BDF4-5A4F1A3A1E51}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32

View File

@ -213,7 +213,6 @@
<ClInclude Include="..\Python\wordcode_helpers.h" /> <ClInclude Include="..\Python\wordcode_helpers.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\Modules\_asynciomodule.c" />
<ClCompile Include="..\Modules\_bisectmodule.c" /> <ClCompile Include="..\Modules\_bisectmodule.c" />
<ClCompile Include="..\Modules\_blake2\blake2module.c" /> <ClCompile Include="..\Modules\_blake2\blake2module.c" />
<ClCompile Include="..\Modules\_blake2\blake2b_impl.c" /> <ClCompile Include="..\Modules\_blake2\blake2b_impl.c" />