]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Small speedups
authorBen Darnell <ben@bendarnell.com>
Sun, 15 May 2011 04:25:31 +0000 (21:25 -0700)
committerBen Darnell <ben@bendarnell.com>
Sun, 15 May 2011 04:25:31 +0000 (21:25 -0700)
tornado/ioloop.py
tornado/iostream.py
tornado/stack_context.py
tornado/web.py

index a7bdffc3c8c6484681c2ea09121376c299f867f8..f1a4794b75297069e1e769e9f99db4c27319e3b2 100644 (file)
@@ -341,8 +341,9 @@ class IOLoop(object):
         from that IOLoop's thread.  add_callback() may be used to transfer
         control from other threads to the IOLoop's thread.
         """
+        if not self._callbacks:
+            self._wake()
         self._callbacks.append(stack_context.wrap(callback))
-        self._wake()
 
     def _wake(self):
         try:
index 3a9efcfef2a19dc0754d1d45f3c1e1d996cb2689..cb67f3ae4e885211d058590d611cf8c9a130ffd5 100644 (file)
@@ -524,7 +524,7 @@ def _merge_prefix(deque, size):
     >>> _merge_prefix(d, 100); print d
     deque(['abcdefghij'])
     """
-    if len(deque) == 1 and len(deque[0]) < size:
+    if len(deque) == 1 and len(deque[0]) <= size:
         return
     prefix = []
     remaining = size
index c5570b499b77ffbc6b56979804041554f816a4da..61b4260616bd6b730da29044ad58373f238c2153 100644 (file)
@@ -55,8 +55,6 @@ import logging
 import sys
 import threading
 
-NoneType = type(None)
-
 class _State(threading.local):
     def __init__(self):
         self.contexts = ()
@@ -149,6 +147,8 @@ def wrap(fn):
     different execution context (either in a different thread or
     asynchronously in the same thread).
     '''
+    if fn is None or fn.__class__ is _StackContextWrapper:
+        return fn
     # functools.wraps doesn't appear to work on functools.partial objects
     #@functools.wraps(fn)
     def wrapped(callback, contexts, *args, **kwargs):
@@ -180,8 +180,6 @@ def wrap(fn):
                 callback(*args, **kwargs)
         else:
             callback(*args, **kwargs)
-    if isinstance(fn, (_StackContextWrapper, NoneType)):
-        return fn
     return _StackContextWrapper(wrapped, fn, _state.contexts)
 
 @contextlib.contextmanager
index 5a021f334f0357fdbdd346758f436775fa6063e2..07021315d79a3e392115347da18cc5b6dca11c6c 100644 (file)
@@ -206,12 +206,7 @@ class RequestHandler(object):
         HTTP specification. If the value is not a string, we convert it to
         a string. All header values are then encoded as UTF-8.
         """
-        if isinstance(value, datetime.datetime):
-            t = calendar.timegm(value.utctimetuple())
-            value = email.utils.formatdate(t, localtime=False, usegmt=True)
-        elif isinstance(value, int) or isinstance(value, long):
-            value = str(value)
-        else:
+        if isinstance(value, basestring):
             value = utf8(value)
             # If \n is allowed into the header, it is possible to inject
             # additional headers or split the request. Also cap length to
@@ -219,6 +214,13 @@ class RequestHandler(object):
             safe_value = re.sub(b(r"[\x00-\x1f]"), b(" "), value)[:4000]
             if safe_value != value:
                 raise ValueError("Unsafe header value %r", value)
+        elif isinstance(value, datetime.datetime):
+            t = calendar.timegm(value.utctimetuple())
+            value = email.utils.formatdate(t, localtime=False, usegmt=True)
+        elif isinstance(value, int) or isinstance(value, long):
+            value = str(value)
+        else:
+            raise TypeError("Unsupported header value %r" % value)
         self._headers[name] = value
 
     _ARG_DEFAULT = []