X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-c-bindings%2Fsrc%2Fln%2Fpeer_handler.rs;h=047294b981ea3597aab1d1b03241b3ce24d7e2a3;hb=764d8a6a61a58e1c86e5eaf74706f522fc389020;hp=e4c8b59b1b45a78018335434b07ca609fe574cf0;hpb=23a1d7aab5c2cc6f00636815fa126716456dfcfd;p=rust-lightning diff --git a/lightning-c-bindings/src/ln/peer_handler.rs b/lightning-c-bindings/src/ln/peer_handler.rs index e4c8b59b..047294b9 100644 --- a/lightning-c-bindings/src/ln/peer_handler.rs +++ b/lightning-c-bindings/src/ln/peer_handler.rs @@ -41,7 +41,7 @@ extern "C" fn MessageHandler_free_void(this_ptr: *mut c_void) { #[allow(unused)] /// When moving out of the pointer, we have to ensure we aren't a reference, this makes that easy impl MessageHandler { - pub(crate) fn take_ptr(mut self) -> *mut nativeMessageHandler { + pub(crate) fn take_inner(mut self) -> *mut nativeMessageHandler { assert!(self.is_owned); let ret = self.inner; self.inner = std::ptr::null_mut(); @@ -118,29 +118,33 @@ pub struct SocketDescriptor { /// though races may occur whereby disconnect_socket is called after a call to /// socket_disconnected but prior to socket_disconnected returning. pub disconnect_socket: extern "C" fn (this_arg: *mut c_void), - pub eq: extern "C" fn (this_arg: *const c_void, other_arg: *const c_void) -> bool, + pub eq: extern "C" fn (this_arg: *const c_void, other_arg: &SocketDescriptor) -> bool, pub hash: extern "C" fn (this_arg: *const c_void) -> u64, pub clone: Option *mut c_void>, pub free: Option, } impl std::cmp::Eq for SocketDescriptor {} impl std::cmp::PartialEq for SocketDescriptor { - fn eq(&self, o: &Self) -> bool { (self.eq)(self.this_arg, o.this_arg) } + fn eq(&self, o: &Self) -> bool { (self.eq)(self.this_arg, o) } } impl std::hash::Hash for SocketDescriptor { fn hash(&self, hasher: &mut H) { hasher.write_u64((self.hash)(self.this_arg)) } } +#[no_mangle] +pub extern "C" fn SocketDescriptor_clone(orig: &SocketDescriptor) -> SocketDescriptor { + SocketDescriptor { + this_arg: if let Some(f) = orig.clone { (f)(orig.this_arg) } else { orig.this_arg }, + send_data: orig.send_data.clone(), + disconnect_socket: orig.disconnect_socket.clone(), + eq: orig.eq.clone(), + hash: orig.hash.clone(), + clone: orig.clone.clone(), + free: orig.free.clone(), + } +} impl Clone for SocketDescriptor { fn clone(&self) -> Self { - Self { - this_arg: if let Some(f) = self.clone { (f)(self.this_arg) } else { self.this_arg }, - send_data: self.send_data.clone(), - disconnect_socket: self.disconnect_socket.clone(), - eq: self.eq.clone(), - hash: self.hash.clone(), - clone: self.clone.clone(), - free: self.free.clone(), - } + SocketDescriptor_clone(self) } } @@ -209,7 +213,7 @@ extern "C" fn PeerHandleError_free_void(this_ptr: *mut c_void) { #[allow(unused)] /// When moving out of the pointer, we have to ensure we aren't a reference, this makes that easy impl PeerHandleError { - pub(crate) fn take_ptr(mut self) -> *mut nativePeerHandleError { + pub(crate) fn take_inner(mut self) -> *mut nativePeerHandleError { assert!(self.is_owned); let ret = self.inner; self.inner = std::ptr::null_mut(); @@ -274,7 +278,7 @@ extern "C" fn PeerManager_free_void(this_ptr: *mut c_void) { #[allow(unused)] /// When moving out of the pointer, we have to ensure we aren't a reference, this makes that easy impl PeerManager { - pub(crate) fn take_ptr(mut self) -> *mut nativePeerManager { + pub(crate) fn take_inner(mut self) -> *mut nativePeerManager { assert!(self.is_owned); let ret = self.inner; self.inner = std::ptr::null_mut(); @@ -287,7 +291,7 @@ impl PeerManager { #[must_use] #[no_mangle] pub extern "C" fn PeerManager_new(mut message_handler: crate::ln::peer_handler::MessageHandler, mut our_node_secret: crate::c_types::SecretKey, ephemeral_random_data: *const [u8; 32], mut logger: crate::util::logger::Logger) -> PeerManager { - let mut ret = lightning::ln::peer_handler::PeerManager::new(*unsafe { Box::from_raw(message_handler.take_ptr()) }, our_node_secret.into_rust(), unsafe { &*ephemeral_random_data}, logger); + let mut ret = lightning::ln::peer_handler::PeerManager::new(*unsafe { Box::from_raw(message_handler.take_inner()) }, our_node_secret.into_rust(), unsafe { &*ephemeral_random_data}, logger); PeerManager { inner: Box::into_raw(Box::new(ret)), is_owned: true } }