|
@@ -65,37 +65,6 @@ Seems we're already running? (pid: {1})"""
|
|
|
_range = namedtuple('_range', ('start', 'stop'))
|
|
|
|
|
|
|
|
|
-def ranges(sequence, end):
|
|
|
- """From a sequence of numbers return a list of ranges
|
|
|
- avoiding those numbers.
|
|
|
-
|
|
|
- Note: List must be sorted and uniq.
|
|
|
-
|
|
|
- Useful for :func:`os.closerange` to provide a list
|
|
|
- of file descriptors to keep:
|
|
|
-
|
|
|
- >>> list(ranges([], end=2048))
|
|
|
- _range(start=0, stop=2048)]
|
|
|
-
|
|
|
- >>> list(ranges([1, 2, 3, 30, 1400], end=2048))
|
|
|
- [_range(start=0, stop=1), _range(start=4, stop=30),
|
|
|
- _range(start=31, stop=256)]
|
|
|
-
|
|
|
- >>> list(ranges([1, 2, 3, 30, 1400], end=256))
|
|
|
- [_range(start=0, stop=1), _range(start=4, stop=30),
|
|
|
- _range(start=31, stop=1400), _range(start=1401, stop=2048)]
|
|
|
-
|
|
|
- """
|
|
|
- k, l = iter([-1] + sequence), iter(sequence)
|
|
|
- for prev, stop in zip_longest(k, l):
|
|
|
- prev = min(prev + 1, end)
|
|
|
- if prev != stop:
|
|
|
- if stop and stop > end:
|
|
|
- yield _range(prev, end)
|
|
|
- break
|
|
|
- yield _range(prev, end if stop is None else stop)
|
|
|
-
|
|
|
-
|
|
|
def pyimplementation():
|
|
|
"""Return string identifying the current Python implementation."""
|
|
|
if hasattr(_platform, 'python_implementation'):
|
|
@@ -276,10 +245,13 @@ if hasattr(os, 'closerange'):
|
|
|
|
|
|
def close_open_fds(keep=None):
|
|
|
keep = [maybe_fileno(f)
|
|
|
- for f in uniq(sorted((keep or [])))
|
|
|
+ for f in uniq(sorted(keep or []))
|
|
|
if maybe_fileno(f) is not None]
|
|
|
- for low, high in ranges(keep, get_fdmax(default=2048)):
|
|
|
- os.closerange(low, high)
|
|
|
+ maxfd = get_fdmax(default=2048)
|
|
|
+ kL, kH = iter([-1] + keep), iter(keep + [maxfd])
|
|
|
+ for low, high in zip_longest(kL, kH):
|
|
|
+ if low + 1 != high:
|
|
|
+ os.closerange(low + 1, high)
|
|
|
|
|
|
else:
|
|
|
|