From: Stefan Sperling Subject: Re: tog: todo item #2 respond to key presses while "loading..." To: Mark Jamsek , Game of Trees Date: Sat, 13 Aug 2022 11:39:17 +0200 On Fri, Aug 12, 2022 at 11:36:46PM +0200, Stefan Sperling wrote: > Here is a case where movement doesn't seem to work while loading: > > tog log path > > Where path is any file in a deep history that has seen few changes. > The top-level Makefile in OpenBSD src.git is one such file. This can be fixed by... well, simply not waiting for the log thread. In hindsight, the articicial blocking behaviour was probably a bad idea. If we remove related code, the tog log view remains responsive at all times. ok? diff /home/stsp/src/got commit - 11edf34c28f6c60a1d37d5c83c758e90df02fe7a path + /home/stsp/src/got blob - fa53f96cb444650badb64394f0e1af4d9ea769f7 file + tog/tog.c --- tog/tog.c +++ tog/tog.c @@ -340,7 +340,6 @@ static volatile sig_atomic_t tog_thread_error; struct tog_log_thread_args { pthread_cond_t need_commits; - pthread_cond_t commit_loaded; int commits_needed; int load_all; struct got_commit_graph *graph; @@ -2434,43 +2433,20 @@ log_scroll_up(struct tog_log_view_state *s, int maxscr } static const struct got_error * -trigger_log_thread(struct tog_view *view, int wait) +trigger_log_thread(struct tog_view *view) { struct tog_log_thread_args *ta = &view->state.log.thread_args; int errcode; halfdelay(1); /* fast refresh while loading commits */ - while (!ta->log_complete && !tog_thread_error && + if (!ta->log_complete && !tog_thread_error && (ta->commits_needed > 0 || ta->load_all)) { /* Wake the log thread. */ errcode = pthread_cond_signal(&ta->need_commits); if (errcode) return got_error_set_errno(errcode, "pthread_cond_signal"); - - /* - * The mutex will be released while the view loop waits - * in wgetch(), at which time the log thread will run. - */ - if (!wait) - break; - - /* Display progress update in log view. */ - show_log_view(view); - update_panels(); - doupdate(); - - /* Wait right here while next commit is being loaded. */ - errcode = pthread_cond_wait(&ta->commit_loaded, &tog_mutex); - if (errcode) - return got_error_set_errno(errcode, - "pthread_cond_wait"); - - /* Display progress update in log view. */ - show_log_view(view); - update_panels(); - doupdate(); } return NULL; @@ -2486,7 +2462,7 @@ request_log_commits(struct tog_view *view) return NULL; state->thread_args.commits_needed += view->nscrolled; - err = trigger_log_thread(view, 1); + err = trigger_log_thread(view); view->nscrolled = 0; return err; @@ -2511,7 +2487,7 @@ log_scroll_down(struct tog_view *view, int maxscroll) */ s->thread_args.commits_needed += ncommits_needed - s->commits.ncommits; - err = trigger_log_thread(view, 1); + err = trigger_log_thread(view); if (err) return err; } @@ -2766,14 +2742,6 @@ log_thread(void *arg) *a->selected_entry = *a->first_displayed_entry; } - errcode = pthread_cond_signal(&a->commit_loaded); - if (errcode) { - err = got_error_set_errno(errcode, - "pthread_cond_signal"); - pthread_mutex_unlock(&tog_mutex); - goto done; - } - if (done) a->commits_needed = 0; else { @@ -2798,7 +2766,6 @@ log_thread(void *arg) done: if (err) { tog_thread_error = 1; - pthread_cond_signal(&a->commit_loaded); } return (void *)err; } @@ -2863,10 +2830,6 @@ close_log_view(struct tog_view *view) if (errcode && err == NULL) err = got_error_set_errno(errcode, "pthread_cond_destroy"); - errcode = pthread_cond_destroy(&s->thread_args.commit_loaded); - if (errcode && err == NULL) - err = got_error_set_errno(errcode, "pthread_cond_destroy"); - free_commits(&s->commits); free(s->in_repo_path); s->in_repo_path = NULL; @@ -2963,7 +2926,7 @@ search_next_log_view(struct tog_view *view) * will resume at s->search_entry once we come back. */ s->thread_args.commits_needed++; - return trigger_log_thread(view, 0); + return trigger_log_thread(view); } err = match_commit(&have_match, entry->id, entry->commit, @@ -3091,11 +3054,6 @@ open_log_view(struct tog_view *view, struct got_object err = got_error_set_errno(errcode, "pthread_cond_init"); goto done; } - errcode = pthread_cond_init(&s->thread_args.commit_loaded, NULL); - if (errcode) { - err = got_error_set_errno(errcode, "pthread_cond_init"); - goto done; - } s->thread_args.commits_needed = view->nlines; s->thread_args.graph = thread_graph; @@ -3128,7 +3086,7 @@ show_log_view(struct tog_view *view) if (errcode) return got_error_set_errno(errcode, "pthread_create"); if (s->thread_args.commits_needed > 0) { - err = trigger_log_thread(view, 1); + err = trigger_log_thread(view); if (err) return err; } @@ -3384,7 +3342,7 @@ input_log_view(struct tog_view **new_view, struct tog_ view->count = 0; s->thread_args.load_all = 1; if (!s->thread_args.log_complete) - return trigger_log_thread(view, 0); + return trigger_log_thread(view); err = log_move_cursor_down(view, s->commits.ncommits); s->thread_args.load_all = 0; break; @@ -3409,7 +3367,7 @@ input_log_view(struct tog_view **new_view, struct tog_ !s->thread_args.log_complete) { s->thread_args.commits_needed += (view->nlines - 1) - s->commits.ncommits; - err = trigger_log_thread(view, 1); + err = trigger_log_thread(view); } break; case KEY_ENTER: