]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add on_connection_close hook to chat demo to clean up after closed connections.
authorBen Darnell <ben@bendarnell.com>
Fri, 9 Sep 2011 05:51:45 +0000 (22:51 -0700)
committerBen Darnell <ben@bendarnell.com>
Fri, 9 Sep 2011 05:51:45 +0000 (22:51 -0700)
Closes #354.

demos/chat/chatdemo.py

index 48f8a908ec73bf165c910093e791282c485e98f7..48c82f8a77d637230663bd8943153ee7412a3ab5 100755 (executable)
@@ -62,7 +62,7 @@ class MainHandler(BaseHandler):
 
 
 class MessageMixin(object):
-    waiters = []
+    waiters = set()
     cache = []
     cache_size = 200
 
@@ -77,7 +77,11 @@ class MessageMixin(object):
             if recent:
                 callback(recent)
                 return
-        cls.waiters.append(callback)
+        cls.waiters.add(callback)
+
+    def cancel_wait(self, callback):
+        cls = MessageMixin
+        cls.waiters.remove(callback)
 
     def new_messages(self, messages):
         cls = MessageMixin
@@ -87,7 +91,7 @@ class MessageMixin(object):
                 callback(messages)
             except:
                 logging.error("Error in waiter callback", exc_info=True)
-        cls.waiters = []
+        cls.waiters = set()
         cls.cache.extend(messages)
         if len(cls.cache) > self.cache_size:
             cls.cache = cls.cache[-self.cache_size:]
@@ -114,7 +118,7 @@ class MessageUpdatesHandler(BaseHandler, MessageMixin):
     @tornado.web.asynchronous
     def post(self):
         cursor = self.get_argument("cursor", None)
-        self.wait_for_messages(self.async_callback(self.on_new_messages),
+        self.wait_for_messages(self.on_new_messages,
                                cursor=cursor)
 
     def on_new_messages(self, messages):
@@ -123,6 +127,9 @@ class MessageUpdatesHandler(BaseHandler, MessageMixin):
             return
         self.finish(dict(messages=messages))
 
+    def on_connection_close(self):
+        self.cancel_wait(self.on_new_messages)
+
 
 class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin):
     @tornado.web.asynchronous