@@ -50,18 +50,23 @@ unsafe extern "C" fn log_handler(
5050 }
5151}
5252
53- extern "C" fn trampoline < F > ( data : * mut c_void , cmd : * mut libosdp_sys:: osdp_cmd ) -> i32
53+ extern "C" fn trampoline < F > ( data_ptr : * mut c_void , cmd_ptr : * mut libosdp_sys:: osdp_cmd ) -> i32
5454where
55- F : FnMut ( OsdpCommand ) -> i32 ,
55+ F : FnMut ( & mut OsdpCommand ) -> i32 ,
5656{
57- let cmd: OsdpCommand = unsafe { ( * cmd) . into ( ) } ;
58- let callback: & mut F = unsafe { & mut * ( data as * mut F ) } ;
59- callback ( cmd)
57+ let mut cmd: OsdpCommand = unsafe { cmd_ptr. read ( ) . into ( ) } ;
58+ let callback: & mut F = unsafe { & mut * ( data_ptr as * mut F ) } ;
59+ let res = callback ( & mut cmd) ;
60+ // TODO: Free data_ptr's box?
61+ unsafe {
62+ cmd_ptr. write ( cmd. into ( ) ) ;
63+ }
64+ res
6065}
6166
6267fn get_trampoline < F > ( _closure : & F ) -> CommandCallback
6368where
64- F : FnMut ( OsdpCommand ) -> i32 ,
69+ F : FnMut ( & mut OsdpCommand ) -> i32 ,
6570{
6671 trampoline :: < F >
6772}
@@ -131,7 +136,7 @@ impl PeripheralDevice {
131136 /// CP.
132137 pub fn set_command_callback < F > ( & mut self , closure : F )
133138 where
134- F : FnMut ( OsdpCommand ) -> i32 ,
139+ F : FnMut ( & mut OsdpCommand ) -> i32 ,
135140 {
136141 unsafe {
137142 let callback = get_trampoline ( & closure) ;
0 commit comments