From a0a37c19ffd5ae530341e7e306413a0a6c95fab2 Mon Sep 17 00:00:00 2001 From: mathieui Date: Wed, 5 Oct 2016 20:18:51 +0200 Subject: Remove monkeypatching hack on the event loop This allowed us to schedule events in-order later in the event loop, but was detrimental to using other event loops and debugging. --- slixmpp/xmlstream/asyncio.py | 30 +----------------------------- slixmpp/xmlstream/xmlstream.py | 4 ++-- 2 files changed, 3 insertions(+), 31 deletions(-) diff --git a/slixmpp/xmlstream/asyncio.py b/slixmpp/xmlstream/asyncio.py index 0e0f610a..b42b366a 100644 --- a/slixmpp/xmlstream/asyncio.py +++ b/slixmpp/xmlstream/asyncio.py @@ -1,38 +1,10 @@ """ -A module that monkey patches the standard asyncio module to add an -idle_call() method to the main loop. This method is used to execute a -callback whenever the loop is not busy handling anything else. This means -that it is a callback with lower priority than IO, timer, or even -call_soon() ones. These callback are called only once each. +asyncio-related utilities """ import asyncio -from asyncio import events from functools import wraps -import collections - -def idle_call(self, callback): - if asyncio.iscoroutinefunction(callback): - raise TypeError("coroutines cannot be used with idle_call()") - handle = events.Handle(callback, [], self) - self._idle.append(handle) - -def my_run_once(self): - if self._idle: - self._ready.append(events.Handle(lambda: None, (), self)) - real_run_once(self) - if self._idle: - handle = self._idle.popleft() - handle._run() - -cls = asyncio.get_event_loop().__class__ - -cls._idle = collections.deque() -cls.idle_call = idle_call -real_run_once = cls._run_once -cls._run_once = my_run_once - def future_wrapper(func): """ Make sure the result of a function call is an asyncio.Future() diff --git a/slixmpp/xmlstream/xmlstream.py b/slixmpp/xmlstream/xmlstream.py index c491746d..a691d34c 100644 --- a/slixmpp/xmlstream/xmlstream.py +++ b/slixmpp/xmlstream/xmlstream.py @@ -380,7 +380,7 @@ class XMLStream(asyncio.BaseProtocol): elif self.xml_depth == 1: # A stanza is an XML element that is a direct child of # the root element, hence the check of depth == 1 - self.loop.idle_call(functools.partial(self.__spawn_event, xml)) + self._spawn_event(xml) if self.xml_root is not None: # Keep the root element empty of children to # save on memory use. @@ -893,7 +893,7 @@ class XMLStream(asyncio.BaseProtocol): stanza['lang'] = self.peer_default_lang return stanza - def __spawn_event(self, xml): + def _spawn_event(self, xml): """ Analyze incoming XML stanzas and convert them into stanza objects if applicable and queue stream events to be processed -- cgit v1.2.3