summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2019-04-02 01:02:22 -0500
committerMichael Merickel <michael@merickel.org>2019-04-02 01:02:22 -0500
commitcacdafdc3451b337f7091e042444b90f056889db (patch)
tree146a127d13404de339e209e46be86ec581a05f6b
parent5bf34d52a27e3771718c67e52985d0f5bd6a838f (diff)
downloadwaitress-cacdafdc3451b337f7091e042444b90f056889db.tar.gz
switch to an RLock as handle_close is called sometimes during _flush_some
-rw-r--r--waitress/channel.py15
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):