Wrapper for an overlapped pipe handle which is vaguely file-object like. The IOCP event loop can use these instead of socket objects.
| 86 | |
| 87 | |
| 88 | class PipeHandle: |
| 89 | """Wrapper for an overlapped pipe handle which is vaguely file-object like. |
| 90 | |
| 91 | The IOCP event loop can use these instead of socket objects. |
| 92 | """ |
| 93 | def __init__(self, handle): |
| 94 | self._handle = handle |
| 95 | |
| 96 | def __repr__(self): |
| 97 | if self._handle is not None: |
| 98 | handle = f'handle={self._handle!r}' |
| 99 | else: |
| 100 | handle = 'closed' |
| 101 | return f'<{self.__class__.__name__} {handle}>' |
| 102 | |
| 103 | @property |
| 104 | def handle(self): |
| 105 | return self._handle |
| 106 | |
| 107 | def fileno(self): |
| 108 | if self._handle is None: |
| 109 | raise ValueError("I/O operation on closed pipe") |
| 110 | return self._handle |
| 111 | |
| 112 | def close(self, *, CloseHandle=_winapi.CloseHandle): |
| 113 | if self._handle is not None: |
| 114 | CloseHandle(self._handle) |
| 115 | self._handle = None |
| 116 | |
| 117 | def __del__(self, _warn=warnings.warn): |
| 118 | if self._handle is not None: |
| 119 | _warn(f"unclosed {self!r}", ResourceWarning, source=self) |
| 120 | self.close() |
| 121 | |
| 122 | def __enter__(self): |
| 123 | return self |
| 124 | |
| 125 | def __exit__(self, t, v, tb): |
| 126 | self.close() |
| 127 | |
| 128 | |
| 129 | # Replacement for subprocess.Popen using overlapped pipe handles |
no outgoing calls
no test coverage detected
searching dependent graphs…