Skip to content

Commit ded857a

Browse files
kevinlindkvistCQ Bot
authored andcommitted
[starnix] Remove wake source when file is closed
Previously we never removed wake sources that were added in the DataChannelFile (the support wasn't there). Fixed: 441992584 Change-Id: Icabd4096ea182d0b434cd243b57b2e74ed2089a8 Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/1359312 Reviewed-by: Benjamin Lerman <[email protected]> Commit-Queue: Kevin Lindkvist <[email protected]> Fuchsia-Auto-Submit: Kevin Lindkvist <[email protected]>
1 parent 5722ae5 commit ded857a

File tree

1 file changed

+40
-9
lines changed

1 file changed

+40
-9
lines changed

src/starnix/modules/nanohub/datachannel_file.rs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use starnix_core::device::DeviceOps;
66
use 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};
1010
use starnix_core::{fileops_impl_noop_sync, fileops_impl_seekable};
1111
use starnix_logging::{impossible_error, log_error, log_warn};
1212
use starnix_sync::{FileOpsCore, Locked};
@@ -23,12 +23,18 @@ use fuchsia_runtime;
2323

2424
#[derive(Clone)]
2525
pub struct DataChannelDevice {
26+
manager: Arc<frunner::ManagerSynchronousProxy>,
2627
service_proxy: Arc<fnanohub::DataChannelServiceProxy>,
2728
}
2829

2930
impl 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

5460
pub 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

6068
impl 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

99106
impl 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

Comments
 (0)