"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: tog: todo item #2 respond to key presses while "loading..."
To:
Mark Jamsek <mark@jamsek.com>, Game of Trees <gameoftrees@openbsd.org>
Date:
Sat, 13 Aug 2022 11:39:17 +0200

Download raw body.

Thread
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: