From 3cafbf7f1ad5c4eb0f526238e71468eda4c617cb Mon Sep 17 00:00:00 2001 From: Kenneth Loeffler Date: Tue, 26 Sep 2023 15:41:33 -0700 Subject: [PATCH] Use PollWatcher in memofs StdBackend on macOS (#783) --- CHANGELOG.md | 2 ++ crates/memofs/CHANGELOG.md | 3 ++- crates/memofs/src/std_backend.rs | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc90f866a..475adf570 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -116,6 +116,7 @@ * Add buttons for navigation on the Connected page ([#722]) ### Fixes +* Significantly improved performance of `rojo serve` and `rojo build` on macOS. [#783] * Significantly improved performance of `rojo sourcemap` ([#668]) * Fixed the diff visualizer of connected sessions. ([#674]) * Fixed disconnected session activity. ([#675]) @@ -149,6 +150,7 @@ [#770]: https://github.com/rojo-rbx/rojo/pull/770 [#771]: https://github.com/rojo-rbx/rojo/pull/771 [#774]: https://github.com/rojo-rbx/rojo/pull/774 +[#783]: https://github.com/rojo-rbx/rojo/pull/783 [rbx-dom#299]: https://github.com/rojo-rbx/rbx-dom/pull/299 [rbx-dom#296]: https://github.com/rojo-rbx/rbx-dom/pull/296 diff --git a/crates/memofs/CHANGELOG.md b/crates/memofs/CHANGELOG.md index b49b2f0f9..43516260b 100644 --- a/crates/memofs/CHANGELOG.md +++ b/crates/memofs/CHANGELOG.md @@ -1,6 +1,7 @@ # memofs Changelog ## Unreleased Changes +* Changed the `StdBackend` file watcher to use `PollWatcher` on macOS. ## 0.2.0 (2021-08-23) * Updated to `crossbeam-channel` 0.5.1. @@ -15,4 +16,4 @@ * Improved error messages using the [fs-err](https://crates.io/crates/fs-err) crate. ## 0.1.0 (2020-03-10) -* Initial release \ No newline at end of file +* Initial release diff --git a/crates/memofs/src/std_backend.rs b/crates/memofs/src/std_backend.rs index c13ade0b0..01a554a51 100644 --- a/crates/memofs/src/std_backend.rs +++ b/crates/memofs/src/std_backend.rs @@ -5,19 +5,34 @@ use std::thread; use std::time::Duration; use crossbeam_channel::Receiver; -use notify::{watcher, DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher}; +use notify::{DebouncedEvent, RecursiveMode, Watcher}; + +#[cfg(target_os = "macos")] +use notify::PollWatcher; +#[cfg(not(target_os = "macos"))] +use notify::{watcher, RecommendedWatcher}; use crate::{DirEntry, Metadata, ReadDir, VfsBackend, VfsEvent}; /// `VfsBackend` that uses `std::fs` and the `notify` crate. pub struct StdBackend { + // We use PollWatcher on macos because using the KQueue watcher + // can cause some gnarly performance problems. + #[cfg(target_os = "macos")] + watcher: PollWatcher, + #[cfg(not(target_os = "macos"))] watcher: RecommendedWatcher, + watcher_receiver: Receiver, } impl StdBackend { pub fn new() -> StdBackend { let (notify_tx, notify_rx) = mpsc::channel(); + + #[cfg(target_os = "macos")] + let watcher = PollWatcher::new(notify_tx, Duration::from_millis(50)).unwrap(); + #[cfg(not(target_os = "macos"))] let watcher = watcher(notify_tx, Duration::from_millis(50)).unwrap(); let (tx, rx) = crossbeam_channel::unbounded();