Skip to content

Commit 2531071

Browse files
committed
udpate broadcaster_wrapper ffi interface
1 parent 1ed458f commit 2531071

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

bindings/src/adaptors/primitives.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ macro_rules! array_struct{
1313
len: u64,
1414
_marker: std::marker::PhantomData<&'a $ty>
1515
}
16-
unsafe_impl!("Simulate the effect with `Unique<T>`" => impl<'a> Send for $name<'a> where $ty: Send{});
17-
unsafe_impl!("Simulate the effect with `Unique<T>`" => impl<'a> Sync for $name<'a> where $ty: Sync{});
16+
unsafe_impl!("Simulate `Unique<T>`" => impl<'a> Send for $name<'a> where $ty: Send{});
17+
unsafe_impl!("Simulate `Unique<T>`" => impl<'a> Sync for $name<'a> where $ty: Sync{});
1818
impl<'a> $name<'a> {
1919
fn new(ptr: *const $ty, len: u64) -> Self { $name{ ptr: ptr, len: len, _marker: std::marker::PhantomData } }
2020
}

bindings/src/broadcaster.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use crate::error::FFIResult;
1111

1212
use lightning::chain::chaininterface::{BroadcasterInterface};
1313

14+
type FFIBroadCasterHandle<'a> = HandleShared<'a, FFIBroadCaster>;
15+
1416
#[cfg(feature = "debug_assertions")]
1517
#[repr(C)]
1618
pub struct BroadcasterWrapper {
@@ -23,7 +25,10 @@ impl BroadcasterWrapper {
2325
self.broadcaster.as_ref().broadcast_transaction(&tx)
2426
}
2527
}
26-
type FFIBroadCasterHandle<'a> = HandleShared<'a, FFIBroadCaster>;
28+
29+
#[cfg(feature = "debug_assertions")]
30+
type BroadcasterWrapperHandle<'a> = HandleShared<'a, BroadcasterWrapper>;
31+
2732

2833
ffi! {
2934
fn create_broadcaster(broadcast_transaction_ptr: Ref<BroadcasterFn::broadcast_transaction_ptr>, out: Out<FFIBroadCasterHandle>) -> FFIResult {
@@ -39,6 +44,8 @@ ffi! {
3944
}))
4045
}
4146
}
47+
48+
/// Useful for testing low-level interoperability.
4249
#[cfg(feature = "debug_assertions")]
4350
ffi! {
4451
fn ffi_test_broadcaster(broadcaster_ptr: FFIBroadCasterHandle) -> FFIResult {
@@ -47,16 +54,26 @@ ffi! {
4754
broadcaster.broadcast_transaction(&tx);
4855
FFIResult::ok()
4956
}
50-
fn ffi_test_broadcaster_in_wrapper(broadcaster_ptr: Ref<FFIBroadCaster>, out: Out<BroadcasterWrapper>) -> FFIResult {
51-
let broadcaster = unsafe_block!("" => broadcaster_ptr.as_arc());
57+
58+
fn create_broadcaster_wrapper(broadcaster_handle: FFIBroadCasterHandle, out: Out<BroadcasterWrapperHandle>) -> FFIResult {
59+
// Test if passing dependent object by handle will be safe.
60+
let broadcaster = unsafe_block!("" => broadcaster_handle.as_arc());
5261
let wrapper_raw = BroadcasterWrapper{ broadcaster: broadcaster };
53-
unsafe_block!("" => out.init(wrapper_raw));
62+
unsafe_block!("" => out.init(BroadcasterWrapperHandle::alloc(wrapper_raw)));
5463
FFIResult::ok()
5564
}
5665

57-
fn ffi_test_chainwatch_interface(chainwatcher_ptr: Ref<FFIChainWatchInterface>) -> FFIResult {
58-
let chainwatcher = unsafe_block!("" => chainwatcher_ptr.as_ref());
59-
// chainwatcher.install_watch_tx();
66+
fn test_broadcaster_wrapper(wrapper_handle: BroadcasterWrapperHandle) -> FFIResult {
67+
let wrapper = unsafe_block!("" => wrapper_handle.as_ref());
68+
let tx: Transaction = bitcoin::consensus::deserialize(&hex::decode("020000000001031cfbc8f54fbfa4a33a30068841371f80dbfe166211242213188428f437445c91000000006a47304402206fbcec8d2d2e740d824d3d36cc345b37d9f65d665a99f5bd5c9e8d42270a03a8022013959632492332200c2908459547bf8dbf97c65ab1a28dec377d6f1d41d3d63e012103d7279dfb90ce17fe139ba60a7c41ddf605b25e1c07a4ddcb9dfef4e7d6710f48feffffff476222484f5e35b3f0e43f65fc76e21d8be7818dd6a989c160b1e5039b7835fc00000000171600140914414d3c94af70ac7e25407b0689e0baa10c77feffffffa83d954a62568bbc99cc644c62eb7383d7c2a2563041a0aeb891a6a4055895570000000017160014795d04cc2d4f31480d9a3710993fbd80d04301dffeffffff06fef72f000000000017a91476fd7035cd26f1a32a5ab979e056713aac25796887a5000f00000000001976a914b8332d502a529571c6af4be66399cd33379071c588ac3fda0500000000001976a914fc1d692f8de10ae33295f090bea5fe49527d975c88ac522e1b00000000001976a914808406b54d1044c429ac54c0e189b0d8061667e088ac6eb68501000000001976a914dfab6085f3a8fb3e6710206a5a959313c5618f4d88acbba20000000000001976a914eb3026552d7e3f3073457d0bee5d4757de48160d88ac0002483045022100bee24b63212939d33d513e767bc79300051f7a0d433c3fcf1e0e3bf03b9eb1d70220588dc45a9ce3a939103b4459ce47500b64e23ab118dfc03c9caa7d6bfc32b9c601210354fd80328da0f9ae6eef2b3a81f74f9a6f66761fadf96f1d1d22b1fd6845876402483045022100e29c7e3a5efc10da6269e5fc20b6a1cb8beb92130cc52c67e46ef40aaa5cac5f0220644dd1b049727d991aece98a105563416e10a5ac4221abac7d16931842d5c322012103960b87412d6e169f30e12106bdf70122aabb9eb61f455518322a18b920a4dfa887d30700")?)?;
69+
wrapper.broadcast(&tx);
6070
FFIResult::ok()
6171
}
72+
73+
fn release_broadcaster_wrapper(handle: BroadcasterWrapperHandle) -> FFIResult {
74+
unsafe_block!("The upstream caller guarantees the handle will not be accessed after being freed" => BroadcasterWrapperHandle::dealloc(handle, |mut handle| {
75+
FFIResult::ok()
76+
}))
77+
}
78+
6279
}

bindings/src/handle/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ where
4848
unsafe_block!("We own, the interioer value" => { &*self.0 })
4949
}
5050

51+
unsafe_fn!("The pointer must be nonnull" =>
52+
pub fn as_arc(&self) -> Arc<T> {
53+
Arc::from_raw(self.0)
54+
}
55+
);
56+
5157
unsafe_fn!("There are no other live references and the handle won't be used again" =>
5258
pub(super) fn dealloc<R>(handle: Self, f: impl FnOnce(T) -> R) -> R {
5359
let v = Box::from_raw(handle.0 as *mut T);

0 commit comments

Comments
 (0)