Skip to content

Commit c1efd42

Browse files
committed
release store custom channel manager persister from Bindings' pointer dictionary jail
1 parent b9c1344 commit c1efd42

File tree

4 files changed

+47
-21
lines changed

4 files changed

+47
-21
lines changed

bindings/LDK/Bindings.swift

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
//
77

88
import Foundation
9-
import LDKHeaders
109

1110
public typealias LDKTransactionOutputs = LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ
1211
public typealias LDKTxid = LDKThirtyTwoBytes
@@ -21,6 +20,7 @@ open class NativeTypeWrapper: Hashable {
2120
internal let globalInstanceNumber: UInt
2221
internal var dangling = false
2322
internal private(set) var anchors: Set<NativeTypeWrapper> = []
23+
internal var pointerDebugDescription: String? = nil
2424

2525
init(conflictAvoidingVariableName: UInt) {
2626
Self.globalInstanceCounter += 1
@@ -3955,25 +3955,42 @@ withUnsafePointer(to: htlc.cOpaqueStruct!) { (htlcPointer: UnsafePointer<LDKHTLC
39553955

39563956
/* STATIC_METHODS_END */
39573957

3958-
static var nativelyExposedInstances = [String: AnyObject]()
3958+
static var nativelyExposedInstances = [String: NativeTypeWrapper]()
39593959

3960-
public class func instanceToPointer(instance: AnyObject) -> UnsafeMutableRawPointer {
3960+
public class func instanceToPointer(instance: NativeTypeWrapper) -> UnsafeMutableRawPointer {
39613961
let pointer = Unmanaged.passUnretained(instance).toOpaque()
3962+
instance.pointerDebugDescription = pointer.debugDescription
39623963
Self.nativelyExposedInstances[pointer.debugDescription] = instance
39633964
return pointer
39643965
}
39653966

3966-
public class func pointerToInstance<T: AnyObject>(pointer: UnsafeRawPointer, sourceMarker: String?) -> T{
3967+
public class func pointerToInstance<T: NativeTypeWrapper>(pointer: UnsafeRawPointer, sourceMarker: String?) -> T{
39673968

39683969
let callStack = Thread.callStackSymbols
39693970
let caller = sourceMarker ?? callStack[1]
3970-
print("Retrieving instance from pointer for caller: \(caller)")
3971+
// print("Retrieving instance from pointer for caller: \(caller)")
39713972
// let value = Unmanaged<T>.fromOpaque(pointer).takeUnretainedValue()
39723973
let value = Self.nativelyExposedInstances[pointer.debugDescription] as! T
3973-
print("Instance retrieved for caller: \(caller)")
3974+
// print("Instance retrieved for caller: \(caller)")
39743975
return value
39753976
}
39763977

3978+
public class func removeInstancePointer(instance: NativeTypeWrapper) -> Bool {
3979+
guard let debugDescription = instance.pointerDebugDescription else {
3980+
return false
3981+
}
3982+
Self.nativelyExposedInstances.removeValue(forKey: debugDescription)
3983+
instance.pointerDebugDescription = nil
3984+
return true
3985+
}
3986+
3987+
public class func clearInstancePointers() {
3988+
for (_, currentInstance) in Self.nativelyExposedInstances {
3989+
currentInstance.pointerDebugDescription = nil
3990+
}
3991+
Self.nativelyExposedInstances.removeAll()
3992+
}
3993+
39773994
/* SWIFT_TO_RUST_START */
39783995
public class func new_LDKTransactionWrapper(array: [UInt8]) -> LDKTransactionWrapper {
39793996
/* DIMENSION_REDUCTION_PREP */
@@ -4105,11 +4122,11 @@ withUnsafePointer(to: htlc.cOpaqueStruct!) { (htlcPointer: UnsafePointer<LDKHTLC
41054122

41064123
}
41074124

4108-
public class InstanceCrashSimulator {
4125+
public class InstanceCrashSimulator: NativeTypeWrapper {
41094126

41104127
public init() {
4111-
4112-
}
4128+
super.init(conflictAvoidingVariableName: 0)
4129+
}
41134130

41144131
public func getPointer() -> UnsafeMutableRawPointer {
41154132
let pointer = Bindings.instanceToPointer(instance: self)

bindings/batteries/ChannelManagerConstructor.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,18 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
6969
}
7070

7171
print("Collected channel monitors, reading channel manager")
72-
let channelManagerResult = UtilMethods.constructor_BlockHashChannelManagerZ_read(ser: channel_manager_serialized, arg_keys_manager: keys_interface, arg_fee_estimator: fee_estimator, arg_chain_monitor: chain_monitor.as_Watch(), arg_tx_broadcaster: tx_broadcaster, arg_logger: logger, arg_default_config: UserConfig(), arg_channel_monitors: monitors)
72+
let channelManagerResult: Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ = UtilMethods.constructor_BlockHashChannelManagerZ_read(ser: channel_manager_serialized, arg_keys_manager: keys_interface, arg_fee_estimator: fee_estimator, arg_chain_monitor: chain_monitor.as_Watch(), arg_tx_broadcaster: tx_broadcaster, arg_logger: logger, arg_default_config: UserConfig(), arg_channel_monitors: monitors)
7373
if channelManagerResult.isOk() != true {
7474
throw InvalidSerializedDataError.invalidSerializedChannelManager
7575
}
7676

77-
7877
for clonedChannelMonitor in self.channel_monitors {
7978
clonedChannelMonitor.0.cOpaqueStruct!.is_owned = true
8079
}
8180

8281
let latestBlockHash = Bindings.LDKThirtyTwoBytes_to_array(nativeType: channelManagerResult.cOpaqueStruct!.contents.result.pointee.a)
83-
let channelManager = ChannelManager(pointer: channelManagerResult.cOpaqueStruct!.contents.result.pointee.b)
84-
try! channelManager.addAnchor(anchor: channelManagerResult)
82+
let channelManager = ChannelManager(pointer: channelManagerResult.dangle().cOpaqueStruct!.contents.result.pointee.b)
83+
// try! channelManager.addAnchor(anchor: channelManagerResult)
8584

8685

8786
self.channelManager = channelManager
@@ -170,18 +169,25 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
170169
monitorClone.cOpaqueStruct?.is_owned = true
171170
}
172171

173-
self.customPersister = CustomChannelManagerPersister(handler: persister)
174-
self.customEventHandler = CustomEventHandler(handler: persister)
175-
self.backgroundProcessor = BackgroundProcessor(persister: self.customPersister!, event_handler: self.customEventHandler!, chain_monitor: self.chain_monitor, channel_manager: self.channelManager, peer_manager: self.peerManager, logger: self.logger)
172+
let customPersister = CustomChannelManagerPersister(handler: persister)
173+
let customEventHandler = CustomEventHandler(handler: persister)
174+
/*self.backgroundProcessor = BackgroundProcessor(persister: self.customPersister!, event_handler: self.customEventHandler!, chain_monitor: self.chain_monitor, channel_manager: self.channelManager, peer_manager: self.peerManager, logger: self.logger)
175+
try! self.backgroundProcessor!.addAnchor(anchor: self.channelManager)
176176
try! self.backgroundProcessor!.addAnchor(anchor: self.peerManager)
177+
try! self.backgroundProcessor!.addAnchor(anchor: self.customPersister!)
178+
try! self.backgroundProcessor!.addAnchor(anchor: self.customEventHandler!)*/
177179

178180
}
179181

180182
public func interrupt() {
181183
self.shutdown = true
182184
self.backgroundProcessor?.stop()
185+
self.backgroundProcessor = nil
183186
}
184187

188+
deinit {
189+
print("channelmanagerconstructor destructor")
190+
}
185191

186192
}
187193

ci/LDKSwift/Tests/LDKSwiftTests/LDKSwiftTest.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ class LDKSwiftTest: XCTestCase {
7373
let channel_manager = channel_manager_constructor.channelManager;
7474
let cmPersister = TestChannelManagerPersister(channelManager: channel_manager)
7575

76-
channel_manager_constructor.chain_sync_completed(persister: cmPersister)
76+
// channel_manager_constructor.chain_sync_completed(persister: cmPersister)
77+
// channel_manager_constructor.interrupt()
78+
79+
Bindings.removeInstancePointer(instance: cmPersister)
7780

7881
}
7982

ci/LDKSwift/Tests/LDKSwiftTests/TestChannelManagerPersister.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ import LDKSwift
99
import LDKHeaders
1010

1111
class TestChannelManagerPersister : ChannelManagerPersister, ExtendedChannelManagerPersister {
12-
12+
1313
private let channelManager: ChannelManager?
1414
private let keysManager: KeysManager? = nil
15-
15+
1616
init(channelManager: ChannelManager?) {
1717
self.channelManager = channelManager
1818
super.init()
1919
}
20-
20+
2121
func handle_event(event: Event) {
2222
// privateHandleEvent(event: event)
2323
}
24-
24+
2525
override func persist_manager(channel_manager: ChannelManager) -> Result_NoneErrorZ {
2626
return Result_NoneErrorZ()
2727
}

0 commit comments

Comments
 (0)