11use callback:: CallbackSubscription ;
22use callback:: SubscribableCallback ;
33use core:: marker:: PhantomData ;
4+ use core:: slice;
45use syscalls;
56
67const DRIVER_NUMBER : usize = 0x10000 ;
@@ -10,12 +11,12 @@ mod ipc_commands {
1011 pub const NOTIFY_CLIENT : usize = 1 ;
1112}
1213
13- pub struct IpcServerCallback < S , CB > {
14+ pub struct IpcServerCallback < S : ? Sized , CB > {
1415 callback : CB ,
1516 phantom_data : PhantomData < S > ,
1617}
1718
18- impl < S , CB : FnMut ( usize , usize , & mut S ) > SubscribableCallback for IpcServerCallback < S , CB > {
19+ impl < CB : FnMut ( usize , usize , & mut [ u8 ] ) > SubscribableCallback for IpcServerCallback < [ u8 ] , CB > {
1920 fn driver_number ( & self ) -> usize {
2021 DRIVER_NUMBER
2122 }
@@ -25,8 +26,8 @@ impl<S, CB: FnMut(usize, usize, &mut S)> SubscribableCallback for IpcServerCallb
2526 }
2627
2728 fn call_rust ( & mut self , arg0 : usize , arg1 : usize , arg2 : usize ) {
28- let data = unsafe { & mut * ( arg2 as * mut S ) } ;
29- ( self . callback ) ( arg0, arg1, data ) ;
29+ let mut v = unsafe { slice :: from_raw_parts_mut ( arg2 as * mut u8 , arg1 ) } ;
30+ ( self . callback ) ( arg0, arg1, & mut v ) ;
3031 }
3132}
3233
@@ -37,9 +38,9 @@ pub fn notify_client(pid: usize) {
3738pub struct IpcServerDriver ;
3839
3940impl IpcServerDriver {
40- pub fn start < S , CB : FnMut ( usize , usize , & mut S ) > (
41+ pub fn start < CB : FnMut ( usize , usize , & mut [ u8 ] ) > (
4142 callback : CB ,
42- ) -> Result < CallbackSubscription < IpcServerCallback < S , CB > > , ( ) > {
43+ ) -> Result < CallbackSubscription < IpcServerCallback < [ u8 ] , CB > > , ( ) > {
4344 let ( _, subscription) = syscalls:: subscribe_new ( IpcServerCallback {
4445 callback,
4546 phantom_data : Default :: default ( ) ,
0 commit comments