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

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

        overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True)
        _, err = overlapped.GetOverlappedResult(True)
        assert err == 0

        c1 = PipeConnection(duplicate(h1, inheritable=True), writable=duplex)
        c2 = PipeConnection(duplicate(h2, inheritable=True), readable=duplex)
        _winapi.CloseHandle(h1)
        _winapi.CloseHandle(h2)
        return c1, c2
Ejemplo n.º 2
0
 def __init__(self, name: str, timeout: Optional[float] = None) -> None:
     if sys.platform == 'win32':
         name = r'\\.\pipe\{}-{}.pipe'.format(
             name,
             base64.urlsafe_b64encode(os.urandom(6)).decode())
     else:
         name = f'{name}.sock'
     super().__init__(name, timeout)
     if sys.platform == 'win32':
         self.connection = _winapi.CreateNamedPipe(
             self.name,
             _winapi.PIPE_ACCESS_DUPLEX
             | _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
             | _winapi.FILE_FLAG_OVERLAPPED,
             _winapi.PIPE_READMODE_MESSAGE
             | _winapi.PIPE_TYPE_MESSAGE
             | _winapi.PIPE_WAIT
             | 0x8,  # PIPE_REJECT_REMOTE_CLIENTS
             1,  # one instance
             self.BUFFER_SIZE,
             self.BUFFER_SIZE,
             _winapi.NMPWAIT_WAIT_FOREVER,
             0,  # Use default security descriptor
         )
         if self.connection == -1:  # INVALID_HANDLE_VALUE
             err = _winapi.GetLastError()
             raise IPCException(f'Invalid handle to pipe: {err}')
     else:
         self.sock_directory = tempfile.mkdtemp()
         sockfile = os.path.join(self.sock_directory, self.name)
         self.sock = socket.socket(socket.AF_UNIX)
         self.sock.bind(sockfile)
         self.sock.listen(1)
         if timeout is not None:
             self.sock.settimeout(timeout)
Ejemplo n.º 3
0
def PipeServerConnection(address,
                         readable,
                         writable,
                         timeout=nDefaultTimeOut.NMPWAIT_WAIT_FOREVER):
    open_mode = (0x00000000
                 | dwOpenMode.FILE_FLAG_OVERLAPPED
                 | dwOpenMode.FILE_FLAG_FIRST_PIPE_INSTANCE
                 | (readable and dwOpenMode.PIPE_ACCESS_INBOUND or 0x00000000)
                 |
                 (writable and dwOpenMode.PIPE_ACCESS_OUTBOUND or 0x00000000))
    pipe_mode = (0x00000000
                 | (readable and dwPipeMode.PIPE_READMODE_BYTE or 0x00000000)
                 | (writable and dwPipeMode.PIPE_TYPE_BYTE or 0x00000000)
                 | dwPipeMode.PIPE_WAIT)
    # https://msdn.microsoft.com/en-US/library/windows/desktop/aa365150.aspx
    handle = _winapi.CreateNamedPipe(address, open_mode, pipe_mode, 1, BUFSIZE,
                                     BUFSIZE, timeout, 0x0)
    overlapped = _winapi.ConnectNamedPipe(handle, overlapped=True)

    if (nDefaultTimeOut.NMPWAIT_USE_DEFAULT_WAIT < timeout <
            nDefaultTimeOut.NMPWAIT_WAIT_FOREVER):
        timer = TimeoutTimer(timeout / 1000, overlapped.cancel)
    else:
        timer = TimeoutTimer(0, lambda: None)

    with timer:
        _, err = overlapped.GetOverlappedResult(True)  # Can block forever
        assert err == 0
    return PipeConnection(handle, readable=readable, writable=writable)
    def start(self):
        # Create a named pipe which allows for asynchronous IO in Windows
        pipe_name =  r'\\.\pipe\typeperf_output_' + str(uuid.uuid4())

        open_mode =  _winapi.PIPE_ACCESS_INBOUND
        open_mode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
        open_mode |= _winapi.FILE_FLAG_OVERLAPPED

        # This is the read end of the pipe, where we will be grabbing output
        self.pipe = _winapi.CreateNamedPipe(
            pipe_name, open_mode, _winapi.PIPE_WAIT,
            1, BUFSIZE, BUFSIZE, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL
        )
        # The write end of the pipe which is passed to the created process
        pipe_write_end = _winapi.CreateFile(
            pipe_name, _winapi.GENERIC_WRITE, 0, _winapi.NULL,
            _winapi.OPEN_EXISTING, 0, _winapi.NULL
        )
        # Open up the handle as a python file object so we can pass it to
        # subprocess
        command_stdout = msvcrt.open_osfhandle(pipe_write_end, 0)

        # Connect to the read end of the pipe in overlap/async mode
        overlap = _winapi.ConnectNamedPipe(self.pipe, overlapped=True)
        overlap.GetOverlappedResult(True)

        # Spawn off the load monitor
        counter_name = self._get_counter_name()
        command = ['typeperf', counter_name, '-si', str(SAMPLING_INTERVAL)]
        self.popen = subprocess.Popen(' '.join(command), stdout=command_stdout, cwd=support.SAVEDCWD)

        # Close our copy of the write end of the pipe
        os.close(command_stdout)
Ejemplo n.º 5
0
        def __init__(self, experiment_id: str):
            self.path: str = r'\\.\pipe\nni-' + experiment_id
            self.file = None

            self._handle = _winapi.CreateNamedPipe(
                self.path, _winapi.PIPE_ACCESS_DUPLEX,
                _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE
                | _winapi.PIPE_WAIT, 1, 8192, 8192, 0, _winapi.NULL)
Ejemplo n.º 6
0
 def _new_handle(self, first=False):
     flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED
     if first:
         flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
     return _winapi.CreateNamedPipe(
         self._address, flags, _winapi.PIPE_TYPE_MESSAGE
         | _winapi.PIPE_READMODE_MESSAGE | _winapi.PIPE_WAIT,
         _winapi.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE,
         _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL)
Ejemplo n.º 7
0
 def _server_pipe_handle(self, first):
     if self.closed():
         return None
     flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED
     if first:
         flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE
     h = _winapi.CreateNamedPipe(self._address, flags, _winapi.
         PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | _winapi.
         PIPE_WAIT, _winapi.PIPE_UNLIMITED_INSTANCES, windows_utils.
         BUFSIZE, windows_utils.BUFSIZE, _winapi.NMPWAIT_WAIT_FOREVER,
         _winapi.NULL)
     pipe = windows_utils.PipeHandle(h)
     self._free_instances.add(pipe)
     return pipe
Ejemplo n.º 8
0
def pipe(*, duplex=False, overlapped=(True, True), bufsize=BUFSIZE):
    """Like os.pipe() but with overlapped support and using handles not fds."""
    address = tempfile.mktemp(prefix=r'\\.\pipe\python-pipe-{:d}-{:d}-'.format(
        os.getpid(), next(_mmap_counter)))

    if duplex:
        openmode = _winapi.PIPE_ACCESS_DUPLEX
        access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
        obsize, ibsize = bufsize, bufsize
    else:
        openmode = _winapi.PIPE_ACCESS_INBOUND
        access = _winapi.GENERIC_WRITE
        obsize, ibsize = 0, bufsize

    openmode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE

    if overlapped[0]:
        openmode |= _winapi.FILE_FLAG_OVERLAPPED

    if overlapped[1]:
        flags_and_attribs = _winapi.FILE_FLAG_OVERLAPPED
    else:
        flags_and_attribs = 0

    h1 = h2 = None
    try:
        h1 = _winapi.CreateNamedPipe(address, openmode, _winapi.PIPE_WAIT, 1,
                                     obsize, ibsize,
                                     _winapi.NMPWAIT_WAIT_FOREVER,
                                     _winapi.NULL)

        h2 = _winapi.CreateFile(address, access, 0, _winapi.NULL,
                                _winapi.OPEN_EXISTING, flags_and_attribs,
                                _winapi.NULL)

        ov = _winapi.ConnectNamedPipe(h1, overlapped=True)
        ov.GetOverlappedResult(True)
        return h1, h2
    except:
        if h1 is not None:
            _winapi.CloseHandle(h1)
        if h2 is not None:
            _winapi.CloseHandle(h2)
        raise
Ejemplo n.º 9
0
    def Pipe(duplex=True):
        '''
        返回管道两端的一对连接对象
        Returns pair of connection objects at either end of a pipe
        '''
        address = arbitrary_address('AF_PIPE')
        if duplex:
            openmode = _winapi.PIPE_ACCESS_DUPLEX
            access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE
            obsize, ibsize = BUFSIZE, BUFSIZE
        else:
            openmode = _winapi.PIPE_ACCESS_INBOUND
            access = _winapi.GENERIC_WRITE
            obsize, ibsize = 0, BUFSIZE

        h1 = _winapi.CreateNamedPipe(
            address,
            openmode | _winapi.FILE_FLAG_OVERLAPPED
            | _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE,
            _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE
            | _winapi.PIPE_WAIT,
            1,
            obsize,
            ibsize,
            _winapi.NMPWAIT_WAIT_FOREVER,
            # default security descriptor: the handle cannot be inherited
            _winapi.NULL)
        h2 = _winapi.CreateFile(address, access, 0, _winapi.NULL,
                                _winapi.OPEN_EXISTING,
                                _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL)
        _winapi.SetNamedPipeHandleState(h2, _winapi.PIPE_READMODE_MESSAGE,
                                        None, None)

        overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True)
        _, err = overlapped.GetOverlappedResult(True)
        assert err == 0

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

        return c1, c2