[tor-commits] [pytorctl/master] Removing indefinite blocking on socket recv
mikeperry at torproject.org
mikeperry at torproject.org
Fri Jun 17 01:22:06 UTC 2011
commit 4824d623487e0d305029ea46326eba94b4e4b738
Author: Damian Johnson <atagar at torproject.org>
Date: Sun Jun 12 20:40:49 2011 -0700
Removing indefinite blocking on socket recv
When shutting down we can't join on _thread unless the socket receives data
because we didn't have a timeout. This issues a 20 ms timeout on socket reads
and cleans up _thread when we close.
---
TorCtl.py | 5 +----
TorUtil.py | 11 ++++++++++-
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/TorCtl.py b/TorCtl.py
index 5403a95..b87f5f2 100755
--- a/TorCtl.py
+++ b/TorCtl.py
@@ -642,11 +642,8 @@ class Connection:
self._queue.put("CLOSE")
self._eventQueue.put((time.time(), "CLOSE"))
self._closed = 1
- # XXX: For some reason, this does not cause the readline in
- # self._read_reply() to return immediately. The _loop() thread
- # thus tends to stick around until some event causes data to come
- # back...
self._s.close()
+ self._thread.join()
self._eventThread.join()
finally:
self._sendLock.release()
diff --git a/TorUtil.py b/TorUtil.py
index 9e28779..c1bebf9 100644
--- a/TorUtil.py
+++ b/TorUtil.py
@@ -188,6 +188,10 @@ def unescape_dots(s, translate_nl=1):
# XXX: Exception handling
class BufSock:
def __init__(self, s):
+ # sets a timeout on our recv operations
+ s.settimeout(0.02)
+ self._isDone = False
+
self._s = s
self._buf = []
@@ -200,7 +204,11 @@ class BufSock:
return result
while 1:
- s = self._s.recv(128)
+ try:
+ s = self._s.recv(128)
+ except socket.timeout:
+ if not self._isDone: continue
+
if not s: return None
# XXX: This really does need an exception
# raise ConnectionClosed()
@@ -221,6 +229,7 @@ class BufSock:
self._s.send(s)
def close(self):
+ self._isDone = True
self._s.close()
# SocketServer.TCPServer is nuts..
More information about the tor-commits
mailing list