cancelation tokens

This commit is contained in:
Aleksey Kladov 2018-08-31 10:27:38 +03:00
parent 902df0fc05
commit efa6a952b4
3 changed files with 54 additions and 0 deletions

View file

@ -6,6 +6,7 @@ authors = ["Aleksey Kladov <aleksey.kladov@gmail.com>"]
[dependencies]
relative-path = "0.3.7"
log = "0.4.2"
crossbeam-channel = "0.2.4"
parking_lot = "0.6.3"
once_cell = "0.1.4"
rayon = "1.0.2"

View file

@ -0,0 +1,49 @@
use crossbeam_channel::{bounded, Receiver, Sender};
pub struct JobHandle {
job_alive: Receiver<Never>,
_job_canceled: Sender<Never>,
}
pub struct JobToken {
_job_alive: Sender<Never>,
job_canceled: Receiver<Never>,
}
impl JobHandle {
pub fn new() -> (JobHandle, JobToken) {
let (sender_alive, receiver_alive) = bounded(0);
let (sender_canceled, receiver_canceled) = bounded(0);
let token = JobToken { _job_alive: sender_alive, job_canceled: receiver_canceled };
let handle = JobHandle { job_alive: receiver_alive, _job_canceled: sender_canceled };
(handle, token)
}
pub fn is_alive(&self) -> bool {
!is_closed(&self.job_alive)
}
pub fn cancel(self) {
}
}
impl JobToken {
pub fn is_canceled(&self) -> bool {
is_closed(&self.job_canceled)
}
}
// We don't actually send messages through the channels,
// and instead just check if the channel is closed,
// so we use uninhabited enum as a message type
enum Never {}
/// Nonblocking
fn is_closed(chan: &Receiver<Never>) -> bool {
select! {
recv(chan, msg) => match msg {
None => true,
Some(never) => match never {}
}
default => false,
}
}

View file

@ -7,10 +7,13 @@ extern crate libeditor;
extern crate fst;
extern crate rayon;
extern crate relative_path;
#[macro_use]
extern crate crossbeam_channel;
mod symbol_index;
mod module_map;
mod imp;
mod job;
use std::sync::Arc;
@ -22,6 +25,7 @@ pub use libeditor::{
StructureNode, LineIndex, FileSymbol,
Runnable, RunnableKind, HighlightedRange, CompletionItem,
};
pub use job::{JobToken, JobHandle};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FileId(pub u32);