@@ -10,6 +10,7 @@ class ConnectionManager {
10
10
public static let shared = ConnectionManager ( )
11
11
12
12
private let timerQueue = DispatchQueue ( label: Bundle . main. bundleIdentifier! + " .connection.timer " , qos: . utility)
13
+ private let timerQueueKey = DispatchSpecificKey < Bool > ( )
13
14
14
15
private var dataProxy : DataProxy ?
15
16
private var keepaliveTimer : DispatchSourceTimer ?
@@ -29,6 +30,10 @@ class ConnectionManager {
29
30
!PreferencesManager. shared. password. isEmpty
30
31
}
31
32
33
+ init ( ) {
34
+ timerQueue. setSpecific ( key: timerQueueKey, value: true )
35
+ }
36
+
32
37
/**
33
38
Sets the data proxy to use for future connections.
34
39
Only call this function when the server isn't running.
@@ -1044,20 +1049,18 @@ class ConnectionManager {
1044
1049
1045
1050
//Set the timer callback
1046
1051
downloadRequest. timeoutCallback = { [ weak self, weak client] in
1047
- DispatchQueue . global ( qos: . default) . async { [ weak self, weak client] in
1048
- //Clean up leftover files
1049
- try ? downloadRequest. cleanUp ( )
1050
-
1051
- //Clean up task reference
1052
- guard let self = self else { return }
1053
- self . fileDownloadRequestMapLock. withWriteLock {
1054
- self . fileDownloadRequestMap [ requestID] = nil
1055
- }
1056
-
1057
- //Send a message to the client
1058
- guard let client = client, client. isConnected. value else { return }
1059
- self . send ( basicResponseOfCode: . sendResult, requestID: requestID, resultCode: NSTSendResult . requestTimeout. rawValue, details: nil , to: client)
1052
+ //Clean up leftover files
1053
+ try ? downloadRequest. cleanUp ( )
1054
+
1055
+ //Clean up task reference
1056
+ guard let self = self else { return }
1057
+ self . fileDownloadRequestMapLock. withWriteLock {
1058
+ self . fileDownloadRequestMap [ requestID] = nil
1060
1059
}
1060
+
1061
+ //Send a message to the client
1062
+ guard let client = client, client. isConnected. value else { return }
1063
+ self . send ( basicResponseOfCode: . sendResult, requestID: requestID, resultCode: NSTSendResult . requestTimeout. rawValue, details: nil , to: client)
1061
1064
}
1062
1065
} catch DownloadRequestCreateError . alreadyExists {
1063
1066
send ( basicResponseOfCode: . sendResult, requestID: requestID, resultCode: NSTSendResult . badRequest. rawValue, details: " Request ID \( requestID) already exists " , to: client)
@@ -1563,7 +1566,7 @@ extension ConnectionManager: DataProxyDelegate {
1563
1566
NotificationNames . postUpdateConnectionCount ( 0 )
1564
1567
1565
1568
//Stop the keepalive timer
1566
- timerQueue. sync {
1569
+ runOnQueue ( queue : timerQueue, key : timerQueueKey ) {
1567
1570
keepaliveTimer? . cancel ( )
1568
1571
keepaliveTimer = nil
1569
1572
}
@@ -1618,7 +1621,7 @@ extension ConnectionManager: DataProxyDelegate {
1618
1621
dataProxy. send ( message: packer. data, to: client, encrypt: false , onSent: nil )
1619
1622
1620
1623
//Start the expiry timer
1621
- timerQueue. sync {
1624
+ runOnQueue ( queue : timerQueue, key : timerQueueKey ) {
1622
1625
client. startTimer ( ofType: . handshakeExpiry, interval: CommConst . handshakeTimeout, queue: timerQueue) { [ weak self] client in
1623
1626
LogManager . log ( " Handshake response for client \( client. readableID) timed out, disconnecting " , level: . debug)
1624
1627
self ? . dataProxy? . disconnect ( client: client)
@@ -1641,7 +1644,7 @@ extension ConnectionManager: DataProxyDelegate {
1641
1644
NotificationNames . postUpdateConnectionCount ( totalCount)
1642
1645
1643
1646
//Clean up pending timers
1644
- timerQueue. sync {
1647
+ runOnQueue ( queue : timerQueue, key : timerQueueKey ) {
1645
1648
client. cancelAllTimers ( )
1646
1649
}
1647
1650
}
0 commit comments