forked from home-assistant/core
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make monkey patch work in Python 3.6 (home-assistant#7848)
* Make monkey patch work in Python 3.6 * Update dockerfiles back to 3.6 * Lint * Do not set env variable for dockerfile * Lint
- Loading branch information
Showing
5 changed files
with
89 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
FROM python:3.5 | ||
FROM python:3.6 | ||
MAINTAINER Paulus Schoutsen <[email protected]> | ||
|
||
# Uncomment any of the following lines to disable the installation. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
"""Monkey patch Python to work around issues causing segfaults. | ||
Under heavy threading operations that schedule calls into | ||
the asyncio event loop, Task objects are created. Due to | ||
a bug in Python, GC may have an issue when switching between | ||
the threads and objects with __del__ (which various components | ||
in HASS have). | ||
This monkey-patch removes the weakref.Weakset, and replaces it | ||
with an object that ignores the only call utilizing it (the | ||
Task.__init__ which calls _all_tasks.add(self)). It also removes | ||
the __del__ which could trigger the future objects __del__ at | ||
unpredictable times. | ||
The side-effect of this manipulation of the Task is that | ||
Task.all_tasks() is no longer accurate, and there will be no | ||
warning emitted if a Task is GC'd while in use. | ||
Related Python bugs: | ||
- https://bugs.python.org/issue26617 | ||
""" | ||
import sys | ||
|
||
|
||
def patch_weakref_tasks(): | ||
"""Replace weakref.WeakSet to address Python 3 bug.""" | ||
# pylint: disable=no-self-use, protected-access, bare-except | ||
import asyncio.tasks | ||
|
||
class IgnoreCalls: | ||
"""Ignore add calls.""" | ||
|
||
def add(self, other): | ||
"""No-op add.""" | ||
return | ||
|
||
asyncio.tasks.Task._all_tasks = IgnoreCalls() | ||
try: | ||
del asyncio.tasks.Task.__del__ | ||
except: | ||
pass | ||
|
||
|
||
def disable_c_asyncio(): | ||
"""Disable using C implementation of asyncio. | ||
Required to be able to apply the weakref monkey patch. | ||
Requires Python 3.6+. | ||
""" | ||
class AsyncioImportFinder: | ||
"""Finder that blocks C version of asyncio being loaded.""" | ||
|
||
PATH_TRIGGER = '_asyncio' | ||
|
||
def __init__(self, path_entry): | ||
if path_entry != self.PATH_TRIGGER: | ||
raise ImportError() | ||
return | ||
|
||
def find_module(self, fullname, path=None): | ||
"""Find a module.""" | ||
if fullname == self.PATH_TRIGGER: | ||
# We lint in Py34, exception is introduced in Py36 | ||
# pylint: disable=undefined-variable | ||
raise ModuleNotFoundError() # noqa | ||
return None | ||
|
||
sys.path_hooks.append(AsyncioImportFinder) | ||
sys.path.insert(0, AsyncioImportFinder.PATH_TRIGGER) | ||
|
||
try: | ||
import _asyncio # noqa | ||
except ImportError: | ||
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
# Based on the production Dockerfile, but with development additions. | ||
# Keep this file as close as possible to the production Dockerfile, so the environments match. | ||
|
||
FROM python:3.5 | ||
FROM python:3.6 | ||
MAINTAINER Paulus Schoutsen <[email protected]> | ||
|
||
# Uncomment any of the following lines to disable the installation. | ||
|