Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions src/open_ocd_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,11 +186,14 @@ where
let output: ExitStatus;
let mut tmp_deque: VecDeque<LogType> = VecDeque::new();

loop {
if let Ok(mut deque) = mutex_messages.lock() {
tmp_deque = deque.clone();
deque.clear();
let drain = |tmp_deque: &mut VecDeque<LogType>, mutex: &Arc<Mutex<VecDeque<LogType>>>| {
if let Ok(mut deque) = mutex.lock() {
tmp_deque.extend(deque.drain(..));
}
};

loop {
drain(&mut tmp_deque, &mutex_messages);

while let Some(msg) = tmp_deque.pop_front() {
if let Some(ref mut s) = sender {
Expand All @@ -204,6 +207,20 @@ where
output = status;
let _ = thread_stdout.join();
let _ = thread_stderr.join();

// Final drain: the reader threads may have pushed lines after the
// last in-loop drain and before they finished. Without this pass,
// the very last OpenOCD output (often the diagnostic on failure)
// would be silently dropped.
drain(&mut tmp_deque, &mutex_messages);
while let Some(msg) = tmp_deque.pop_front() {
if let Some(ref mut s) = sender {
let _ = s.send(MSG::log(msg)).await;
} else {
logs.push(msg);
}
}

break;
}

Expand Down
Loading