Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 42 additions & 16 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2649,12 +2649,6 @@ def disable_faulthandler():
faulthandler.enable(file=fd, all_threads=True)


try:
MAXFD = os.sysconf("SC_OPEN_MAX")
except Exception:
MAXFD = 256


def fd_count():
"""Count the number of open file descriptors.
"""
Expand All @@ -2665,16 +2659,48 @@ def fd_count():
except FileNotFoundError:
pass

count = 0
for fd in range(MAXFD):
old_modes = None
if sys.platform == 'win32':
# bpo-25306, bpo-31009: Call CrtSetReportMode() to not kill the process
# on invalid file descriptor if Python is compiled in debug mode
try:
# Prefer dup() over fstat(). fstat() can require input/output
# whereas dup() doesn't.
fd2 = os.dup(fd)
except OSError as e:
if e.errno != errno.EBADF:
raise
import msvcrt
msvcrt.CrtSetReportMode
except (AttributeError, ImportError):
# no msvcrt or a release build
pass
else:
os.close(fd2)
count += 1
old_modes = {}
for report_type in (msvcrt.CRT_WARN,
msvcrt.CRT_ERROR,
msvcrt.CRT_ASSERT):
old_modes[report_type] = msvcrt.CrtSetReportMode(report_type, 0)

MAXFD = 256
if hasattr(os, 'sysconf'):
try:
MAXFD = os.sysconf("SC_OPEN_MAX")
except OSError:
pass

try:
count = 0
for fd in range(MAXFD):
try:
# Prefer dup() over fstat(). fstat() can require input/output
# whereas dup() doesn't.
fd2 = os.dup(fd)
except OSError as e:
if e.errno != errno.EBADF:
raise
else:
os.close(fd2)
count += 1
finally:
if old_modes is not None:
for report_type in (msvcrt.CRT_WARN,
msvcrt.CRT_ERROR,
msvcrt.CRT_ASSERT):
msvcrt.CrtSetReportMode(report_type, old_modes[report_type])

return count
14 changes: 1 addition & 13 deletions Lib/test/test_regrtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -835,22 +835,10 @@ def test_huntrleaks_fd_leak(self):
import os
import unittest

# Issue #25306: Disable popups and logs to stderr on assertion
# failures in MSCRT
try:
import msvcrt
msvcrt.CrtSetReportMode
except (ImportError, AttributeError):
# no Windows, o release build
pass
else:
for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
msvcrt.CrtSetReportMode(m, 0)

class FDLeakTest(unittest.TestCase):
def test_leak(self):
fd = os.open(__file__, os.O_RDONLY)
# bug: never cloes the file descriptor
# bug: never close the file descriptor
""")
self.check_leak(code, 'file descriptors')

Expand Down