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

@ -595,6 +595,7 @@ struct terminal {
bool is_shutting_down;
bool slave_has_been_reaped;
int slave_terminate_timeout_fd;
int exit_status;
void (*shutdown_cb)(void *data, int exit_code);
void *shutdown_data;