Skip to content

Commit 9028236

Browse files
committed
Fix socket deinit issues by making sure TCPPeerHandler gets interrupted upon deinit.
1 parent f579b1d commit 9028236

File tree

10 files changed

+649
-123
lines changed

10 files changed

+649
-123
lines changed

bindings/batteries/ChannelManagerConstructor.swift

Lines changed: 126 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
3737
fileprivate let keysInterface: KeysInterface!
3838
public private(set) var payer: InvoicePayer?
3939
public let peerManager: PeerManager
40-
40+
private var tcpPeerHandler: TCPPeerHandler?
4141

4242
/**
4343
* A list of ChannelMonitors and the last block they each saw. You should sync the blockchain on each individually
@@ -230,9 +230,14 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
230230

231231
}
232232

233-
public func interrupt(tcpPeerHandler: TCPPeerHandler? = nil) {
233+
public func interrupt() {
234+
if self.shutdown {
235+
Bindings.print("ChannelManagerConstructor previously interrupted, nothing to do.")
236+
return
237+
}
238+
234239
self.shutdown = true
235-
if let tcpHandler = tcpPeerHandler {
240+
if let tcpHandler = self.tcpPeerHandler {
236241
print("stopping TCP peer handler")
237242
tcpHandler.interrupt()
238243
print("stopped TCP peer handler")
@@ -252,8 +257,18 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
252257
print("unset background processor")
253258
}
254259

260+
public func getTCPPeerHandler() -> TCPPeerHandler {
261+
if let handler = self.tcpPeerHandler {
262+
return handler
263+
}
264+
let handler = TCPPeerHandler(peerManager: self.peerManager)
265+
self.tcpPeerHandler = handler
266+
return handler
267+
}
268+
255269
deinit {
256-
print("deiniting ChannelManagerConstructor")
270+
Bindings.print("Freeing and interrupting ChannelManagerConstructor")
271+
self.interrupt()
257272
}
258273

259274

@@ -295,3 +310,110 @@ fileprivate class CustomEventHandler: EventHandler {
295310
public protocol ExtendedChannelManagerPersister: Persister {
296311
func handle_event(event: Event) -> Void;
297312
}
313+
314+
public class TCPPeerHandler {
315+
316+
private let peerManager: PeerManager
317+
private let socketHandler: UnsafeMutableRawPointer?
318+
private var isBound = false
319+
private var isInterrupted = false
320+
321+
fileprivate init(peerManager: PeerManager) {
322+
self.peerManager = peerManager
323+
324+
/*
325+
let socketHandler = withUnsafePointer(to: self.peerManager.cOpaqueStruct!) { (pointer: UnsafePointer<LDKPeerManager>) -> UnsafeMutableRawPointer? in
326+
let socketHandler = init_socket_handling(pointer)
327+
return socketHandler
328+
}
329+
self.socketHandler = socketHandler
330+
*/
331+
332+
333+
// self.socketHandler = UnsafeMutableRawPointer(bitPattern: 0)
334+
335+
336+
337+
let peerManagerPointer: UnsafeRawPointer = UnsafeRawPointer(&self.peerManager.cOpaqueStruct)
338+
Bindings.print("TCPPeerHandler peer manager pointer address: \(peerManagerPointer)")
339+
let memoryReboundPeerManagerPointer: UnsafePointer<LDKPeerManager> = peerManagerPointer.assumingMemoryBound(to: LDKPeerManager.self)
340+
Bindings.print("TCPPeerHandler peer manager rebound memory address: \(memoryReboundPeerManagerPointer)")
341+
self.socketHandler = init_socket_handling(memoryReboundPeerManagerPointer)
342+
print("TCPPeerHandler self address: \(Unmanaged<TCPPeerHandler>.passUnretained(self).toOpaque())")
343+
}
344+
345+
public func bind(address: String, port: UInt16) -> Bool {
346+
if(self.isBound){
347+
// already bound
348+
return false
349+
}
350+
self.isBound = true
351+
var addressObject = sockaddr_in()
352+
addressObject.sin_family = sa_family_t(AF_INET)
353+
addressObject.sin_port = port.bigEndian
354+
355+
addressObject.sin_addr.s_addr = inet_addr(address)
356+
357+
let sin_length = UInt8(MemoryLayout.size(ofValue: addressObject))
358+
359+
let result = withUnsafePointer(to: &addressObject, { addressPointer in
360+
361+
addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
362+
let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
363+
let result = socket_bind(self.socketHandler, addressMutablePointer, socklen_t(sin_length))
364+
return result
365+
}
366+
})
367+
if result != 0 {
368+
// something failed
369+
self.isBound = false
370+
return false
371+
}
372+
return true
373+
374+
}
375+
376+
public func connect(address: String, port: UInt16, theirNodeId: [UInt8]) -> Bool {
377+
378+
var addressObject = sockaddr_in()
379+
addressObject.sin_family = sa_family_t(AF_INET)
380+
addressObject.sin_port = port.bigEndian
381+
382+
addressObject.sin_addr.s_addr = inet_addr(address)
383+
384+
let sin_length = UInt8(MemoryLayout.size(ofValue: addressObject))
385+
let publicKey = Bindings.new_LDKPublicKey(array: theirNodeId)
386+
387+
let result = withUnsafePointer(to: &addressObject, { addressPointer in
388+
389+
addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
390+
let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
391+
let result = socket_connect(self.socketHandler, publicKey, addressMutablePointer, Int(socklen_t(sin_length)))
392+
return result
393+
}
394+
})
395+
396+
if result != 0 {
397+
// something failed
398+
return false
399+
}
400+
return true
401+
402+
}
403+
404+
fileprivate func interrupt() {
405+
if self.isInterrupted {
406+
Bindings.print("TCPPeerHandler previously interrupted, nothing to do.")
407+
return
408+
}
409+
self.isInterrupted = true
410+
interrupt_socket_handling(self.socketHandler)
411+
Bindings.print("TCPPeerHandler successfully interrupted.")
412+
}
413+
414+
deinit {
415+
Bindings.print("Freeing and interrupting TCPPeerHandler.")
416+
self.interrupt()
417+
}
418+
419+
}

bindings/batteries/TCPPeerHandler.swift

Lines changed: 0 additions & 105 deletions
This file was deleted.

xcode/DirectBindingsApp/DirectBindingsApp.xcodeproj/project.pbxproj

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -705,8 +705,6 @@
705705
07BBCB1926D034B7000D96C4 /* libldk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 07BBCB1826D034B1000D96C4 /* libldk.a */; };
706706
07BBCB1B26D03578000D96C4 /* ldk_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCAFD26D029AB000D96C4 /* ldk_net.c */; };
707707
07BBCB1F26D03579000D96C4 /* ldk_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCAFD26D029AB000D96C4 /* ldk_net.c */; };
708-
07BBCB3726D036AC000D96C4 /* TCPPeerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCB3426D036AC000D96C4 /* TCPPeerHandler.swift */; };
709-
07BBCB3826D036AC000D96C4 /* TCPPeerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCB3426D036AC000D96C4 /* TCPPeerHandler.swift */; };
710708
07BBCB3926D036AC000D96C4 /* ChannelManagerConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCB3526D036AC000D96C4 /* ChannelManagerConstructor.swift */; };
711709
07BBCB3A26D036AC000D96C4 /* ChannelManagerConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCB3526D036AC000D96C4 /* ChannelManagerConstructor.swift */; };
712710
07BBCB3B26D036AC000D96C4 /* UtilMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BBCB3626D036AC000D96C4 /* UtilMethods.swift */; };
@@ -730,6 +728,7 @@
730728
07C753E126D6BE4E00081BF8 /* HumanObjectPeerTestInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07C753DF26D6BE4E00081BF8 /* HumanObjectPeerTestInstance.swift */; };
731729
07C753F326D9560200081BF8 /* PromiseKit in Frameworks */ = {isa = PBXBuildFile; productRef = 07C753F226D9560200081BF8 /* PromiseKit */; };
732730
28F5174A280E7903009A7D10 /* CombineUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28F51749280E7903009A7D10 /* CombineUtils.swift */; };
731+
2DD1139D4337E24B8A37948F /* PolarIntegrationSample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD1159E9DE3166EE7B79886 /* PolarIntegrationSample.swift */; };
733732
2DD11C86114C6827D6E338A2 /* BlockchainObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 076D2A6D28039ACB00970AFC /* BlockchainObserver.swift */; };
734733
2DD11F1338488839D8955B7A /* PolarIntegrationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD1172C8DF0B244CF69B0FA /* PolarIntegrationTest.swift */; };
735734
2DD11F99CF6E547FA7FB9225 /* RegtestBlockchainManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 076D2A6B280399F500970AFC /* RegtestBlockchainManager.swift */; };
@@ -1125,7 +1124,6 @@
11251124
07BBCB2726D0369F000D96C4 /* SwiftSocketPeerHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSocketPeerHandler.swift; sourceTree = "<group>"; };
11261125
07BBCB2826D0369F000D96C4 /* RegtestBlockchainObserverOld.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegtestBlockchainObserverOld.swift; sourceTree = "<group>"; };
11271126
07BBCB2926D0369F000D96C4 /* SwiftSocketEchoHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSocketEchoHandler.swift; sourceTree = "<group>"; };
1128-
07BBCB3426D036AC000D96C4 /* TCPPeerHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TCPPeerHandler.swift; sourceTree = "<group>"; };
11291127
07BBCB3526D036AC000D96C4 /* ChannelManagerConstructor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChannelManagerConstructor.swift; sourceTree = "<group>"; };
11301128
07BBCB3626D036AC000D96C4 /* UtilMethods.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilMethods.swift; sourceTree = "<group>"; };
11311129
07BBCE6026D03B49000D96C4 /* TestPersister.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestPersister.swift; sourceTree = "<group>"; };
@@ -1139,6 +1137,7 @@
11391137
07C753DF26D6BE4E00081BF8 /* HumanObjectPeerTestInstance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HumanObjectPeerTestInstance.swift; sourceTree = "<group>"; };
11401138
07C753E826D954B100081BF8 /* PolarConnectionExperiment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarConnectionExperiment.swift; sourceTree = "<group>"; };
11411139
28F51749280E7903009A7D10 /* CombineUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombineUtils.swift; sourceTree = "<group>"; };
1140+
2DD1159E9DE3166EE7B79886 /* PolarIntegrationSample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarIntegrationSample.swift; sourceTree = "<group>"; };
11421141
2DD1172C8DF0B244CF69B0FA /* PolarIntegrationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarIntegrationTest.swift; sourceTree = "<group>"; };
11431142
/* End PBXFileReference section */
11441143

@@ -1669,14 +1668,14 @@
16691668
076D2A6D28039ACB00970AFC /* BlockchainObserver.swift */,
16701669
076D2A6B280399F500970AFC /* RegtestBlockchainManager.swift */,
16711670
28F51749280E7903009A7D10 /* CombineUtils.swift */,
1671+
2DD1159E9DE3166EE7B79886 /* PolarIntegrationSample.swift */,
16721672
);
16731673
path = "app-batteries";
16741674
sourceTree = "<group>";
16751675
};
16761676
07BBCB3326D036AC000D96C4 /* batteries */ = {
16771677
isa = PBXGroup;
16781678
children = (
1679-
07BBCB3426D036AC000D96C4 /* TCPPeerHandler.swift */,
16801679
07BBCB3526D036AC000D96C4 /* ChannelManagerConstructor.swift */,
16811680
07BBCB3626D036AC000D96C4 /* UtilMethods.swift */,
16821681
075E22A126FEF8540000A76B /* NetGraphMsgHandlerConstructor.swift */,
@@ -2004,7 +2003,6 @@
20042003
076D24E127FC219200970AFC /* Record.swift in Sources */,
20052004
076D241927FC219100970AFC /* Result_InMemorySignerDecodeErrorZ.swift in Sources */,
20062005
076D22D927FC219000970AFC /* Listen.swift in Sources */,
2007-
07BBCB3726D036AC000D96C4 /* TCPPeerHandler.swift in Sources */,
20082006
076D238B27FC219100970AFC /* Result_NetworkGraphDecodeErrorZ.swift in Sources */,
20092007
076D22BD27FC219000970AFC /* Persist.swift in Sources */,
20102008
076D24DB27FC219200970AFC /* RouteHop.swift in Sources */,
@@ -2200,6 +2198,7 @@
22002198
076D230B27FC219000970AFC /* C2Tuple_PaymentHashPaymentIdZ.swift in Sources */,
22012199
076D24C727FC219200970AFC /* ChannelDetails.swift in Sources */,
22022200
076D237127FC219100970AFC /* Result_NoneAPIErrorZ.swift in Sources */,
2201+
2DD1139D4337E24B8A37948F /* PolarIntegrationSample.swift in Sources */,
22032202
);
22042203
runOnlyForDeploymentPostprocessing = 0;
22052204
};
@@ -2282,7 +2281,6 @@
22822281
076D243C27FC219200970AFC /* HTLCOutputInCommitment.swift in Sources */,
22832282
076D247827FC219200970AFC /* UpdateFailHTLC.swift in Sources */,
22842283
076D245827FC219200970AFC /* UnsignedChannelUpdate.swift in Sources */,
2285-
07BBCB3826D036AC000D96C4 /* TCPPeerHandler.swift in Sources */,
22862284
076D22E627FC219000970AFC /* Access.swift in Sources */,
22872285
076D249827FC219200970AFC /* ChannelConfig.swift in Sources */,
22882286
076D250227FC219200970AFC /* Init.swift in Sources */,

xcode/DirectBindingsApp/DirectBindingsApp/ContentView.swift

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,31 @@
88
import SwiftUI
99

1010
struct ContentView: View {
11-
@StateObject private var experiment = PolarConnectionExperiment()
11+
12+
@State private var isRunningTestFlow = false
13+
14+
var body: some View {
15+
16+
Button(action: {
17+
self.isRunningTestFlow = true
18+
if #available(iOS 15.0, *) {
19+
let sample = PolarIntegrationSample()
20+
Task {
21+
try? await sample.testPolarFlow()
22+
self.isRunningTestFlow = false
23+
}
24+
} else {
25+
// Fallback on earlier versions
26+
}
27+
28+
}, label: {
29+
Text("Hello World")
30+
}).disabled(self.isRunningTestFlow)
31+
32+
33+
}
34+
35+
/*@StateObject private var experiment = PolarConnectionExperiment()
1236
var body: some View {
1337
if !self.experiment.isMonitoring {
1438
Button("Monitor Chain") {
@@ -45,7 +69,7 @@ struct ContentView: View {
4569
}
4670
}
4771
}
48-
}
72+
}*/
4973
}
5074

5175
struct ContentView_Previews: PreviewProvider {

xcode/DirectBindingsApp/DirectBindingsApp/PolarConnectionExperiment.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class PolarConnectionExperiment: ObservableObject {
7676

7777
self.channelManager = self.channelManagerConstructor.channelManager
7878
self.peerManager = self.channelManagerConstructor.peerManager
79-
self.peerNetworkHandler = TCPPeerHandler(peerManager: self.peerManager)
79+
self.peerNetworkHandler = self.channelManagerConstructor.getTCPPeerHandler()
8080

8181
self.cmPersister = RegtestChannelManagerPersister(channelManager: self.channelManager)
8282
self.hasCaughtUpToChainTip = true

0 commit comments

Comments
 (0)