Windows compatibility for tpool as requested by rtyler. Not yet tested on Windows!
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -23,6 +23,7 @@ Linden Lab Contributors
|
|||||||
|
|
||||||
Thanks To
|
Thanks To
|
||||||
---------
|
---------
|
||||||
|
* R. Tyler Ballance, bug report on tpool on Windows
|
||||||
* Sergey Shepelev, PEP 8 police :-)
|
* Sergey Shepelev, PEP 8 police :-)
|
||||||
* Luci Stanescu, for reporting twisted hub bug
|
* Luci Stanescu, for reporting twisted hub bug
|
||||||
* Marcus Cavanaugh, for test case code that has been incredibly useful in tracking down bugs
|
* Marcus Cavanaugh, for test case code that has been incredibly useful in tracking down bugs
|
||||||
|
@@ -22,11 +22,11 @@ from eventlet import api, coros, greenio
|
|||||||
|
|
||||||
QUIET=False
|
QUIET=False
|
||||||
|
|
||||||
_rpipe = _wpipe = _rfile = None
|
_rfile = _wfile = None
|
||||||
|
|
||||||
def _signal_t2e():
|
def _signal_t2e():
|
||||||
from eventlet import util
|
from eventlet import util
|
||||||
nwritten = util.__original_write__(_wpipe, ' ')
|
sent = util.__original_write__(_wfile.fileno(), ' ')
|
||||||
|
|
||||||
_reqq = Queue(maxsize=-1)
|
_reqq = Queue(maxsize=-1)
|
||||||
_rspq = Queue(maxsize=-1)
|
_rspq = Queue(maxsize=-1)
|
||||||
@@ -35,7 +35,7 @@ def tpool_trampoline():
|
|||||||
global _reqq, _rspq
|
global _reqq, _rspq
|
||||||
while(True):
|
while(True):
|
||||||
try:
|
try:
|
||||||
_c = _rfile.recv(1)
|
_c = _rfile.read(1)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
break # will be raised when pipe is closed
|
break # will be raised when pipe is closed
|
||||||
assert(_c != "")
|
assert(_c != "")
|
||||||
@@ -173,16 +173,33 @@ _threads = {}
|
|||||||
_coro = None
|
_coro = None
|
||||||
_setup_already = False
|
_setup_already = False
|
||||||
def setup():
|
def setup():
|
||||||
global _rpipe, _wpipe, _rfile, _threads, _coro, _setup_already
|
global _rfile, _wfile, _threads, _coro, _setup_already
|
||||||
if _setup_already:
|
if _setup_already:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
_setup_already = True
|
_setup_already = True
|
||||||
_rpipe, _wpipe = os.pipe()
|
try:
|
||||||
_rfile = os.fdopen(_rpipe,"r",0)
|
_rpipe, _wpipe = os.pipe()
|
||||||
## Work whether or not wrap_pipe_with_coroutine_pipe was called
|
_wfile = os.fdopen(_wpipe,"w",0)
|
||||||
if not isinstance(_rfile, greenio.GreenPipe):
|
_rfile = os.fdopen(_rpipe,"r",0)
|
||||||
_rfile = greenio.GreenPipe(_rfile)
|
## Work whether or not wrap_pipe_with_coroutine_pipe was called
|
||||||
|
if not isinstance(_rfile, greenio.GreenPipe):
|
||||||
|
_rfile = greenio.GreenPipe(_rfile)
|
||||||
|
except ImportError:
|
||||||
|
# This is Windows compatibility -- use a socket instead of a pipe because
|
||||||
|
# pipes don't really exist on Windows.
|
||||||
|
import socket
|
||||||
|
from eventlet import util
|
||||||
|
sock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
sock.bind(('localhost', 0))
|
||||||
|
sock.listen(50)
|
||||||
|
csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
csock.connect(('localhost', sock.getsockname()[1]))
|
||||||
|
csock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||||
|
nsock, addr = sock.accept()
|
||||||
|
nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||||
|
_rfile = greenio.GreenFile(greenio.GreenSocket(csock))
|
||||||
|
_wfile = nsock.makefile()
|
||||||
|
|
||||||
for i in range(0,_nthreads):
|
for i in range(0,_nthreads):
|
||||||
_threads[i] = threading.Thread(target=tworker)
|
_threads[i] = threading.Thread(target=tworker)
|
||||||
@@ -199,6 +216,7 @@ def killall():
|
|||||||
_reqq.put(None)
|
_reqq.put(None)
|
||||||
for thr in _threads.values():
|
for thr in _threads.values():
|
||||||
thr.join()
|
thr.join()
|
||||||
_rfile.close()
|
|
||||||
api.kill(_coro)
|
api.kill(_coro)
|
||||||
|
_rfile.close()
|
||||||
|
_wfile.close()
|
||||||
_setup_already = False
|
_setup_already = False
|
||||||
|
Reference in New Issue
Block a user