term: asynchronous client application termination

When the foot window is closed, and we need to terminate the client application,
do this in an asynchronous fashion:

* Don’t do a blocking call to waitpid(), instead, rely on the reaper callback
* Use a timer FD to implement the timeout before sending SIGKILL (instead of
  using SIGALRM).
* Send SIGTERM immediately (we used to *just* close the PTY, and then wait 2
  seconds before sending SIGTERM).
* Raise the timeout from 2 seconds to 60

Full shutdown now depends on *two* asynchronous tasks - unmapping the window,
and waiting for the client application to terminate.

Only when *both* of these have completed do we proceed and call term_destroy(),
and the user provided shutdown callback.
This commit is contained in:
Daniel Eklöf 2021-07-31 18:18:48 +02:00
parent 35041cd431
commit 384b1c330f
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 170 additions and 43 deletions

View file

@ -3640,7 +3640,7 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data)
tll_foreach(renderer->wayl->terms, it) {
struct terminal *term = it->item;
if (unlikely(!term->window->is_configured))
if (unlikely(term->is_shutting_down || !term->window->is_configured))
continue;
bool grid = term->render.refresh.grid;