| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- """
- Derived from
- > https://github.com/rudolfwalter/pygdbmi/blob/0.7.4.2/pygdbmi/gdbcontroller.py
- > MIT License https://github.com/rudolfwalter/pygdbmi/blob/master/LICENSE
- > Copyright (c) 2016 Chad Smith <grassfedcode <at> gmail.com>
- """
- import os
- if os.name == "nt": # pragma: no cover
- import msvcrt
- from ctypes import POINTER, WinError, byref, windll, wintypes # type: ignore
- from ctypes.wintypes import BOOL, DWORD, HANDLE # type: ignore
- else: # pragma: no cover
- import fcntl
- def make_non_blocking(file_obj): # pragma: no cover
- """
- make file object non-blocking
- Windows doesn't have the fcntl module, but someone on
- stack overflow supplied this code as an answer, and it works
- http://stackoverflow.com/a/34504971/2893090
- """
- if os.name == "nt":
- LPDWORD = POINTER(DWORD)
- PIPE_NOWAIT = wintypes.DWORD(0x00000001)
- SetNamedPipeHandleState = windll.kernel32.SetNamedPipeHandleState
- SetNamedPipeHandleState.argtypes = [HANDLE, LPDWORD, LPDWORD, LPDWORD]
- SetNamedPipeHandleState.restype = BOOL
- h = msvcrt.get_osfhandle(file_obj.fileno())
- res = windll.kernel32.SetNamedPipeHandleState(h, byref(PIPE_NOWAIT), None, None)
- if res == 0:
- raise ValueError(WinError())
- else:
- # Set the file status flag (F_SETFL) on the pipes to be non-blocking
- # so we can attempt to read from a pipe with no new data without locking
- # the program up
- fcntl.fcntl(file_obj, fcntl.F_SETFL, os.O_NONBLOCK)
|