mirror of
https://github.com/neovim/neovim.git
synced 2025-09-08 20:38:18 +00:00
preserve_exit: Ignore SIGHUP
closes #9274 ref #9028 If stdin closed then read_error_exit calls preserve_exit. Handling SIGHUP during preserve_exit would cause a premature teardown, and conflicts with e.g. ui_bridge_stop which waits for TUI to teardown. Vim ignores SIGHUP in its prepare_to_exit and getout_preserve_modified routines: /* Ignore SIGHUP, because a dropped connection causes a read error, which * makes Vim exit and then handling SIGHUP causes various reentrance * problems. */ signal(SIGHUP, SIG_IGN);
This commit is contained in:
@@ -52,6 +52,7 @@
|
|||||||
#include "nvim/window.h"
|
#include "nvim/window.h"
|
||||||
#include "nvim/os/os.h"
|
#include "nvim/os/os.h"
|
||||||
#include "nvim/os/shell.h"
|
#include "nvim/os/shell.h"
|
||||||
|
#include "nvim/os/signal.h"
|
||||||
#include "nvim/os/input.h"
|
#include "nvim/os/input.h"
|
||||||
#include "nvim/os/time.h"
|
#include "nvim/os/time.h"
|
||||||
#include "nvim/event/stream.h"
|
#include "nvim/event/stream.h"
|
||||||
@@ -2653,6 +2654,8 @@ void preserve_exit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
really_exiting = true;
|
really_exiting = true;
|
||||||
|
// Ignore SIGHUP while we are already exiting. #9274
|
||||||
|
signal_reject_deadly();
|
||||||
mch_errmsg(IObuff);
|
mch_errmsg(IObuff);
|
||||||
mch_errmsg("\n");
|
mch_errmsg("\n");
|
||||||
ui_flush();
|
ui_flush();
|
||||||
|
@@ -117,6 +117,7 @@ static void ui_bridge_stop(UI *b)
|
|||||||
if (stopped) { // -V547
|
if (stopped) { // -V547
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// TODO(justinmk): Remove this. Use a cond-wait above. #9274
|
||||||
loop_poll_events(&main_loop, 10); // Process one event.
|
loop_poll_events(&main_loop, 10); // Process one event.
|
||||||
}
|
}
|
||||||
uv_thread_join(&bridge->ui_thread);
|
uv_thread_join(&bridge->ui_thread);
|
||||||
|
@@ -6,6 +6,7 @@ local clear, command, nvim, nvim_dir =
|
|||||||
local eval, eq, retry =
|
local eval, eq, retry =
|
||||||
helpers.eval, helpers.eq, helpers.retry
|
helpers.eval, helpers.eq, helpers.retry
|
||||||
local ok = helpers.ok
|
local ok = helpers.ok
|
||||||
|
local feed = helpers.feed
|
||||||
local iswin = helpers.iswin
|
local iswin = helpers.iswin
|
||||||
|
|
||||||
|
|
||||||
@@ -87,5 +88,6 @@ describe('TermClose event', function()
|
|||||||
|
|
||||||
command('3bdelete!')
|
command('3bdelete!')
|
||||||
retry(nil, nil, function() eq('3', eval('g:abuf')) end)
|
retry(nil, nil, function() eq('3', eval('g:abuf')) end)
|
||||||
|
feed('<c-c>:qa!<cr>')
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user