Skip to content

Commit 94c37ae

Browse files
authored
Merge pull request #566 from KimiNewt/fix-windows-eventloop-issues
Fix Windows eventloop-related issues
2 parents 0c18493 + a0dd59e commit 94c37ae

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/pyshark/capture/capture.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import concurrent.futures
66
import sys
77
import logging
8+
import warnings
89

910
from pyshark import ek_field_mapping
1011
from pyshark.packet.packet import Packet
@@ -166,7 +167,17 @@ def _verify_capture_parameters(self):
166167
def _setup_eventloop(self):
167168
"""Sets up a new eventloop as the current one according to the OS."""
168169
if os.name == "nt":
169-
self.eventloop = asyncio.ProactorEventLoop()
170+
current_eventloop = asyncio.get_event_loop_policy().get_event_loop()
171+
if isinstance(current_eventloop, asyncio.ProactorEventLoop):
172+
self.eventloop = current_eventloop
173+
else:
174+
# On Python before 3.8, Proactor is not the default eventloop type, so we have to create a new one.
175+
# If there was an existing eventloop this can create issues, since we effectively disable it here.
176+
if asyncio.Task.all_tasks():
177+
warnings.warn("The running eventloop has tasks but pyshark must set a new eventloop to continue. "
178+
"Existing tasks may not run.")
179+
self.eventloop = asyncio.ProactorEventLoop()
180+
asyncio.set_event_loop(self.eventloop)
170181
else:
171182
try:
172183
self.eventloop = asyncio.get_event_loop_policy().get_event_loop()
@@ -289,7 +300,7 @@ async def _go_through_packets_from_fd(self, fd, packet_callback, packet_count=No
289300
break
290301

291302
def _create_stderr_handling_task(self, stderr):
292-
self._stderr_handling_tasks.append(asyncio.create_task(self._handle_process_stderr_forever(stderr)))
303+
self._stderr_handling_tasks.append(asyncio.ensure_future(self._handle_process_stderr_forever(stderr)))
293304

294305
async def _handle_process_stderr_forever(self, stderr):
295306
while True:
@@ -380,7 +391,7 @@ def _setup_tshark_output_parser(self):
380391
return tshark_xml.TsharkXmlParser(parse_summaries=self._only_summaries)
381392

382393
def close(self):
383-
self.eventloop.create_task(self.close_async())
394+
self.eventloop.run_until_complete(self.close_async())
384395

385396
async def close_async(self):
386397
for process in self._running_processes.copy():

0 commit comments

Comments
 (0)