Skip to content

Commit 9bd1b5b

Browse files
authored
Break timer retain cycle (#85)
Motivation: The timers used by the client/server connection management hanlders indirectly hold references to the underlying handler. The hanlder holds a reference to the timer. This cycle isn't broken so a handler is leaked for each connection. Modifications: - Nil out the timers to break the retain cycle when the channel becomes inactive Result: - Fewer leaks - Resolves #84
1 parent 165d639 commit 9bd1b5b

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

Sources/GRPCNIOTransportCore/Client/Connection/ClientConnectionHandler.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,14 @@ package final class ClientConnectionHandler: ChannelInboundHandler, ChannelOutbo
160160
}
161161

162162
self.keepaliveTimerHandler?.cancel()
163+
self.keepaliveTimerHandler = nil
164+
163165
self.keepaliveTimeoutHandler?.cancel()
166+
self.keepaliveTimeoutHandler = nil
167+
168+
self.maxIdleTimerHandler?.cancel()
169+
self.maxIdleTimerHandler = nil
170+
164171
context.fireChannelInactive()
165172
}
166173

Sources/GRPCNIOTransportCore/Server/Connection/ServerConnectionManagementHandler.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,20 @@ package final class ServerConnectionManagementHandler: ChannelDuplexHandler {
295295

296296
package func channelInactive(context: ChannelHandlerContext) {
297297
self.maxIdleTimerHandler?.cancel()
298+
self.maxAgeTimerHandler = nil
299+
298300
self.maxAgeTimerHandler?.cancel()
301+
self.maxAgeTimerHandler = nil
302+
299303
self.maxGraceTimerHandler?.cancel()
304+
self.maxGraceTimerHandler = nil
305+
300306
self.keepaliveTimerHandler?.cancel()
307+
self.keepaliveTimerHandler = nil
308+
301309
self.keepaliveTimeoutHandler?.cancel()
310+
self.keepaliveTimeoutHandler = nil
311+
302312
context.fireChannelInactive()
303313
}
304314

0 commit comments

Comments
 (0)