mirror of
https://github.com/znc/znc.git
synced 2026-08-08 01:43:03 +02:00
Revert "Revert "Fix delay between receiving signal in separate thread and handling it""
This reverts commit 615d936b6c.
I forgot the condition before...
This commit is contained in:
@@ -146,6 +146,12 @@ static void GenerateHelp(const char* appname) {
|
|||||||
class CSignalHandler {
|
class CSignalHandler {
|
||||||
public:
|
public:
|
||||||
CSignalHandler(CZNC* pZNC) {
|
CSignalHandler(CZNC* pZNC) {
|
||||||
|
if (pipe(m_iPipe)) {
|
||||||
|
DEBUG("Ouch, can't open pipe for signal handler: "
|
||||||
|
<< strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
pZNC->GetManager().MonitorFD(new CSignalHandlerMonitorFD(m_iPipe[0]));
|
||||||
sigset_t signals;
|
sigset_t signals;
|
||||||
sigfillset(&signals);
|
sigfillset(&signals);
|
||||||
pthread_sigmask(SIG_SETMASK, &signals, nullptr);
|
pthread_sigmask(SIG_SETMASK, &signals, nullptr);
|
||||||
@@ -157,6 +163,23 @@ class CSignalHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
class CSignalHandlerMonitorFD : public CSMonitorFD {
|
||||||
|
// This class just prevents the pipe buffer from filling by clearing it
|
||||||
|
public:
|
||||||
|
CSignalHandlerMonitorFD(int fd) { Add(fd, CSockManager::ECT_Read); }
|
||||||
|
|
||||||
|
bool FDsThatTriggered(
|
||||||
|
const std::map<int, short>& miiReadyFds) override {
|
||||||
|
for (const auto& it : miiReadyFds) {
|
||||||
|
if (it.second) {
|
||||||
|
int sig;
|
||||||
|
read(it.first, &sig, sizeof(sig));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void HandleSignals(CZNC* pZNC) {
|
void HandleSignals(CZNC* pZNC) {
|
||||||
sigset_t signals;
|
sigset_t signals;
|
||||||
sigemptyset(&signals);
|
sigemptyset(&signals);
|
||||||
@@ -176,6 +199,7 @@ class CSignalHandler {
|
|||||||
// Such cancel will be the only way to finish this thread.
|
// Such cancel will be the only way to finish this thread.
|
||||||
if (sigwait(&signals, &sig) == -1) continue;
|
if (sigwait(&signals, &sig) == -1) continue;
|
||||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr);
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr);
|
||||||
|
// TODO probably move switch() to CSignalHandlerMonitorFD?
|
||||||
switch (sig) {
|
switch (sig) {
|
||||||
case SIGHUP:
|
case SIGHUP:
|
||||||
pZNC->SetConfigState(CZNC::ECONFIG_NEED_REHASH);
|
pZNC->SetConfigState(CZNC::ECONFIG_NEED_REHASH);
|
||||||
@@ -199,10 +223,23 @@ class CSignalHandler {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// This write() must succeed because POSIX guarantees that writes of
|
||||||
|
// less than PIPE_BUF are atomic (and PIPE_BUF is at least 512).
|
||||||
|
size_t w = write(m_iPipe[1], &sig, sizeof(sig));
|
||||||
|
if (w != sizeof(sig)) {
|
||||||
|
DEBUG(
|
||||||
|
"Something bad happened during write() to a pipe for "
|
||||||
|
"signal handler, wrote "
|
||||||
|
<< w << " bytes: " << strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::thread m_thread;
|
std::thread m_thread;
|
||||||
|
|
||||||
|
// pipe for waking up the main thread
|
||||||
|
int m_iPipe[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool isRoot() {
|
static bool isRoot() {
|
||||||
|
|||||||
+2
-2
@@ -243,8 +243,8 @@ void CZNC::Loop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Csocket wants micro seconds
|
// Csocket wants micro seconds
|
||||||
// 100 msec to 5 sec
|
// 100 msec to 5 min
|
||||||
m_Manager.DynamicSelectLoop(100 * 1000, 5 * 1000 * 1000);
|
m_Manager.DynamicSelectLoop(100 * 1000, 5 * 60 * 1000 * 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user