@@ -6,7 +6,7 @@ use starnix_core::device::DeviceOps;
66use starnix_core:: task:: {
77 CurrentTask , EventHandler , SignalHandler , SignalHandlerInner , WaitCanceler , Waiter ,
88} ;
9- use starnix_core:: vfs:: { FileObject , FileOps , InputBufferExt , NamespaceNode } ;
9+ use starnix_core:: vfs:: { FileObject , FileObjectState , FileOps , InputBufferExt , NamespaceNode } ;
1010use starnix_core:: { fileops_impl_noop_sync, fileops_impl_seekable} ;
1111use starnix_logging:: { impossible_error, log_error, log_warn} ;
1212use starnix_sync:: { FileOpsCore , Locked } ;
@@ -23,12 +23,18 @@ use fuchsia_runtime;
2323
2424#[ derive( Clone ) ]
2525pub struct DataChannelDevice {
26+ manager : Arc < frunner:: ManagerSynchronousProxy > ,
2627 service_proxy : Arc < fnanohub:: DataChannelServiceProxy > ,
2728}
2829
2930impl DataChannelDevice {
3031 pub fn new ( service_proxy : fnanohub:: DataChannelServiceProxy ) -> Self {
31- DataChannelDevice { service_proxy : Arc :: new ( service_proxy) }
32+ let manager = Arc :: new (
33+ fuchsia_component:: client:: connect_to_protocol_sync :: < frunner:: ManagerMarker > ( )
34+ . expect ( "failed to create runner proxy" ) ,
35+ ) ;
36+
37+ DataChannelDevice { manager, service_proxy : Arc :: new ( service_proxy) }
3238 }
3339}
3440
@@ -47,28 +53,29 @@ impl DeviceOps for DataChannelDevice {
4753 } ) ( )
4854 . map_err ( |_: fidl:: Error | errno ! ( EIO , "Failed to get data channel device" ) ) ?;
4955
50- Ok ( Box :: new ( DataChannelFile :: new ( Arc :: new ( device_proxy) ) ?) )
56+ Ok ( Box :: new ( DataChannelFile :: new ( Arc :: new ( device_proxy) , self . manager . clone ( ) ) ?) )
5157 }
5258}
5359
5460pub struct DataChannelFile {
61+ manager : Arc < frunner:: ManagerSynchronousProxy > ,
62+
5563 client : Arc < fnanohub:: DataChannelSynchronousProxy > ,
5664 // Event used to determine when data is available to read or write.
5765 event : Arc < zx:: Event > ,
5866}
5967
6068impl DataChannelFile {
61- pub fn new ( client : Arc < fnanohub:: DataChannelSynchronousProxy > ) -> Result < Self , Errno > {
69+ pub fn new (
70+ client : Arc < fnanohub:: DataChannelSynchronousProxy > ,
71+ manager : Arc < frunner:: ManagerSynchronousProxy > ,
72+ ) -> Result < Self , Errno > {
6273 let event = zx:: Event :: create ( ) ;
6374 let event_dup = event. duplicate_handle ( Rights :: SAME_RIGHTS ) . map_err ( |e| {
6475 log_error ! ( "Failed to duplicate event handle: {:?}" , e) ;
6576 Errno :: new ( EIO )
6677 } ) ?;
6778
68- let manager =
69- fuchsia_component:: client:: connect_to_protocol_sync :: < frunner:: ManagerMarker > ( )
70- . expect ( "failed" ) ;
71-
7279 let wake_source_event = event. duplicate_handle ( Rights :: SAME_RIGHTS ) . map_err ( |e| {
7380 log_error ! ( "Failed to duplicate event handle for wake source: {:?}" , e) ;
7481 Errno :: new ( EIO )
@@ -92,14 +99,38 @@ impl DataChannelFile {
9299 . map_err ( |e| errno ! ( EIO , e) ) ?
93100 . map_err ( |e| errno ! ( EIO , e) ) ?;
94101
95- Ok ( DataChannelFile { client, event : Arc :: new ( event_dup) } )
102+ Ok ( DataChannelFile { manager , client, event : Arc :: new ( event_dup) } )
96103 }
97104}
98105
99106impl FileOps for DataChannelFile {
100107 fileops_impl_seekable ! ( ) ;
101108 fileops_impl_noop_sync ! ( ) ;
102109
110+ fn close (
111+ self : Box < Self > ,
112+ _locked : & mut Locked < FileOpsCore > ,
113+ _file : & FileObjectState ,
114+ _current_task : & CurrentTask ,
115+ ) {
116+ let event =
117+ self . event . duplicate_handle ( Rights :: SAME_RIGHTS ) . expect ( "Failed to duplicate event" ) ;
118+ let _ = self
119+ . manager
120+ . remove_wake_source ( frunner:: ManagerRemoveWakeSourceRequest {
121+ container_job : Some (
122+ fuchsia_runtime:: job_default ( )
123+ . duplicate ( Rights :: SAME_RIGHTS )
124+ . expect ( "Failed to dup handle" ) ,
125+ ) ,
126+ handle : Some ( event. into_handle ( ) ) ,
127+ ..Default :: default ( )
128+ } )
129+ . map_err ( |_| {
130+ log_error ! ( "Failed to remove wake source" ) ;
131+ } ) ;
132+ }
133+
103134 fn read (
104135 & self ,
105136 locked : & mut Locked < FileOpsCore > ,
0 commit comments