Merge bitcoin/bitcoin#34224: init: Return EXIT_SUCCESS on interrupt

997e7b4d7c init: Fix non-zero code on interrupt (sedited)

Pull request description:

  Reported by dergoegge on irc.

  An interrupt does not create a failure exit code during normal operation. This should also be the case when interrupt is triggered during initialization. However a failure exit code is currently returned if an interrupt occurs during init. Fix this by making `AppInitMain` return true instead of false on interrupt, which further up the call stack currently sets the `EXIT_FAILURE` code. Also add a check for the interrupt condition during GUI startup. Returning `EXIT_SUCCESS` seems to be the usual behaviour for daemons, see the discussion on IRC for this: https://www.erisian.com.au/bitcoin-core-dev/log-2026-01-08.html#l-146 .

  Best reviewed with `--color-moved=dimmed-zebra --color-moved-ws=ignore-all-space`.

ACKs for top commit:
  maflcko:
    review ACK 997e7b4d7c 🔺
  janb84:
    ACK 997e7b4d7c
  dergoegge:
    utACK 997e7b4d7c

Tree-SHA512: c9542e95d9312567e029426a329144b5bc638d8ebc9c966e0246c1bb728d40f56ca425b00c446f5d238067e629c2337d0fe78bcc5a8760424d2ec38a5578e115
This commit is contained in:
merge-script
2026-01-13 15:23:12 -08:00
2 changed files with 41 additions and 40 deletions

View File

@@ -1842,7 +1842,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// requested to kill the GUI during the last operation. If so, exit.
if (ShutdownRequested(node)) {
LogInfo("Shutdown requested. Exiting.");
return false;
return true;
}
ChainstateManager& chainman = *Assert(node.chainman);
@@ -2018,7 +2018,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
if (ShutdownRequested(node)) {
return false;
return true;
}
// ********************************************************* Step 12: start node

View File

@@ -380,53 +380,54 @@ void BitcoinApplication::initializeResult(bool success, interfaces::BlockAndHead
{
qDebug() << __func__ << ": Initialization result: " << success;
if (success) {
delete m_splash;
m_splash = nullptr;
if (!success || m_node->shutdownRequested()) {
requestShutdown();
return;
}
// Log this only after AppInitMain finishes, as then logging setup is guaranteed complete
qInfo() << "Platform customization:" << platformStyle->getName();
clientModel = new ClientModel(node(), optionsModel);
window->setClientModel(clientModel, &tip_info);
delete m_splash;
m_splash = nullptr;
// If '-min' option passed, start window minimized (iconified) or minimized to tray
bool start_minimized = gArgs.GetBoolArg("-min", false);
// Log this only after AppInitMain finishes, as then logging setup is guaranteed complete
qInfo() << "Platform customization:" << platformStyle->getName();
clientModel = new ClientModel(node(), optionsModel);
window->setClientModel(clientModel, &tip_info);
// If '-min' option passed, start window minimized (iconified) or minimized to tray
bool start_minimized = gArgs.GetBoolArg("-min", false);
#ifdef ENABLE_WALLET
if (WalletModel::isWalletEnabled()) {
m_wallet_controller = new WalletController(*clientModel, platformStyle, this);
window->setWalletController(m_wallet_controller, /*show_loading_minimized=*/start_minimized);
if (paymentServer) {
paymentServer->setOptionsModel(optionsModel);
}
if (WalletModel::isWalletEnabled()) {
m_wallet_controller = new WalletController(*clientModel, platformStyle, this);
window->setWalletController(m_wallet_controller, /*show_loading_minimized=*/start_minimized);
if (paymentServer) {
paymentServer->setOptionsModel(optionsModel);
}
}
#endif // ENABLE_WALLET
// Show or minimize window
if (!start_minimized) {
window->show();
} else if (clientModel->getOptionsModel()->getMinimizeToTray() && window->hasTrayIcon()) {
// do nothing as the window is managed by the tray icon
} else {
window->showMinimized();
}
Q_EMIT windowShown(window);
// Show or minimize window
if (!start_minimized) {
window->show();
} else if (clientModel->getOptionsModel()->getMinimizeToTray() && window->hasTrayIcon()) {
// do nothing as the window is managed by the tray icon
} else {
window->showMinimized();
}
Q_EMIT windowShown(window);
#ifdef ENABLE_WALLET
// Now that initialization/startup is done, process any command-line
// bitcoin: URIs or payment requests:
if (paymentServer) {
connect(paymentServer, &PaymentServer::receivedPaymentRequest, window, &BitcoinGUI::handlePaymentRequest);
connect(window, &BitcoinGUI::receivedURI, paymentServer, &PaymentServer::handleURIOrFile);
connect(paymentServer, &PaymentServer::message, [this](const QString& title, const QString& message, unsigned int style) {
window->message(title, message, style);
});
QTimer::singleShot(100ms, paymentServer, &PaymentServer::uiReady);
}
#endif
pollShutdownTimer->start(SHUTDOWN_POLLING_DELAY);
} else {
requestShutdown();
// Now that initialization/startup is done, process any command-line
// bitcoin: URIs or payment requests:
if (paymentServer) {
connect(paymentServer, &PaymentServer::receivedPaymentRequest, window, &BitcoinGUI::handlePaymentRequest);
connect(window, &BitcoinGUI::receivedURI, paymentServer, &PaymentServer::handleURIOrFile);
connect(paymentServer, &PaymentServer::message, [this](const QString& title, const QString& message, unsigned int style) {
window->message(title, message, style);
});
QTimer::singleShot(100ms, paymentServer, &PaymentServer::uiReady);
}
#endif
pollShutdownTimer->start(SHUTDOWN_POLLING_DELAY);
}
void BitcoinApplication::handleRunawayException(const QString &message)