From ff77c7a52d78a487ea7775515aab4db399371075 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Mon, 19 Feb 2024 21:26:11 +0100 Subject: ipc: fix deadlock when aerc is not running Defer the execution of failed IPC commands *after* the IPC socket has been unblocked. Fixes: fd4dd4240885 ("ipc: wait for app to be ready before accepting commands") Fixes: https://todo.sr.ht/~rjarry/aerc/229 Changelog-fixed: Deadlock when running `aerc mailto:foo@bar.com` without another instance of aerc already running. Reported-by: Skejg Signed-off-by: Robin Jarry Reviewed-by: Tim Culverhouse --- main.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 4cc8d203..85538311 100644 --- a/main.go +++ b/main.go @@ -164,7 +164,6 @@ func main() { if err == nil { return // other aerc instance takes over } - fmt.Fprintf(os.Stderr, "Failed to communicate to aerc: %v\n", err) // continue with setting up a new aerc instance and retry after init retryExec = true } @@ -211,7 +210,11 @@ func main() { // set the aerc version so that we can use it in the template funcs templates.SetVersion(Version) - if retryExec { + enableIpc := func() { + startupDone() + if !retryExec { + return + } // retry execution err := ipc.ConnectAndExec(opts.Command) if err != nil { @@ -220,7 +223,7 @@ func main() { if err != nil { log.Warnf("failed to close backends: %v", err) } - return + os.Exit(1) } } @@ -253,7 +256,7 @@ loop: // it will be ready. And in some cases, it may never be. // At least, we can be confident that accepting IPC // commands will not crash the whole process. - once.Do(startupDone) + once.Do(enableIpc) case callback := <-ui.Callbacks: callback() case <-ui.Redraw: -- cgit