diff --git a/klippy/reactor.py b/klippy/reactor.py index aab57d992..6b54144fa 100644 --- a/klippy/reactor.py +++ b/klippy/reactor.py @@ -305,7 +305,6 @@ class SelectReactor: return eventtime # Main loop def _dispatch_loop(self): - self._g_dispatch = greenlet.getcurrent() busy = True eventtime = self.monotonic() while self._process: @@ -318,16 +317,21 @@ class SelectReactor: hdls = ([(fd, self._READ) for fd in res[0]] + [(fd, self._WRITE) for fd in res[1]]) eventtime = self._check_fds(eventtime, hdls) - self._g_dispatch = None def run(self): if self._pipe_fds is None: self._setup_async_callbacks() self._process = True self._prevent_pause_count = 0 - while self._process: - g_next = ReactorGreenlet(run=self._dispatch_loop) - self._all_greenlets.append(g_next) - g_next.switch() + try: + while self._process: + # Create new greenlet to dispatch timers and events + g_next = ReactorGreenlet(run=self._dispatch_loop) + self._all_greenlets.append(g_next) + self._g_dispatch = g_next + g_next.switch() + # Control returns here on end() request or switch from pause() + finally: + self._g_dispatch = None def end(self): self._process = False def finalize(self): @@ -368,7 +372,6 @@ class PollReactor(SelectReactor): self._poll.modify(file_handler.fd, flags) # Main loop def _dispatch_loop(self): - self._g_dispatch = greenlet.getcurrent() busy = True eventtime = self.monotonic() while self._process: @@ -379,7 +382,6 @@ class PollReactor(SelectReactor): if res: busy = True eventtime = self._check_fds(eventtime, res) - self._g_dispatch = None class EPollReactor(SelectReactor): def __init__(self, gc_checking=False): @@ -405,7 +407,6 @@ class EPollReactor(SelectReactor): self._epoll.modify(file_handler.fd, flags) # Main loop def _dispatch_loop(self): - self._g_dispatch = greenlet.getcurrent() busy = True eventtime = self.monotonic() while self._process: @@ -416,7 +417,6 @@ class EPollReactor(SelectReactor): if res: busy = True eventtime = self._check_fds(eventtime, res) - self._g_dispatch = None # Use the poll based reactor if it is available try: