More cleanup of util and wrappedfd.
This commit is contained in:
		@@ -111,7 +111,7 @@ class TestDyingProcessesLeavePool(tests.TestCase):
 | 
			
		||||
class TestProcessLivesForever(tests.TestCase):
 | 
			
		||||
    mode = 'static'
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        self.pool = processes.ProcessPool('python', ['-c', 'print "y"; print "y"'], max_size=1)
 | 
			
		||||
        self.pool = processes.ProcessPool('python', ['-c', 'print "y"; import time; time.sleep(0.1); print "y"'], max_size=1)
 | 
			
		||||
 | 
			
		||||
    def test_reading_twice_from_same_process(self):
 | 
			
		||||
        proc = self.pool.get()
 | 
			
		||||
 
 | 
			
		||||
@@ -62,15 +62,6 @@ def g_log(*args):
 | 
			
		||||
        ident = 'greenlet-%d' % (g_id,)
 | 
			
		||||
    print >>sys.stderr, '[%s] %s' % (ident, ' '.join(map(str, args)))
 | 
			
		||||
 | 
			
		||||
CONNECT_ERR = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK)
 | 
			
		||||
CONNECT_SUCCESS = (0, errno.EISCONN)
 | 
			
		||||
def socket_connect(descriptor, address):
 | 
			
		||||
    err = descriptor.connect_ex(address)
 | 
			
		||||
    if err in CONNECT_ERR:
 | 
			
		||||
        return None
 | 
			
		||||
    if err not in CONNECT_SUCCESS:
 | 
			
		||||
        raise socket.error(err, errno.errorcode[err])
 | 
			
		||||
    return descriptor
 | 
			
		||||
 | 
			
		||||
__original_socket__ = socket.socket
 | 
			
		||||
 | 
			
		||||
@@ -116,47 +107,6 @@ def socket_bind_and_listen(descriptor, addr=('', 0), backlog=50):
 | 
			
		||||
    descriptor.bind(addr)
 | 
			
		||||
    descriptor.listen(backlog)
 | 
			
		||||
    return descriptor
 | 
			
		||||
    
 | 
			
		||||
def socket_accept(descriptor):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.accept()
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return None
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
def socket_send(descriptor, data):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.send(data)
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return 0
 | 
			
		||||
        raise
 | 
			
		||||
    except SSL.WantWriteError:
 | 
			
		||||
        return 0
 | 
			
		||||
    except SSL.WantReadError:
 | 
			
		||||
        return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# winsock sometimes throws ENOTCONN
 | 
			
		||||
SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN)
 | 
			
		||||
def socket_recv(descriptor, buflen):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.recv(buflen)
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return None
 | 
			
		||||
        if e[0] in SOCKET_CLOSED:
 | 
			
		||||
            return ''
 | 
			
		||||
        raise
 | 
			
		||||
    except SSL.WantReadError:
 | 
			
		||||
        return None
 | 
			
		||||
    except SSL.ZeroReturnError:
 | 
			
		||||
        return ''
 | 
			
		||||
    except SSL.SysCallError, e:
 | 
			
		||||
        if e[0] == -1 or e[0] > 0:
 | 
			
		||||
            raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def set_reuse_addr(descriptor):
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,8 @@ import socket, errno
 | 
			
		||||
from errno import EWOULDBLOCK, EAGAIN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ['GreenSocket', 'GreenFile', 'GreenPipe']
 | 
			
		||||
 | 
			
		||||
def higher_order_recv(recv_func):
 | 
			
		||||
    def recv(self, buflen):
 | 
			
		||||
        buf = self.recvbuffer
 | 
			
		||||
@@ -64,6 +66,60 @@ def higher_order_send(send_func):
 | 
			
		||||
    return send
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONNECT_ERR = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK)
 | 
			
		||||
CONNECT_SUCCESS = (0, errno.EISCONN)
 | 
			
		||||
def socket_connect(descriptor, address):
 | 
			
		||||
    err = descriptor.connect_ex(address)
 | 
			
		||||
    if err in CONNECT_ERR:
 | 
			
		||||
        return None
 | 
			
		||||
    if err not in CONNECT_SUCCESS:
 | 
			
		||||
        raise socket.error(err, errno.errorcode[err])
 | 
			
		||||
    return descriptor
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def socket_accept(descriptor):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.accept()
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return None
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def socket_send(descriptor, data):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.send(data)
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return 0
 | 
			
		||||
        raise
 | 
			
		||||
    except SSL.WantWriteError:
 | 
			
		||||
        return 0
 | 
			
		||||
    except SSL.WantReadError:
 | 
			
		||||
        return 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# winsock sometimes throws ENOTCONN
 | 
			
		||||
SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN)
 | 
			
		||||
def socket_recv(descriptor, buflen):
 | 
			
		||||
    try:
 | 
			
		||||
        return descriptor.recv(buflen)
 | 
			
		||||
    except socket.error, e:
 | 
			
		||||
        if e[0] == errno.EWOULDBLOCK:
 | 
			
		||||
            return None
 | 
			
		||||
        if e[0] in SOCKET_CLOSED:
 | 
			
		||||
            return ''
 | 
			
		||||
        raise
 | 
			
		||||
    except SSL.WantReadError:
 | 
			
		||||
        return None
 | 
			
		||||
    except SSL.ZeroReturnError:
 | 
			
		||||
        return ''
 | 
			
		||||
    except SSL.SysCallError, e:
 | 
			
		||||
        if e[0] == -1 or e[0] > 0:
 | 
			
		||||
            raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def file_recv(fd, buflen):
 | 
			
		||||
    try:
 | 
			
		||||
        return fd.read(buflen)
 | 
			
		||||
@@ -106,7 +162,7 @@ class GreenSocket(object):
 | 
			
		||||
    def accept(self):
 | 
			
		||||
        fd = self.fd
 | 
			
		||||
        while True:
 | 
			
		||||
            res = util.socket_accept(fd)
 | 
			
		||||
            res = socket_accept(fd)
 | 
			
		||||
            if res is not None:
 | 
			
		||||
                client, addr = res
 | 
			
		||||
                util.set_nonblocking(client)
 | 
			
		||||
@@ -132,7 +188,7 @@ class GreenSocket(object):
 | 
			
		||||
        
 | 
			
		||||
    def connect(self, address):
 | 
			
		||||
        fd = self.fd
 | 
			
		||||
        connect = util.socket_connect
 | 
			
		||||
        connect = socket_connect
 | 
			
		||||
        while not connect(fd, address):
 | 
			
		||||
            trampoline(fd, read=True, write=True)
 | 
			
		||||
            
 | 
			
		||||
@@ -173,7 +229,7 @@ class GreenSocket(object):
 | 
			
		||||
    def makefile(self, mode = None, bufsize = None):
 | 
			
		||||
        return GreenFile(self.dup())
 | 
			
		||||
    
 | 
			
		||||
    recv = higher_order_recv(util.socket_recv)
 | 
			
		||||
    recv = higher_order_recv(socket_recv)
 | 
			
		||||
    
 | 
			
		||||
    def recvfrom(self, *args):
 | 
			
		||||
        trampoline(self.fd, read=True)
 | 
			
		||||
@@ -182,7 +238,7 @@ class GreenSocket(object):
 | 
			
		||||
    # TODO recvfrom_into
 | 
			
		||||
    # TODO recv_into
 | 
			
		||||
    
 | 
			
		||||
    send = higher_order_send(util.socket_send)
 | 
			
		||||
    send = higher_order_send(socket_send)
 | 
			
		||||
    
 | 
			
		||||
    def sendall(self, data):
 | 
			
		||||
        fd = self.fd
 | 
			
		||||
@@ -317,7 +373,9 @@ class GreenFile(object):
 | 
			
		||||
        return ''.join(lst)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MetaSocket(GreenSocket):
 | 
			
		||||
class GreenPipeSocket(GreenSocket):
 | 
			
		||||
    """ This is a weird class that looks like a socket but expects a file descriptor as an argument instead of a socket.
 | 
			
		||||
    """
 | 
			
		||||
    recv = higher_order_recv(file_recv)
 | 
			
		||||
 | 
			
		||||
    send = higher_order_send(file_send)
 | 
			
		||||
@@ -325,10 +383,16 @@ class MetaSocket(GreenSocket):
 | 
			
		||||
 | 
			
		||||
class GreenPipe(GreenFile):        
 | 
			
		||||
    def __init__(self, fd):
 | 
			
		||||
        self.fd = MetaSocket(fd)
 | 
			
		||||
        self.recv = self.fd.recv
 | 
			
		||||
        self.send = self.fd.send
 | 
			
		||||
        self.fd = GreenPipeSocket(fd)
 | 
			
		||||
        super(GreenPipe, self).__init__(self.fd)
 | 
			
		||||
 | 
			
		||||
    def recv(self, *args, **kw):
 | 
			
		||||
        fn = self.recv = self.fd.recv
 | 
			
		||||
        return fn(*args, **kw)
 | 
			
		||||
 | 
			
		||||
    def send(self, *args, **kw):
 | 
			
		||||
        fn = self.send = self.fd.send
 | 
			
		||||
        return fn(*args, **kw)
 | 
			
		||||
 | 
			
		||||
    def flush(self):
 | 
			
		||||
        self.fd.fd.flush()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user