diff options
author | Michael Merickel <michael@merickel.org> | 2019-04-02 01:02:22 -0500 |
---|---|---|
committer | Michael Merickel <michael@merickel.org> | 2019-04-02 01:02:22 -0500 |
commit | cacdafdc3451b337f7091e042444b90f056889db (patch) | |
tree | 146a127d13404de339e209e46be86ec581a05f6b | |
parent | 5bf34d52a27e3771718c67e52985d0f5bd6a838f (diff) | |
download | waitress-cacdafdc3451b337f7091e042444b90f056889db.tar.gz |
switch to an RLock as handle_close is called sometimes during _flush_some
-rw-r--r-- | waitress/channel.py | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/waitress/channel.py b/waitress/channel.py index e717dd7..cb829f0 100644 --- a/waitress/channel.py +++ b/waitress/channel.py @@ -75,7 +75,7 @@ class HTTPChannel(wasyncore.dispatcher, object): # task_lock used to push/pop requests self.task_lock = threading.Lock() # outbuf_lock used to access any outbuf - self.outbuf_lock = threading.Lock() + self.outbuf_lock = threading.RLock() wasyncore.dispatcher.__init__(self, sock, map=map) @@ -151,7 +151,7 @@ class HTTPChannel(wasyncore.dispatcher, object): self.will_close = True if self.will_close: - self.handle_close(lock=False) + self.handle_close() def readable(self): # We might want to create a new task. We can only do this if: @@ -168,7 +168,7 @@ class HTTPChannel(wasyncore.dispatcher, object): except socket.error: if self.adj.log_socket_errors: self.logger.exception('Socket error') - self.handle_close(lock=True) + self.handle_close() return if data: self.last_activity = time.time() @@ -274,11 +274,9 @@ class HTTPChannel(wasyncore.dispatcher, object): return False - def handle_close(self, lock=True): + def handle_close(self): # NB: default to True for when asyncore calls this function directly - if lock: - self.outbuf_lock.acquire() - try: + with self.outbuf_lock: for outbuf in self.outbufs: try: outbuf.close() @@ -286,9 +284,6 @@ class HTTPChannel(wasyncore.dispatcher, object): self.logger.exception( 'Unknown exception while trying to close outbuf') self.connected = False - finally: - if lock: - self.outbuf_lock.release() wasyncore.dispatcher.close(self) def add_channel(self, map=None): |