From: Christian Weisgerber Subject: Re: tog: pthread_cond_destroy: Invalid argument To: gameoftrees@openbsd.org Date: Thu, 12 Nov 2020 17:03:09 +0100 Christian Weisgerber: > stop_log_thread() is called again from close_log_view(), which in > turn is called when the old view is replaced with the new view. > Backspace, ^L, 'B' all suffer from this problem in the log view. Call pthread_cond_destroy(cond) exactly once when closing a view. This moves the pthread_cond_destroy(need_commits) from stop_log_thread(), which can be called twice, to close_log_view(), which is called once. It also destroys the commit_loaded condition variable, which is created in open_log_view() but was never destroyed. This fixes the abort on FreeBSD. Comments? diff c9d2b2638181862042c8d712cf7bf4977fea15e2 /home/naddy/got blob - 7b48924a0835e067b5b49dc74d78a60a76d928d4 file + tog/tog.c --- tog/tog.c +++ tog/tog.c @@ -2032,10 +2032,6 @@ stop_log_thread(struct tog_log_view_state *s) s->thread = NULL; } - errcode = pthread_cond_destroy(&s->thread_args.need_commits); - if (errcode && err == NULL) - err = got_error_set_errno(errcode, "pthread_cond_destroy"); - if (s->thread_args.repo) { got_repo_close(s->thread_args.repo); s->thread_args.repo = NULL; @@ -2054,8 +2050,18 @@ close_log_view(struct tog_view *view) { const struct got_error *err = NULL; struct tog_log_view_state *s = &view->state.log; + int errcode; err = stop_log_thread(s); + + errcode = pthread_cond_destroy(&s->thread_args.need_commits); + 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; -- Christian "naddy" Weisgerber naddy@mips.inka.de