From 840392fa34b61cea923149f813df6c3d72d9aedd Mon Sep 17 00:00:00 2001 From: Andrej A Antonov Date: Sat, 21 Apr 2012 01:34:00 +0400 Subject: [PATCH] double-checked-locking in tornado.ioloop.IOLoop.instance() --- tornado/ioloop.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tornado/ioloop.py b/tornado/ioloop.py index abb2de02..3e142298 100644 --- a/tornado/ioloop.py +++ b/tornado/ioloop.py @@ -104,6 +104,9 @@ class IOLoop(object): WRITE = _EPOLLOUT ERROR = _EPOLLERR | _EPOLLHUP + # Global lock for creating global IOLoop instance + _instance_lock = threading.Lock() + def __init__(self, impl=None): self._impl = impl or _poll() if hasattr(self._impl, 'fileno'): @@ -142,7 +145,10 @@ class IOLoop(object): self.io_loop = io_loop or IOLoop.instance() """ if not hasattr(IOLoop, "_instance"): - IOLoop._instance = IOLoop() + with IOLoop._instance_lock: + if not hasattr(IOLoop, "_instance"): + # New instance after double check + IOLoop._instance = IOLoop() return IOLoop._instance @staticmethod