summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2011-10-08 17:31:30 -0400
committerLance Stout <lancestout@gmail.com>2011-10-08 17:31:30 -0400
commit335dc2927bf874aa3ee3d4154257040b3b59db1a (patch)
tree067c15ac5713fed951dd0d9d09db79fa8f7a6327 /sleekxmpp/xmlstream
parentccbef6b6968b4d50192b290404869e18d33c8414 (diff)
downloadslixmpp-335dc2927bf874aa3ee3d4154257040b3b59db1a.tar.gz
slixmpp-335dc2927bf874aa3ee3d4154257040b3b59db1a.tar.bz2
slixmpp-335dc2927bf874aa3ee3d4154257040b3b59db1a.tar.xz
slixmpp-335dc2927bf874aa3ee3d4154257040b3b59db1a.zip
Break reference cycle to fix potential memory leaks for callback handlers.
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r--sleekxmpp/xmlstream/handler/base.py7
-rw-r--r--sleekxmpp/xmlstream/handler/waiter.py4
-rw-r--r--sleekxmpp/xmlstream/xmlstream.py3
3 files changed, 10 insertions, 4 deletions
diff --git a/sleekxmpp/xmlstream/handler/base.py b/sleekxmpp/xmlstream/handler/base.py
index 6ec9b6a3..7f05c757 100644
--- a/sleekxmpp/xmlstream/handler/base.py
+++ b/sleekxmpp/xmlstream/handler/base.py
@@ -6,6 +6,8 @@
See the file LICENSE for copying permission.
"""
+import weakref
+
class BaseHandler(object):
@@ -43,7 +45,10 @@ class BaseHandler(object):
stream -- The XMLStream instance the handler should monitor.
"""
self.name = name
- self.stream = stream
+ if stream is not None:
+ self.stream = weakref.ref(stream)
+ else:
+ self.stream = None
self._destroy = False
self._payload = None
self._matcher = matcher
diff --git a/sleekxmpp/xmlstream/handler/waiter.py b/sleekxmpp/xmlstream/handler/waiter.py
index 341c01fe..25dc161c 100644
--- a/sleekxmpp/xmlstream/handler/waiter.py
+++ b/sleekxmpp/xmlstream/handler/waiter.py
@@ -85,14 +85,14 @@ class Waiter(BaseHandler):
value sleekxmpp.xmlstream.RESPONSE_TIMEOUT.
"""
if timeout is None:
- timeout = self.stream.response_timeout
+ timeout = self.stream().response_timeout
try:
stanza = self._payload.get(True, timeout)
except queue.Empty:
stanza = False
log.warning("Timed out waiting for %s" % self.name)
- self.stream.removeHandler(self.name)
+ self.stream().remove_handler(self.name)
return stanza
def check_delete(self):
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index 0a66a974..8abbb3a1 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -19,6 +19,7 @@ import threading
import time
import types
import random
+import weakref
try:
import queue
except ImportError:
@@ -719,7 +720,7 @@ class XMLStream(object):
"""
if handler.stream is None:
self.__handlers.append(handler)
- handler.stream = self
+ handler.stream = weakref.ref(self)
def remove_handler(self, name):
"""