Skip to content

Commit 675ae8a

Browse files
committed
remove the usage of Receiver::recv_timeout
It will conditionally panic due to this issue: rust-lang/rust#39364 The issue is not fixed yet, so I try to use alternative ways (e.g. try_recv & sleep). It will cause some performance penalty in theory, but not noticable by human(for now).
1 parent a030e78 commit 675ae8a

File tree

8 files changed

+88
-81
lines changed

8 files changed

+88
-81
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/event.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
// All the events that will be used
22

33
use std::any::Any;
4+
use std::sync::mpsc::{Receiver, Sender};
45

56
pub type EventArg = Box<Any + 'static + Send>;
7+
pub type EventReceiver = Receiver<(Event, EventArg)>;
8+
pub type EventSender = Sender<(Event, EventArg)>;
69

710
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
811
pub enum Event {

src/input.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ use std::collections::VecDeque;
1010
use std::time::Duration;
1111
use utf8parse;
1212

13-
use event::{Event, EventArg, parse_action};
13+
use event::{Event, EventSender, parse_action};
1414

1515
pub struct Input {
16-
tx_input: Sender<(Event, EventArg)>,
16+
tx_input: EventSender,
1717
keyboard: KeyBoard,
1818
keymap: HashMap<Key, (Event, Option<String>)>,
1919
}
2020

2121
impl Input {
22-
pub fn new(tx_input: Sender<(Event, EventArg)>) -> Self {
22+
pub fn new(tx_input: EventSender) -> Self {
2323
let f = File::open("/dev/tty").unwrap();
2424
let keyboard = KeyBoard::new(f);
2525
Input {

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use std::time::Duration;
3131
use std::env;
3232
use std::sync::mpsc::{sync_channel, channel, Sender, Receiver};
3333
use event::Event::*;
34-
use event::{Event, EventArg};
34+
use event::{EventSender, EventReceiver};
3535
use std::mem;
3636
use std::ptr;
3737
use libc::{sigemptyset, sigaddset, sigwait, pthread_sigmask};
@@ -184,7 +184,7 @@ fn real_main() -> i32 {
184184
return 0;
185185
}
186186

187-
let (tx_input, rx_input): (Sender<(Event, EventArg)>, Receiver<(Event, EventArg)>) = channel();
187+
let (tx_input, rx_input): (EventSender, EventReceiver) = channel();
188188
//------------------------------------------------------------------------------
189189
// register terminal resize event, `pthread_sigmask` should be run before any thread.
190190
let mut sigset = unsafe {mem::uninitialized()};

src/matcher.rs

Lines changed: 62 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::sync::{Arc, RwLock};
2-
use std::sync::mpsc::{Receiver, Sender, channel};
3-
use event::{Event, EventArg};
2+
use std::sync::mpsc::channel;
3+
use event::{Event, EventSender, EventReceiver};
44
use item::{Item, ItemGroup, MatchedItem, MatchedItemGroup, MatchedRange};
55
use std::thread;
66

@@ -33,12 +33,12 @@ enum MatcherMode {
3333
}
3434

3535
pub struct Matcher {
36-
tx_result: Sender<(Event, EventArg)>,
36+
tx_result: EventSender,
3737
mode: MatcherMode,
3838
}
3939

4040
impl Matcher {
41-
pub fn new(tx_result: Sender<(Event, EventArg)>) -> Self {
41+
pub fn new(tx_result: EventSender) -> Self {
4242
Matcher {
4343
tx_result: tx_result,
4444
mode: MatcherMode::Fuzzy,
@@ -78,18 +78,21 @@ impl Matcher {
7878

7979
}
8080

81-
pub fn run(&self, rx_item: Receiver<(Event, EventArg)>) {
82-
let (tx_matcher, rx_matcher) = channel();
81+
pub fn run(&self, rx_item: EventReceiver) {
82+
let (tx_matcher, rx_matcher): (EventSender, EventReceiver) = channel();
8383
let matcher_restart = Arc::new(AtomicBool::new(false));
8484
// start a new thread listening for EvMatcherRestart, that means the query had been
8585
// changed, so that matcher shoudl discard all previous events.
8686
{
8787
let matcher_restart = Arc::clone(&matcher_restart);
8888
thread::spawn(move || {
8989
while let Ok((ev, arg)) = rx_item.recv() {
90+
debug!("matcher: rx_item: {:?}", ev);
9091
match ev {
9192
Event::EvMatcherRestart => {
9293
matcher_restart.store(true, Ordering::Relaxed);
94+
95+
let _ = tx_matcher.send((ev, Box::new(true)));
9396
while matcher_restart.load(Ordering::Relaxed) {
9497
thread::sleep(Duration::from_millis(10));
9598
}
@@ -108,77 +111,76 @@ impl Matcher {
108111
let mut matcher_engine: Option<Box<MatchEngine>> = None;
109112
let mut num_processed: usize = 0;
110113
let mut matcher_mode = self.mode;
111-
loop {
112114

115+
while let Ok((ev, arg)) = rx_matcher.recv() {
116+
debug!("matcher: rx_matcher: {:?}", ev);
113117
if matcher_restart.load(Ordering::Relaxed) {
114118
while let Ok(_) = rx_matcher.try_recv() {}
115119
matcher_restart.store(false, Ordering::Relaxed);
120+
continue;
116121
}
117122

118-
if let Ok((ev, arg)) = rx_matcher.recv_timeout(Duration::from_millis(10)) {
119-
match ev {
120-
Event::EvMatcherNewItem => {
121-
let items: ItemGroup = *arg.downcast().unwrap();
122-
num_processed += items.len();
123-
124-
matcher_engine.as_ref().map(|mat| {
125-
let matched_items: MatchedItemGroup = items.into_iter()
126-
.filter_map(|item| mat.match_item(item))
127-
.collect();
128-
let _ = self.tx_result.send((Event::EvModelNewItem, Box::new(matched_items)));
129-
});
130-
131-
// report the number of processed items
132-
let _ = self.tx_result.send((Event::EvModelNotifyProcessed, Box::new(num_processed)));
133-
}
123+
match ev {
124+
Event::EvMatcherRestart => {
125+
num_processed = 0;
126+
let query = arg.downcast::<String>().unwrap();
134127

135-
Event::EvReaderStopped | Event::EvReaderStarted => {
136-
let _ = self.tx_result.send((ev, arg));
137-
}
138-
Event::EvSenderStopped => {
139-
// Since matcher is single threaded, sender stopped means all items are
140-
// processed.
141-
let _ = self.tx_result.send((Event::EvModelNotifyProcessed, Box::new(num_processed)));
142-
let _ = self.tx_result.send((Event::EvMatcherStopped, arg));
143-
}
128+
// notifiy the model that the query had been changed
129+
let _ = self.tx_result.send((Event::EvModelRestart, Box::new(true)));
144130

131+
let mode_string = match matcher_mode {
132+
MatcherMode::Regex => "RE".to_string(),
133+
MatcherMode::Exact => "EX".to_string(),
134+
_ => "".to_string(),
135+
};
136+
let _ = self.tx_result.send((Event::EvModelNotifyMatcherMode, Box::new(mode_string)));
145137

146-
Event::EvMatcherRestart => {
147-
num_processed = 0;
148-
let query = arg.downcast::<String>().unwrap();
138+
matcher_engine = Some(EngineFactory::build(&query, matcher_mode));
139+
}
149140

150-
// notifiy the model that the query had been changed
151-
let _ = self.tx_result.send((Event::EvModelRestart, Box::new(true)));
141+
Event::EvMatcherNewItem => {
142+
let items: ItemGroup = *arg.downcast().unwrap();
143+
num_processed += items.len();
152144

153-
let mode_string = match matcher_mode {
154-
MatcherMode::Regex => "RE".to_string(),
155-
MatcherMode::Exact => "EX".to_string(),
156-
_ => "".to_string(),
157-
};
158-
let _ = self.tx_result.send((Event::EvModelNotifyMatcherMode, Box::new(mode_string)));
145+
matcher_engine.as_ref().map(|mat| {
146+
let matched_items: MatchedItemGroup = items.into_iter()
147+
.filter_map(|item| mat.match_item(item))
148+
.collect();
149+
let _ = self.tx_result.send((Event::EvModelNewItem, Box::new(matched_items)));
150+
});
159151

160-
matcher_engine = Some(EngineFactory::build(&query, matcher_mode));
161-
}
152+
// report the number of processed items
153+
let _ = self.tx_result.send((Event::EvModelNotifyProcessed, Box::new(num_processed)));
154+
}
162155

163-
Event::EvActRotateMode => {
164-
if self.mode == MatcherMode::Regex {
165-
// sk started with regex mode.
166-
matcher_mode = if matcher_mode == self.mode {
167-
MatcherMode::Fuzzy
168-
} else {
169-
MatcherMode::Regex
170-
};
156+
Event::EvReaderStopped | Event::EvReaderStarted => {
157+
let _ = self.tx_result.send((ev, arg));
158+
}
159+
Event::EvSenderStopped => {
160+
// Since matcher is single threaded, sender stopped means all items are
161+
// processed.
162+
let _ = self.tx_result.send((Event::EvModelNotifyProcessed, Box::new(num_processed)));
163+
let _ = self.tx_result.send((Event::EvMatcherStopped, arg));
164+
}
165+
166+
Event::EvActRotateMode => {
167+
if self.mode == MatcherMode::Regex {
168+
// sk started with regex mode.
169+
matcher_mode = if matcher_mode == self.mode {
170+
MatcherMode::Fuzzy
171171
} else {
172-
matcher_mode = if matcher_mode == self.mode {
173-
MatcherMode::Regex
174-
} else {
175-
self.mode
176-
}
172+
MatcherMode::Regex
173+
};
174+
} else {
175+
matcher_mode = if matcher_mode == self.mode {
176+
MatcherMode::Regex
177+
} else {
178+
self.mode
177179
}
178180
}
179-
180-
_ => {}
181181
}
182+
183+
_ => {}
182184
}
183185
}
184186
}

src/model.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use std::sync::mpsc::{Receiver, Sender};
2-
use event::{Event, EventArg};
1+
use std::sync::mpsc::Sender;
2+
use event::{Event, EventReceiver};
33
use item::{MatchedItem, MatchedItemGroup, MatchedRange};
44
use std::cmp::{max, min};
55
use orderedvec::OrderedVec;
@@ -29,7 +29,7 @@ lazy_static! {
2929
}
3030

3131
pub struct Model {
32-
rx_cmd: Receiver<(Event, EventArg)>,
32+
rx_cmd: EventReceiver,
3333
items: OrderedVec<Arc<MatchedItem>>, // all items
3434
selected: HashMap<(usize, usize), Arc<MatchedItem>>,
3535

@@ -57,7 +57,7 @@ pub struct Model {
5757
}
5858

5959
impl Model {
60-
pub fn new(rx_cmd: Receiver<(Event, EventArg)>) -> Self {
60+
pub fn new(rx_cmd: EventReceiver) -> Self {
6161
Model {
6262
rx_cmd: rx_cmd,
6363
items: OrderedVec::new(),

src/reader.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use item::Item;
44
use std::sync::{Arc, RwLock};
55
use std::process::{Command, Stdio, Child};
66
use std::io::{BufRead, BufReader};
7-
use event::{Event, EventArg};
7+
use event::{EventSender, EventReceiver, Event, EventArg};
88
use std::thread::JoinHandle;
99
use std::thread;
1010
use std::time::Duration;
@@ -66,14 +66,14 @@ impl ReaderOption {
6666
}
6767

6868
pub struct Reader {
69-
rx_cmd: Receiver<(Event, EventArg)>,
69+
rx_cmd: EventReceiver,
7070
tx_item: SyncSender<(Event, EventArg)>,
7171
option: Arc<RwLock<ReaderOption>>,
7272
real_stdin: Option<File>, // used to support piped output
7373
}
7474

7575
impl Reader {
76-
pub fn new(rx_cmd: Receiver<(Event, EventArg)>,
76+
pub fn new(rx_cmd: EventReceiver,
7777
tx_item: SyncSender<(Event, EventArg)>,
7878
real_stdin: Option<File>) -> Self {
7979
Reader {
@@ -184,7 +184,7 @@ lazy_static! {
184184

185185
fn reader(cmd: &str,
186186
rx_cmd: Receiver<bool>,
187-
tx_sender: &Sender<(Event, EventArg)>,
187+
tx_sender: &EventSender,
188188
option: Arc<RwLock<ReaderOption>>,
189189
source_file: Option<File>) {
190190

@@ -210,13 +210,15 @@ fn reader(cmd: &str,
210210
break;
211211
}
212212

213-
if rx_control.recv_timeout(Duration::from_millis(10)).is_ok() {
213+
if rx_control.try_recv().is_ok() {
214214
command.map(|mut x| {
215215
let _ = x.kill();
216216
let _ = x.wait();
217217
});
218218
break;
219219
}
220+
221+
thread::sleep(Duration::from_millis(5));
220222
}
221223
});
222224

src/sender.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
use std::sync::mpsc::{Receiver, SyncSender};
1+
use std::sync::mpsc::SyncSender;
22
use item::ItemGroup;
3-
use event::{Event, EventArg};
3+
use event::{Event, EventArg, EventReceiver};
44
use std::thread;
55
use std::time::Duration;
66

77
// sender is a cache of reader
88
pub struct CachedSender {
99
items: Vec<ItemGroup>, // cache
10-
rx_sender: Receiver<(Event, EventArg)>,
10+
rx_sender: EventReceiver,
1111
tx_item: SyncSender<(Event, EventArg)>,
1212
}
1313

1414
impl CachedSender {
15-
pub fn new(rx_sender: Receiver<(Event, EventArg)>,
15+
pub fn new(rx_sender: EventReceiver,
1616
tx_item: SyncSender<(Event, EventArg)>) -> Self {
1717
CachedSender{
1818
items: Vec::new(),
@@ -32,7 +32,7 @@ impl CachedSender {
3232

3333
loop {
3434
// try to read a bunch of items first
35-
if let Ok((ev, arg)) = self.rx_sender.recv_timeout(Duration::from_millis(10)) {
35+
if let Ok((ev, arg)) = self.rx_sender.try_recv() {
3636
match ev {
3737
Event::EvReaderStarted => {
3838
reader_stopped = false;
@@ -81,7 +81,7 @@ impl CachedSender {
8181
am_i_runing = false;
8282
}
8383
} else {
84-
thread::sleep(Duration::from_millis(3));
84+
thread::sleep(Duration::from_millis(10));
8585
}
8686
}
8787
}

0 commit comments

Comments
 (0)