fuser
fuser copied to clipboard
Support FUSE_INTERRUPT
I think FUSE_INTERRUPT could work really well with an async API runner. It would look something like:
let in_flight = HashMap<RequestId, JoinHandle<()>>::new();
let future_cancellations = Set<RequestId>::new();
for req in requests {
if future_cancellations.contains(req.request_id()) {
future_cancellations.pop(req.request_id());
continue;
}
match req.operation() {
Interrupt(x) => in_flight.pop(x.cancelled_id()).abort() || future_cancellations.push(x.cancelled_id());
}
in_flight[req.request_id()] = tokio::spawn(|| {
handler(req);
in_flight.pop(req.request_id());
});
}
So interrupted pending tasks would be aborted, and their futures dropped in response to FUSE_INTERRUPT
messages. It fits naturally with the async API.
Ya, agreed! I'd love to see an async implementation :)
Note to self, for the future: I looked into implementing this in the current API, and it doesn't make sense. FUSE_INTERRUPT is for interrupting code that's hung in userspace. However, the current Filesystem
interface takes &mut self
so concurrent calls aren't possible. Revisit it after async is implemented