]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor--daemon: prepare for adding health thread
authorJeff Hostetler <jeffhost@microsoft.com>
Thu, 26 May 2022 21:47:08 +0000 (21:47 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 May 2022 22:59:26 +0000 (15:59 -0700)
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>
builtin/fsmonitor--daemon.c

index db297649daff38c7b02f3d80833a6dc0325d94c0..90fa9d09efba430810a4a94633c12c053832befc 100644 (file)
@@ -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)