Download raw body.
tog doesn't want you to quit right away
Christian Weisgerber <naddy@mips.inka.de> wrote: > Go into a preferably large work tree (like OpenBSD src), start tog, > and try to quit immediately. tog will take some time before it > exits. The effect is more pronounced the larger the work tree and > the slower the machine. > > Interestingly you can interact with tog right away and it is > responsive, but quitting it just takes time. > > I think this has been happening since the worktree diff feature was > added. It also doesn't happen when you start tog inside a repository, > which jibes. Thanks, naddy! Does the below diff improve this lag-time for you? I've only been able to test on a relatively fast machine where the improvement is still quite noticeable in src.git, but I don't have immediate access to a slower machine for further testing. commit 0991f61b344c8d3a5c5df3b3d93723b03f923dad (main) from: Mark Jamsek <mark@jamsek.dev> date: Wed Jan 8 06:58:38 2025 UTC tog: pass user quit state to worktree state cancel callback Reported by naddy: the main thread has to wait for the log thread to fetch work tree state before acting on the user's quit input, which produces a noticeable lag between entering 'q' and tog actually terminating. Pass the quit flag to the cancel callback so we can act on it sooner. M tog/tog.c | 16+ 8- 1 file changed, 16 insertions(+), 8 deletions(-) commit - 7f59939ae67ad8168afa53ad5c1fa4f830269290 commit + 0991f61b344c8d3a5c5df3b3d93723b03f923dad blob - da3af395b2dbac57ee04e516108f32c3ee9ba1cd blob + 0ccc6a0f788f55d0c7f1bd60778f977402cfd4d8 --- tog/tog.c +++ tog/tog.c @@ -3140,7 +3140,15 @@ push_worktree_entry(struct tog_log_thread_args *ta, in static const struct got_error * check_cancelled(void *arg) { - if (tog_sigint_received || tog_sigpipe_received) + int rc, quit = 0; + + if ((rc = pthread_mutex_lock(&tog_mutex)) != 0) + return got_error_set_errno(rc, "pthread_mutex_lock"); + if (tog_sigint_received || tog_sigpipe_received || *((int *)arg)) + quit = 1; + if ((rc = pthread_mutex_unlock(&tog_mutex)) != 0) + return got_error_set_errno(rc, "pthread_mutex_unlock"); + if (quit) return got_error(GOT_ERR_CANCELLED); return NULL; } @@ -3212,12 +3220,9 @@ tog_worktree_status(struct tog_log_thread_args *ta) goto done; err = got_worktree_status(wt, &paths, ta->repo, 0, - check_local_changes, &wt_state, check_cancelled, NULL); - if (err != NULL) { - if (err->code != GOT_ERR_CANCELLED) - goto done; - err = NULL; - } + check_local_changes, &wt_state, check_cancelled, ta->quit); + if (err != NULL) + goto done; if (wt_state != 0) { err = get_author(&wctx->wt_author, ta->repo, wt); @@ -4049,8 +4054,11 @@ log_thread(void *arg) goto done; } err = tog_worktree_status(a); - if (err != NULL) + if (err != NULL) { + if (err->code == GOT_ERR_CANCELLED) + err = NULL; goto done; + } errcode = pthread_mutex_lock(&tog_mutex); if (errcode) { err = got_error_set_errno(errcode, -- Mark Jamsek <https://bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
tog doesn't want you to quit right away