From 1b5adf99e43c6e8d1c5f091f3733c77a19579363 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Thu, 8 Sep 2011 22:51:45 -0700 Subject: [PATCH] Add on_connection_close hook to chat demo to clean up after closed connections. Closes #354. --- demos/chat/chatdemo.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/demos/chat/chatdemo.py b/demos/chat/chatdemo.py index 48f8a908..48c82f8a 100755 --- a/demos/chat/chatdemo.py +++ b/demos/chat/chatdemo.py @@ -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