Skip to content

Commit f52c3ac

Browse files
committed
Fixed race condition when exiting Application on macOS
Signed-off-by: Loren Eteval <loren.eteval@proton.me>
1 parent 98d4eef commit f52c3ac

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

Furious/Widget/Application.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ def __init__(self, argv):
188188

189189
# ThreadPool
190190
self.threadPool = QtCore.QThreadPool()
191+
self.threadPool.setMaxThreadCount(max(OS_CPU_COUNT // 2, 1))
191192

192193
@rateLimited(maxCallPerSecond=2)
193194
@QtCore.Slot()
@@ -283,6 +284,10 @@ def cleanup():
283284
SystemProxy.off()
284285
SystemProxy.daemonOff()
285286

287+
AppThreadPool().clear()
288+
289+
APP().processEvents()
290+
286291
logger.info('final cleanup done')
287292

288293
@staticmethod

Furious/Widget/UserServersQTableWidget.py

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,8 +1568,15 @@ def testSelectedItemPingLatency(self):
15681568
references = list(AS_UserServers()[index] for index in indexes)
15691569

15701570
for index, reference in zip(indexes, references):
1571-
worker = TestPingLatencyWorker(reference)
1571+
if APP().isExiting():
1572+
break
1573+
1574+
assert isinstance(reference, ConfigurationFactory)
15721575

1576+
if reference.deleted:
1577+
continue
1578+
1579+
worker = TestPingLatencyWorker(reference)
15731580
worker.setAutoDelete(True)
15741581
worker.finished.connect(
15751582
functools.partial(
@@ -1593,8 +1600,15 @@ def testSelectedItemTcpingLatency(self):
15931600
references = list(AS_UserServers()[index] for index in indexes)
15941601

15951602
for index, reference in zip(indexes, references):
1596-
worker = TestTcpingLatencyWorker(reference)
1603+
if APP().isExiting():
1604+
break
1605+
1606+
assert isinstance(reference, ConfigurationFactory)
1607+
1608+
if reference.deleted:
1609+
continue
15971610

1611+
worker = TestTcpingLatencyWorker(reference)
15981612
worker.setAutoDelete(True)
15991613
worker.finished.connect(
16001614
functools.partial(
@@ -1660,10 +1674,15 @@ def handleTestDownloadSpeedJobXXX(
16601674
jobTimer: QtCore.QTimer,
16611675
isMulti: bool,
16621676
):
1663-
try:
1664-
if isMulti and not self.testDownloadSpeedMultiSema.tryAcquire(1):
1665-
return
1677+
if APP().isExiting():
1678+
jobTimer.stop()
1679+
1680+
return
16661681

1682+
if isMulti and not self.testDownloadSpeedMultiSema.tryAcquire(1):
1683+
return
1684+
1685+
try:
16671686
index, factory, timeout = jobQueue.get_nowait()
16681687
except queue.Empty:
16691688
# Queue is empty
@@ -1686,7 +1705,9 @@ def handleTestDownloadSpeedJobXXX(
16861705

16871706
if not APP().isExiting():
16881707
# Fetch next job.
1689-
jobTimer.start(1)
1708+
jobTimer.start(5)
1709+
else:
1710+
jobTimer.stop()
16901711
else:
16911712
testDownloadSpeedPort = 20809
16921713

@@ -1699,19 +1720,23 @@ def handleTestDownloadSpeedJobXXX(
16991720

17001721
if not APP().isExiting():
17011722
# Fetch next job.
1702-
jobTimer.start(1)
1723+
jobTimer.start(5)
1724+
else:
1725+
jobTimer.stop()
17031726
else:
1704-
self.testDownloadSpeedByFactory(
1705-
index,
1706-
factory,
1707-
testDownloadSpeedPort,
1708-
timeout,
1709-
isMulti,
1710-
)
1711-
17121727
if not APP().isExiting():
1728+
self.testDownloadSpeedByFactory(
1729+
index,
1730+
factory,
1731+
testDownloadSpeedPort,
1732+
timeout,
1733+
isMulti,
1734+
)
1735+
17131736
# Fetch next job.
1714-
jobTimer.start(1)
1737+
jobTimer.start(5)
1738+
else:
1739+
jobTimer.stop()
17151740

17161741
@QtCore.Slot()
17171742
def handleTestDownloadSpeedJob(self):

0 commit comments

Comments
 (0)