-
-
Notifications
You must be signed in to change notification settings - Fork 32.4k
gh-94182: run the PidfdChildWatcher on the running loop #94184
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
e49365f
49cfa81
3a3d5e2
60dafa1
16f1c4e
c8ae89d
8229efc
6473022
02190f2
9607d8e
dad94d9
6e56155
1037078
4e69faf
740e0c2
7721ea1
f4f6fc5
cad5231
5647edb
102ba29
8000
de21df0
d30824f
978c822
fbeb1a7
6fe4985
592fcb9
d27f174
871507f
5dfc542
a4fac11
fc2e400
65a2db6
d25f852
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -702,75 +702,73 @@ class SubprocessPidfdWatcherTests(SubprocessWatcherMixin, | |
test_utils.TestCase): | ||
Watcher = unix_events.PidfdChildWatcher | ||
|
||
else: | ||
# Windows | ||
class SubprocessProactorTests(SubprocessMixin, test_utils.TestCase): | ||
|
||
def setUp(self): | ||
super().setUp() | ||
self.loop = asyncio.ProactorEventLoop() | ||
self.set_event_loop(self.loop) | ||
|
||
|
||
class GenericWatcherTests(test_utils.TestCase): | ||
|
||
def test_create_subprocess_fails_with_inactive_watcher(self): | ||
watcher = mock.create_autospec( | ||
asyncio.AbstractChildWatcher, | ||
**{"__enter__.return_value.is_active.return_value": False} | ||
) | ||
class GenericWatcherTests(test_utils.TestCase): | ||
|
||
async def execute(): | ||
asyncio.set_child_watcher(watcher) | ||
def test_create_subprocess_fails_with_inactive_watcher(self): | ||
watcher = mock.create_autospec( | ||
asyncio.AbstractChildWatcher, | ||
**{"__enter__.return_value.is_active.return_value": False} | ||
) | ||
|
||
with self.assertRaises(RuntimeError): | ||
await subprocess.create_subprocess_exec( | ||
os_helper.FakePath(sys.executable), '-c', 'pass') | ||
async def execute(): | ||
asyncio.set_child_watcher(watcher) | ||
|
||
watcher.add_child_handler.assert_not_called() | ||
with self.assertRaises(RuntimeError): | ||
await subprocess.create_subprocess_exec( | ||
os_helper.FakePath(sys.executable), '-c', 'pass') | ||
|
||
self.assertIsNone(asyncio.run(execute())) | ||
self.assertListEqual(watcher.mock_calls, [ | ||
mock.call.__enter__(), | ||
mock.call.__enter__().is_active(), | ||
mock.call.__exit__(RuntimeError, mock.ANY, mock.ANY), | ||
]) | ||
watcher.add_child_handler.assert_not_called() | ||
|
||
self.assertIsNone(asyncio.run(execute())) | ||
self.assertListEqual(watcher.mock_calls, [ | ||
mock.call.__enter__(), | ||
mock.call.__enter__().is_active(), | ||
mock.call.__exit__(RuntimeError, mock.ANY, mock.ANY), | ||
]) | ||
|
||
def has_pidfd_support(): | ||
if not hasattr(os, 'pidfd_open'): | ||
return False | ||
try: | ||
os.close(os.pidfd_open(os.getpid())) | ||
except OSError: | ||
return False | ||
return True | ||
|
||
@unittest.skipUnless( | ||
has_pidfd_support(), | ||
"operating system does not support pidfds", | ||
) | ||
def test_create_subprocess_with_pidfd(self): | ||
async def in_thread(): | ||
proc = await asyncio.create_subprocess_exec( | ||
*PROGRAM_CAT, | ||
stdin=subprocess.PIPE, | ||
stdout=subprocess.PIPE, | ||
) | ||
stdout, stderr = await proc.communicate(b"some data") | ||
return proc.returncode, stdout | ||
def has_pidfd_support(): | ||
if not hasattr(os, 'pidfd_open'): | ||
return False | ||
try: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe separate different logical blocks with blank lines. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm copying the existing code here There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When I move it to a module level flag I'll apply this fix |
||
os.close(os.pidfd_open(os.getpid())) | ||
except OSError: | ||
return False | ||
return True | ||
|
||
@unittest.skipUnless( | ||
has_pidfd_support(), | ||
"operating system does not support pidfds", | ||
) | ||
def test_create_subprocess_with_pidfd(self): | ||
async def in_thread(): | ||
proc = await asyncio.create_subprocess_exec( | ||
*PROGRAM_CAT, | ||
stdin=subprocess.PIPE, | ||
stdout=subprocess.PIPE, | ||
) | ||
stdout, stderr = await proc.communicate(b"some data") | ||
return proc.returncode, stdout | ||
|
||
async def main(): | ||
return await asyncio.to_thread(asyncio.run, in_thread()) | ||
async def main(): | ||
return await asyncio.to_thread(asyncio.run, in_thread()) | ||
|
||
asyncio.set_child_watcher(asyncio.PidfdChildWatcher()) | ||
try: | ||
returncode, stdout = asyncio.run(main()) | ||
self.assertEqual(returncode, 0) | ||
self.assertEqual(stdout, b'some data') | ||
finally: | ||
asyncio.set_child_watcher(None) | ||
asyncio.set_child_watcher(asyncio.PidfdChildWatcher()) | ||
try: | ||
returncode, stdout = asyncio.run(main()) | ||
self.assertEqual(returncode, 0) | ||
self.assertEqual(stdout, b'some data') | ||
finally: | ||
asyncio.set_child_watcher(None) | ||
else: | ||
# Windows | ||
class SubprocessProactorTests(SubprocessMixin, test_utils.TestCase): | ||
|
||
def setUp(self): | ||
super().setUp() | ||
self.loop = asyncio.ProactorEventLoop() | ||
self.set_event_loop(self.loop) | ||
|
||
if __name__ == '__main__': | ||
graingert marked this conversation as resolved.
Show resolved
Hide resolved
|
||
unittest.main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While this technically works, I would much rather see this made into a module level function.