Skip to content

Commit cec3744

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

File tree

2 files changed

+62
-29
lines changed

2 files changed

+62
-29
lines changed

Furious/Widget/Application.py

Lines changed: 6 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,11 @@ def cleanup():
283284
SystemProxy.off()
284285
SystemProxy.daemonOff()
285286

287+
if PLATFORM == 'Darwin':
288+
AppThreadPool().clear()
289+
290+
APP().processEvents()
291+
286292
logger.info('final cleanup done')
287293

288294
@staticmethod

Furious/Widget/UserServersQTableWidget.py

Lines changed: 56 additions & 29 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)
1575+
1576+
if reference.deleted:
1577+
continue
15721578

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
15971605

1606+
assert isinstance(reference, ConfigurationFactory)
1607+
1608+
if reference.deleted:
1609+
continue
1610+
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()
16661679

1680+
return
1681+
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
@@ -1675,20 +1694,31 @@ def handleTestDownloadSpeedJobXXX(
16751694
jobTimer.stop()
16761695

16771696
return
1678-
else:
1679-
if isMulti:
1680-
if self.testDownloadSpeedMultiPort >= 40000:
1681-
self.testDownloadSpeedMultiPort = 30000
16821697

1683-
testDownloadSpeedPort = self.testDownloadSpeedMultiPort
1684-
1685-
self.testDownloadSpeedMultiPort += 1
1698+
def fetchNextJob():
1699+
if not APP().isExiting():
1700+
# Fetch next job.
1701+
if self.isVisible():
1702+
interval = max(1.0, 1000 / len(AS_UserServers()))
1703+
interval = min(interval, 50)
16861704

1687-
if not APP().isExiting():
1688-
# Fetch next job.
1689-
jobTimer.start(1)
1705+
jobTimer.start(int(interval))
1706+
else:
1707+
jobTimer.start(50)
16901708
else:
1691-
testDownloadSpeedPort = 20809
1709+
jobTimer.stop()
1710+
1711+
if isMulti:
1712+
if self.testDownloadSpeedMultiPort >= 40000:
1713+
self.testDownloadSpeedMultiPort = 30000
1714+
1715+
testDownloadSpeedPort = self.testDownloadSpeedMultiPort
1716+
1717+
self.testDownloadSpeedMultiPort += 1
1718+
1719+
fetchNextJob()
1720+
else:
1721+
testDownloadSpeedPort = 20809
16921722

16931723
assert isinstance(factory, ConfigurationFactory)
16941724

@@ -1697,21 +1727,18 @@ def handleTestDownloadSpeedJobXXX(
16971727
if isMulti:
16981728
self.testDownloadSpeedMultiSema.release(1)
16991729

1700-
if not APP().isExiting():
1701-
# Fetch next job.
1702-
jobTimer.start(1)
1730+
fetchNextJob()
17031731
else:
1704-
self.testDownloadSpeedByFactory(
1705-
index,
1706-
factory,
1707-
testDownloadSpeedPort,
1708-
timeout,
1709-
isMulti,
1710-
)
1711-
17121732
if not APP().isExiting():
1713-
# Fetch next job.
1714-
jobTimer.start(1)
1733+
self.testDownloadSpeedByFactory(
1734+
index,
1735+
factory,
1736+
testDownloadSpeedPort,
1737+
timeout,
1738+
isMulti,
1739+
)
1740+
1741+
fetchNextJob()
17151742

17161743
@QtCore.Slot()
17171744
def handleTestDownloadSpeedJob(self):

0 commit comments

Comments
 (0)