Exemplo n.º 1
0
    def Pipe(duplex=True):
        '''
        Returns pair of connection objects at either end of a pipe
        '''
        address = arbitrary_address('AF_PIPE')
        if duplex:
            openmode = win32.PIPE_ACCESS_DUPLEX
            access = win32.GENERIC_READ | win32.GENERIC_WRITE
            obsize, ibsize = BUFSIZE, BUFSIZE
        else:
            openmode = win32.PIPE_ACCESS_INBOUND
            access = win32.GENERIC_WRITE
            obsize, ibsize = 0, BUFSIZE

        h1 = win32.CreateNamedPipe(
            address, openmode, win32.PIPE_TYPE_MESSAGE
            | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT, 1, obsize, ibsize,
            win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
        h2 = win32.CreateFile(address, access, 0, win32.NULL,
                              win32.OPEN_EXISTING, 0, win32.NULL)
        win32.SetNamedPipeHandleState(h2, win32.PIPE_READMODE_MESSAGE, None,
                                      None)

        try:
            win32.ConnectNamedPipe(h1, win32.NULL)
        except WindowsError as e:
            if e.args[0] != win32.ERROR_PIPE_CONNECTED:
                raise

        c1 = _multiprocessing.PipeConnection(h1, writable=duplex)
        c2 = _multiprocessing.PipeConnection(h2, readable=duplex)

        return c1, c2
Exemplo n.º 2
0
    class PipeListener(object):
        '''
        Representation of a named pipe
        '''
        def __init__(self, address, backlog=None):
            self._address = address
            handle = win32.CreateNamedPipe(
                address, win32.PIPE_ACCESS_DUPLEX, win32.PIPE_TYPE_MESSAGE
                | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT,
                win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE,
                win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
            self._handle_queue = [handle]
            self._last_accepted = None

            sub_debug('listener created with address=%r', self._address)

            self.close = Finalize(self,
                                  PipeListener._finalize_pipe_listener,
                                  args=(self._handle_queue, self._address),
                                  exitpriority=0)

        def accept(self):
            newhandle = win32.CreateNamedPipe(
                self._address, win32.PIPE_ACCESS_DUPLEX,
                win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE
                | win32.PIPE_WAIT, win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE,
                BUFSIZE, win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
            self._handle_queue.append(newhandle)
            handle = self._handle_queue.pop(0)
            try:
                win32.ConnectNamedPipe(handle, win32.NULL)
            except WindowsError, e:
                if e.args[0] != win32.ERROR_PIPE_CONNECTED:
                    raise
            return _multiprocessing.PipeConnection(handle)
Exemplo n.º 3
0
    def PipeClient(address):
        '''
        Return a connection object connected to the pipe given by `address`
        '''
        t = _init_timeout()
        while 1:
            try:
                win32.WaitNamedPipe(address, 1000)
                h = win32.CreateFile(address,
                                     win32.GENERIC_READ | win32.GENERIC_WRITE,
                                     0, win32.NULL, win32.OPEN_EXISTING, 0,
                                     win32.NULL)
            except WindowsError as e:
                if e.args[0] not in (
                        win32.ERROR_SEM_TIMEOUT,
                        win32.ERROR_PIPE_BUSY) or _check_timeout(t):
                    raise
            else:
                break
        else:
            raise

        win32.SetNamedPipeHandleState(h, win32.PIPE_READMODE_MESSAGE, None,
                                      None)
        return _multiprocessing.PipeConnection(h)
Exemplo n.º 4
0
 def test_repr(self):
     import _multiprocessing
     c = _multiprocessing.Connection(1)
     assert repr(c) == '<read-write Connection, handle 1>'
     if hasattr(_multiprocessing, 'PipeConnection'):
         c = _multiprocessing.PipeConnection(1)
         assert repr(c) == '<read-write PipeConnection, handle 1>'
Exemplo n.º 5
0
 def test_repr(self):
     import _multiprocessing, os
     fd = os.dup(1)  # closed by Connection.__del__
     c = _multiprocessing.Connection(fd)
     assert repr(c) == '<read-write Connection, handle %d>' % fd
     if hasattr(_multiprocessing, 'PipeConnection'):
         fd = os.dup(1)  # closed by PipeConnection.__del__
         c = _multiprocessing.PipeConnection(fd)
         assert repr(c) == '<read-write PipeConnection, handle %d>' % fd
Exemplo n.º 6
0
        def accept(self):
            newhandle = win32.CreateNamedPipe(self._address, win32.PIPE_ACCESS_DUPLEX, win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT, win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
            self._handle_queue.append(newhandle)
            handle = self._handle_queue.pop(0)
            try:
                win32.ConnectNamedPipe(handle, win32.NULL)
            except WindowsError as e:
                if e.args[0] != win32.ERROR_PIPE_CONNECTED:
                    raise

            return _multiprocessing.PipeConnection(handle)
Exemplo n.º 7
0
 def accept(self):
     newhandle = win32.CreateNamedPipe(
         self._address, win32.PIPE_ACCESS_DUPLEX,
         win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE
         | win32.PIPE_WAIT, win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE,
         BUFSIZE, win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
     self._handle_queue.append(newhandle)
     handle = self._handle_queue.pop(0)
     try:
         win32.ConnectNamedPipe(handle, win32.NULL)
     except WindowsError as e:
         # ERROR_NO_DATA can occur if a client has already connected,
         # written data and then disconnected -- see Issue 14725.
         if e.args[0] not in (win32.ERROR_PIPE_CONNECTED,
                              win32.ERROR_NO_DATA):
             raise
     return _multiprocessing.PipeConnection(handle)
Exemplo n.º 8
0
        h1 = win32.CreateNamedPipe(
            address, openmode, win32.PIPE_TYPE_MESSAGE
            | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT, 1, obsize, ibsize,
            win32.NMPWAIT_WAIT_FOREVER, win32.NULL)
        h2 = win32.CreateFile(address, access, 0, win32.NULL,
                              win32.OPEN_EXISTING, 0, win32.NULL)
        win32.SetNamedPipeHandleState(h2, win32.PIPE_READMODE_MESSAGE, None,
                                      None)

        try:
            win32.ConnectNamedPipe(h1, win32.NULL)
        except WindowsError, e:
            if e.args[0] != win32.ERROR_PIPE_CONNECTED:
                raise

        c1 = _multiprocessing.PipeConnection(h1, writable=duplex)
        c2 = _multiprocessing.PipeConnection(h2, readable=duplex)

        return c1, c2


#
# Definitions for connections based on sockets
#


class SocketListener(object):
    '''
    Representation of a socket which is bound to an address and listening
    '''
    def __init__(self, address, family, backlog=1):
Exemplo n.º 9
0
 def rebuild_pipe_connection(reduced_handle, readable, writable):
     handle = rebuild_handle(reduced_handle)
     return _multiprocessing.PipeConnection(handle,
                                            readable=readable,
                                            writable=writable)
Exemplo n.º 10
0
 def from_handle(cls, phandle, *args, **kwargs):
     """Create a :class:`PipeConnection` from pipe handle `phandle`"""
     connection = _multiprocessing.PipeConnection(phandle)
     return cls(connection, *args, **kwargs)