diff --git a/eventlet/green/select.py b/eventlet/green/select.py index 53fb359..ea0289d 100644 --- a/eventlet/green/select.py +++ b/eventlet/green/select.py @@ -6,6 +6,7 @@ from eventlet.support import six __patched__ = ['select'] +__deleted__ = ['poll', 'epoll', 'kqueue', 'kevent'] def get_fileno(obj): diff --git a/eventlet/patcher.py b/eventlet/patcher.py index 40207f9..c60247c 100644 --- a/eventlet/patcher.py +++ b/eventlet/patcher.py @@ -295,6 +295,10 @@ def monkey_patch(**on): patched_attr = getattr(mod, attr_name, None) if patched_attr is not None: setattr(orig_mod, attr_name, patched_attr) + deleted = getattr(mod, '__deleted__', []) + for attr_name in deleted: + if hasattr(orig_mod, attr_name): + delattr(orig_mod, attr_name) finally: imp.release_lock() diff --git a/tests/isolated/patcher_blocking_select_methods_are_deleted.py b/tests/isolated/patcher_blocking_select_methods_are_deleted.py new file mode 100644 index 0000000..1a0341a --- /dev/null +++ b/tests/isolated/patcher_blocking_select_methods_are_deleted.py @@ -0,0 +1,15 @@ +if __name__ == '__main__': + import eventlet + eventlet.monkey_patch() + + # Leaving unpatched select methods in the select module is a recipe + # for trouble and this test makes sure we don't do that. + # + # Issues: + # * https://bitbucket.org/eventlet/eventlet/issues/167 + # * https://github.com/eventlet/eventlet/issues/169 + import select + for name in ['poll', 'epoll', 'kqueue', 'kevent']: + assert not hasattr(select, name), name + + print('pass') diff --git a/tests/patcher_test.py b/tests/patcher_test.py index deae8ef..8104b41 100644 --- a/tests/patcher_test.py +++ b/tests/patcher_test.py @@ -510,3 +510,7 @@ def test_threading_join(): def test_socketserver_selectors(): tests.run_isolated('patcher_socketserver_selectors.py') + + +def test_blocking_select_methods_are_deleted(): + tests.run_isolated('patcher_blocking_select_methods_are_deleted.py')