diff options
| author | Taylor Blau <me@ttaylorr.com> | 2024-10-15 16:56:43 -0400 |
|---|---|---|
| committer | Taylor Blau <me@ttaylorr.com> | 2024-10-15 16:56:43 -0400 |
| commit | b43e23fa02427067ceb605a5dd5ea602de4c6ac5 (patch) | |
| tree | f3807a33e9cd06c829fdb1262a52eeb594f81920 /compat/fsmonitor | |
| parent | fd98f659fda5a7704b10033f2b2efdae2b0a58e6 (diff) | |
| parent | 51907f8feeae9ae4af1722e973f44ff10aa168dc (diff) | |
| download | git-b43e23fa02427067ceb605a5dd5ea602de4c6ac5.tar.xz | |
Merge branch 'jk/fsmonitor-event-listener-race-fix'
On macOS, fsmonitor can fall into a race condition that results in
a client waiting forever to be notified for an event that have
already happened. This problem has been corrected.
* jk/fsmonitor-event-listener-race-fix:
fsmonitor: initialize fs event listener before accepting clients
simple-ipc: split async server initialization and running
Diffstat (limited to 'compat/fsmonitor')
| -rw-r--r-- | compat/fsmonitor/fsm-listen-darwin.c | 6 | ||||
| -rw-r--r-- | compat/fsmonitor/fsm-listen-win32.c | 6 |
2 files changed, 12 insertions, 0 deletions
diff --git a/compat/fsmonitor/fsm-listen-darwin.c b/compat/fsmonitor/fsm-listen-darwin.c index 2fc67442eb..dfa551459d 100644 --- a/compat/fsmonitor/fsm-listen-darwin.c +++ b/compat/fsmonitor/fsm-listen-darwin.c @@ -516,6 +516,12 @@ void fsm_listen__loop(struct fsmonitor_daemon_state *state) } data->stream_started = 1; + /* + * Our fs event listener is now running, so it's safe to start + * serving client requests. + */ + ipc_server_start_async(state->ipc_server_data); + pthread_mutex_lock(&data->dq_lock); pthread_cond_wait(&data->dq_finished, &data->dq_lock); pthread_mutex_unlock(&data->dq_lock); diff --git a/compat/fsmonitor/fsm-listen-win32.c b/compat/fsmonitor/fsm-listen-win32.c index 5a21dade7b..80e092b511 100644 --- a/compat/fsmonitor/fsm-listen-win32.c +++ b/compat/fsmonitor/fsm-listen-win32.c @@ -741,6 +741,12 @@ void fsm_listen__loop(struct fsmonitor_daemon_state *state) start_rdcw_watch(data->watch_gitdir) == -1) goto force_error_stop; + /* + * Now that we've established the rdcw watches, we can start + * serving clients. + */ + ipc_server_start_async(state->ipc_server_data); + for (;;) { dwWait = WaitForMultipleObjects(data->nr_listener_handles, data->hListener, |
