Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Hostetler <jeffhost@microsoft.com>2022-05-27 00:47:08 +0300
committerJunio C Hamano <gitster@pobox.com>2022-05-27 01:59:26 +0300
commit802aa31840bd2080f668d0efbaeea2021f4e2488 (patch)
tree7e83f8dad6dd01c2bb44bcfb5bf1c0f93b5bd5ad /builtin/fsmonitor--daemon.c
parent39664e93093bd9545ad4085523b122196c449508 (diff)
fsmonitor--daemon: prepare for adding health thread
Refactor daemon thread startup to make it easier to start a third thread class to monitor the health of the daemon. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/fsmonitor--daemon.c')
-rw-r--r--builtin/fsmonitor--daemon.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c
index db297649da..90fa9d09ef 100644
--- a/builtin/fsmonitor--daemon.c
+++ b/builtin/fsmonitor--daemon.c
@@ -1174,6 +1174,8 @@ static int fsmonitor_run_daemon_1(struct fsmonitor_daemon_state *state)
*/
.uds_disallow_chdir = 0
};
+ int listener_started = 0;
+ int err = 0;
/*
* Start the IPC thread pool before the we've started the file
@@ -1194,15 +1196,20 @@ static int fsmonitor_run_daemon_1(struct fsmonitor_daemon_state *state)
if (pthread_create(&state->listener_thread, NULL,
fsm_listen__thread_proc, state) < 0) {
ipc_server_stop_async(state->ipc_server_data);
- ipc_server_await(state->ipc_server_data);
-
- return error(_("could not start fsmonitor listener thread"));
+ err = error(_("could not start fsmonitor listener thread"));
+ goto cleanup;
}
+ listener_started = 1;
/*
* The daemon is now fully functional in background threads.
+ * Our primary thread should now just wait while the threads
+ * do all the work.
+ */
+cleanup:
+ /*
* Wait for the IPC thread pool to shutdown (whether by client
- * request or from filesystem activity).
+ * request, from filesystem activity, or an error).
*/
ipc_server_await(state->ipc_server_data);
@@ -1211,10 +1218,16 @@ static int fsmonitor_run_daemon_1(struct fsmonitor_daemon_state *state)
* event from the IPC thread pool, but it doesn't hurt to tell
* it again. And wait for it to shutdown.
*/
- fsm_listen__stop_async(state);
- pthread_join(state->listener_thread, NULL);
+ if (listener_started) {
+ fsm_listen__stop_async(state);
+ pthread_join(state->listener_thread, NULL);
+ }
- return state->error_code;
+ if (err)
+ return err;
+ if (state->error_code)
+ return state->error_code;
+ return 0;
}
static int fsmonitor_run_daemon(void)