Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix lost cached events
Browse files Browse the repository at this point in the history
liuchengxu committed Dec 27, 2024
1 parent f6807c4 commit ad5fc0d
Showing 3 changed files with 24 additions and 9 deletions.
4 changes: 2 additions & 2 deletions crates/maple_core/src/stdio_server/diagnostics_worker.rs
Original file line number Diff line number Diff line change
@@ -168,12 +168,12 @@ fn update_buffer_diagnostics(
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
.is_ok();

tracing::debug!(
tracing::trace!(
?bufnr,
?is_first_result,
"[update_buffer_diagnostics] buffer_diagnostics: {buffer_diagnostics:?}"
);
tracing::debug!(
tracing::trace!(
?bufnr,
"[update_buffer_diagnostics] new_diagnostics: {new_diagnostics:?}"
);
Original file line number Diff line number Diff line change
@@ -561,7 +561,7 @@ impl<'a> CachedPreviewImpl<'a> {
column_range: Option<Range<usize>>,
container_width: usize,
) -> Preview {
tracing::debug!(path = ?path.display(), "Previewing file at line {lnum}");
tracing::debug!(path = %path.display(), "Previewing file at line {lnum}");

match detect_file_class(path) {
Ok(FileClass::NotRegularFile) => {
27 changes: 21 additions & 6 deletions crates/maple_core/src/stdio_server/service.rs
Original file line number Diff line number Diff line change
@@ -61,6 +61,22 @@ pub struct ProviderSession {
is_busy: Arc<AtomicBool>,
}

struct CachedEvents(VecDeque<ProviderEvent>);

impl CachedEvents {
/// Track the event if it does not exist in the cache yet.
fn push(&mut self, event: ProviderEvent) {
if self.0.iter().any(|e| event.is_same_type(e)) {
return;
}
self.0.push_back(event);
}

fn pop(&mut self) -> Option<ProviderEvent> {
self.0.pop_front()
}
}

impl ProviderSession {
pub fn new(
ctx: Context,
@@ -86,7 +102,7 @@ impl ProviderSession {
let mut on_move_timer = DebounceTimer::new(Duration::from_millis(200));
let mut on_typed_timer = DebounceTimer::new(Duration::from_millis(debounce_delay));

let mut event_cache = VecDeque::with_capacity(2);
let mut cached_events = CachedEvents(VecDeque::with_capacity(2));

let mut tick_timeout = {
let mut interval = tokio::time::interval(Duration::from_millis(100));
@@ -116,21 +132,20 @@ impl ProviderSession {
// Send event after debounce period if the provider is not overloaded.
if should_emit {
if provider_is_busy.load(Ordering::SeqCst) {
if event_cache.iter().any(|e| event.is_same_type(e)) {
continue;
}
event_cache.push_back(event);
cached_events.push(event);
} else if debounced_provider_event_sender.send(event).is_err() {
return;
}
} else {
cached_events.push(event);
}
}
_ = tick_timeout.tick() => {
if debounced_provider_event_sender.is_closed() {
return;
}

if let Some(event) = event_cache.pop_front() {
if let Some(event) = cached_events.pop() {
if debounced_provider_event_sender.send(event).is_err() {
return;
}

0 comments on commit ad5fc0d

Please sign in to comment.