Commit 89f8122
committed
fix(watcher): serialize watch and close on the native watcher
`NativeWatcher::watch` spawns a detached task that drives the FSEvents backend's
`append_path` (mutating the watcher's CFMutableArray), while `NativeWatcher::close`
drops the watcher (`CFRelease` of that array). Nothing kept the two apart, so the
close-old-then-watch-new restart flow could free the CFArray while a watch task was
still appending to it — a use-after-free that aborts the process on macOS.
Guard every access to the watcher with an async mutex: a watch task acquires it
before touching the watcher and holds it for the whole `watch()`, and `close`
aborts the in-flight task and then acquires the same mutex before tearing the
watcher down. A future can only be cancelled at an `.await`, never mid-FFI, so an
aborted task always releases the guard with the watcher in a consistent state, and
holding the mutex in `close` proves no task is inside `append_path`.
Adds `rspack_napi::runtime::spawn_handle` to retain the JoinHandle needed to abort.1 parent cd0781d commit 89f8122
3 files changed
Lines changed: 28 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
117 | 117 | | |
118 | 118 | | |
119 | 119 | | |
120 | | - | |
| 120 | + | |
121 | 121 | | |
122 | 122 | | |
123 | 123 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
| |||
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
| 63 | + | |
| 64 | + | |
62 | 65 | | |
63 | 66 | | |
64 | 67 | | |
| |||
81 | 84 | | |
82 | 85 | | |
83 | 86 | | |
| 87 | + | |
| 88 | + | |
84 | 89 | | |
85 | 90 | | |
86 | 91 | | |
| |||
110 | 115 | | |
111 | 116 | | |
112 | 117 | | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
113 | 124 | | |
114 | | - | |
| 125 | + | |
| 126 | + | |
115 | 127 | | |
116 | 128 | | |
117 | 129 | | |
| |||
123 | 135 | | |
124 | 136 | | |
125 | 137 | | |
126 | | - | |
| 138 | + | |
127 | 139 | | |
128 | 140 | | |
| 141 | + | |
129 | 142 | | |
130 | 143 | | |
131 | 144 | | |
| |||
160 | 173 | | |
161 | 174 | | |
162 | 175 | | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
163 | 180 | | |
164 | 181 | | |
165 | 182 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
41 | 49 | | |
42 | 50 | | |
43 | 51 | | |
| |||
0 commit comments