diff --git a/src/lib/fcitx/instance.cpp b/src/lib/fcitx/instance.cpp index f0eaca1b..271e20a1 100644 --- a/src/lib/fcitx/instance.cpp +++ b/src/lib/fcitx/instance.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -22,6 +24,7 @@ #include "fcitx-utils/eventdispatcher.h" #include "fcitx-utils/i18n.h" #include "fcitx-utils/log.h" +#include "fcitx-utils/macros.h" #include "fcitx-utils/misc.h" #include "fcitx-utils/standardpath.h" #include "fcitx-utils/stringutils.h" @@ -1361,6 +1364,9 @@ void Instance::handleSignal() { exit(); } else if (signo == SIGUSR1) { reloadConfig(); + } else if (signo == SIGCHLD) { + d->zombieReaper_->setNextInterval(2000000); + d->zombieReaper_->setOneShot(); } } } @@ -1411,6 +1417,15 @@ void Instance::initialize() { } return false; }); + d->zombieReaper_ = d->eventLoop_.addTimeEvent( + CLOCK_MONOTONIC, now(CLOCK_MONOTONIC), 0, + [](EventSourceTime *, uint64_t) { + pid_t res; + while ((res = waitpid(-1, nullptr, WNOHANG)) > 0) { + } + return false; + }); + d->zombieReaper_->setEnabled(false); d->exitEvent_ = d->eventLoop_.addExitEvent([this](EventSource *) { FCITX_DEBUG() << "Running save..."; diff --git a/src/lib/fcitx/instance_p.h b/src/lib/fcitx/instance_p.h index f27c2c91..4676d89a 100644 --- a/src/lib/fcitx/instance_p.h +++ b/src/lib/fcitx/instance_p.h @@ -165,6 +165,7 @@ class InstancePrivate : public QPtrHolder { EventDispatcher eventDispatcher_; std::unique_ptr signalPipeEvent_; std::unique_ptr preloadInputMethodEvent_; + std::unique_ptr zombieReaper_; std::unique_ptr exitEvent_; InputContextManager icManager_; AddonManager addonManager_; diff --git a/src/server/errorhandler.cpp b/src/server/errorhandler.cpp index c0a9ac79..9550e1ad 100644 --- a/src/server/errorhandler.cpp +++ b/src/server/errorhandler.cpp @@ -11,8 +11,11 @@ #include #include #include +#include #include #include +#include +#include #include "fcitx-utils/fs.h" #include "errorhandler.h" @@ -31,12 +34,12 @@ extern int selfpipe[2]; extern std::string crashlog; -typedef struct _MinimalBuffer { +struct MinimalBuffer { char buffer[MINIMAL_BUFFER_SIZE]; int offset; -} MinimalBuffer; +}; -void SetMyExceptionHandler(void) { +void SetMyExceptionHandler() { int signo; for (signo = SIGHUP; signo < SIGUNUSED; signo++) { @@ -111,6 +114,9 @@ static inline void _write_buffer(int fd, const MinimalBuffer *buffer) { void OnException(int signo) { if (signo == SIGCHLD) { + uint8_t sig = (signo & 0xff); + fcitx::fs::safeWrite(selfpipe[1], &sig, 1); + signal(signo, OnException); return; } diff --git a/src/server/main.cpp b/src/server/main.cpp index 0f1e67f4..3e95c8c2 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -7,13 +7,21 @@ #include #include +#include +#include #include #include +#include +#include +#include #include "fcitx-utils/fs.h" +#include "fcitx-utils/log.h" #include "fcitx-utils/misc.h" #include "fcitx-utils/misc_p.h" #include "fcitx-utils/standardpath.h" +#include "fcitx-utils/stringutils.h" #include "fcitx/addonfactory.h" +#include "fcitx/addonloader.h" #include "fcitx/addonmanager.h" #include "fcitx/instance.h" #include "errorhandler.h" @@ -78,7 +86,7 @@ int main(int argc, char *argv[]) { canRestart = instance.canRestart(); } catch (const InstanceQuietQuit &) { } catch (const std::exception &e) { - std::cerr << "Received exception: " << e.what() << std::endl; + std::cerr << "Received exception: " << e.what() << '\n'; return 1; } diff --git a/src/ui/classic/plasmathemewatchdog.cpp b/src/ui/classic/plasmathemewatchdog.cpp index 0ac7ca8e..e244dd63 100644 --- a/src/ui/classic/plasmathemewatchdog.cpp +++ b/src/ui/classic/plasmathemewatchdog.cpp @@ -5,12 +5,23 @@ * */ #include "plasmathemewatchdog.h" +#include +#include #include #include +#include +#include +#include +#include +#include #include +#include +#include +#include #include "fcitx-utils/event.h" -#include "fcitx-utils/misc_p.h" +#include "fcitx-utils/fs.h" #include "fcitx-utils/standardpath.h" +#include "fcitx-utils/unixfd.h" #include "common.h" #if defined(__FreeBSD__) diff --git a/src/ui/classic/plasmathemewatchdog.h b/src/ui/classic/plasmathemewatchdog.h index 30f92836..64e4e0be 100644 --- a/src/ui/classic/plasmathemewatchdog.h +++ b/src/ui/classic/plasmathemewatchdog.h @@ -7,7 +7,10 @@ #ifndef _FCITX5_UI_CLASSIC_PLASMATHEMEWATCHDOG_H_ #define _FCITX5_UI_CLASSIC_PLASMATHEMEWATCHDOG_H_ +#include +#include #include +#include #include "fcitx-utils/event.h" #include "fcitx-utils/unixfd.h"