From c8f153b3d037f3c4b6f2ff0852e312b5d79818fa Mon Sep 17 00:00:00 2001 From: A5rocks Date: Thu, 18 Jan 2024 00:02:46 +0900 Subject: [PATCH 1/4] Just delay `select.epoll` to fix import with gevent monkey patching --- src/trio/_core/_io_epoll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trio/_core/_io_epoll.py b/src/trio/_core/_io_epoll.py index 4b080f4063..f3739cdd33 100644 --- a/src/trio/_core/_io_epoll.py +++ b/src/trio/_core/_io_epoll.py @@ -200,7 +200,7 @@ class _EpollStatistics: @attr.s(slots=True, eq=False, hash=False) class EpollIOManager: - _epoll: select.epoll = attr.ib(factory=select.epoll) + _epoll: select.epoll = attr.ib(factory=lambda: select.epoll) # {fd: EpollWaiters} _registered: defaultdict[int, EpollWaiters] = attr.ib( factory=lambda: defaultdict(EpollWaiters) From 2432db8ca64ab807500af2fded30f442c939e0bf Mon Sep 17 00:00:00 2001 From: A5rocks Date: Thu, 18 Jan 2024 00:07:06 +0900 Subject: [PATCH 2/4] `select.epoll` needs to be called --- src/trio/_core/_io_epoll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trio/_core/_io_epoll.py b/src/trio/_core/_io_epoll.py index f3739cdd33..f5c2c296b0 100644 --- a/src/trio/_core/_io_epoll.py +++ b/src/trio/_core/_io_epoll.py @@ -200,7 +200,7 @@ class _EpollStatistics: @attr.s(slots=True, eq=False, hash=False) class EpollIOManager: - _epoll: select.epoll = attr.ib(factory=lambda: select.epoll) + _epoll: select.epoll = attr.ib(factory=lambda: select.epoll()) # {fd: EpollWaiters} _registered: defaultdict[int, EpollWaiters] = attr.ib( factory=lambda: defaultdict(EpollWaiters) From 83966158bf06cfaac61463d8399b6c95bd6032d5 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 19 Feb 2024 00:38:16 -0600 Subject: [PATCH 3/4] Fix merge removing lambda --- src/trio/_core/_io_epoll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trio/_core/_io_epoll.py b/src/trio/_core/_io_epoll.py index b21d8c4718..4911fe8f33 100644 --- a/src/trio/_core/_io_epoll.py +++ b/src/trio/_core/_io_epoll.py @@ -200,7 +200,7 @@ class _EpollStatistics: @attrs.define(eq=False, hash=False) class EpollIOManager: - _epoll: select.epoll = attrs.Factory(select.epoll) + _epoll: select.epoll = attrs.Factory(lambda: select.epoll()) # {fd: EpollWaiters} _registered: defaultdict[int, EpollWaiters] = attrs.Factory( lambda: defaultdict(EpollWaiters) From 4bd7afa15e2979a5c45032b25f900ad95a7ab37f Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Tue, 28 May 2024 14:06:01 -0500 Subject: [PATCH 4/4] Add comment about why we are using lambda --- src/trio/_core/_io_epoll.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/trio/_core/_io_epoll.py b/src/trio/_core/_io_epoll.py index 4911fe8f33..1f4ae49f7a 100644 --- a/src/trio/_core/_io_epoll.py +++ b/src/trio/_core/_io_epoll.py @@ -200,6 +200,8 @@ class _EpollStatistics: @attrs.define(eq=False, hash=False) class EpollIOManager: + # Using lambda here because otherwise crash on import with gevent monkey patching + # See https://github.com/python-trio/trio/issues/2848 _epoll: select.epoll = attrs.Factory(lambda: select.epoll()) # {fd: EpollWaiters} _registered: defaultdict[int, EpollWaiters] = attrs.Factory(