diff options
author | ijon <ijon@yandex-team.ru> | 2022-02-10 16:49:56 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:49:56 +0300 |
commit | a62b5e9ea9837fdaa7a5e327b7f98b41e4d18cf6 (patch) | |
tree | 14cf580409bd4159d757c24c726fd796b6011688 /library/cpp/sighandler | |
parent | 570af552997dea3da2712f693b345afa31932f3b (diff) | |
download | ydb-a62b5e9ea9837fdaa7a5e327b7f98b41e4d18cf6.tar.gz |
Restoring authorship annotation for <ijon@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/sighandler')
-rw-r--r-- | library/cpp/sighandler/async_signals_handler.cpp | 44 | ||||
-rw-r--r-- | library/cpp/sighandler/async_signals_handler.h | 12 |
2 files changed, 28 insertions, 28 deletions
diff --git a/library/cpp/sighandler/async_signals_handler.cpp b/library/cpp/sighandler/async_signals_handler.cpp index 00ce1c18fb..1f437b8f5f 100644 --- a/library/cpp/sighandler/async_signals_handler.cpp +++ b/library/cpp/sighandler/async_signals_handler.cpp @@ -1,16 +1,16 @@ -#include "async_signals_handler.h" +#include "async_signals_handler.h" #include <util/system/platform.h> - + #if !defined(_win_) - + #include <errno.h> #include <fcntl.h> #include <signal.h> #include <string.h> #include <unistd.h> - + #if defined(_linux_) #include <dlfcn.h> #endif @@ -57,13 +57,13 @@ namespace { typedef TAutoPtr<TEventHandler> TEventHandlerPtr; THashMap<int, TEventHandlerPtr> Handlers; TRWMutex HandlersLock; - + TAtomic ShouldDie; TSystemEvent DieEvent; static void* ThreadFunc(void* data) { reinterpret_cast<TAsyncSignalsHandler*>(data)->RealThreadFunc(); - + return nullptr; } @@ -71,7 +71,7 @@ namespace { for (;;) { ui8 signum; const ssize_t bytesRead = read(SignalPipeReadFd, &signum, 1); - + Y_VERIFY(bytesRead >= 0 || (bytesRead == -1 && errno == EINTR), "read failed: %s (errno = %d)", strerror(errno), errno); if (AtomicAdd(ShouldDie, 0) != 0) { @@ -79,7 +79,7 @@ namespace { break; } - + if (bytesRead == 0) { break; } else if (bytesRead == -1) { @@ -94,8 +94,8 @@ namespace { handler->Get()->Handle(signum); } } - } - + } + public: TAsyncSignalsHandler() : Thread(TThread::TParams(ThreadFunc, this).SetName("sighandler")) @@ -103,7 +103,7 @@ namespace { , ShouldDie(0) { int filedes[2] = {-1}; - + #ifdef _linux_ int result; @@ -145,20 +145,20 @@ namespace { Thread.Start(); Thread.Detach(); } - + ~TAsyncSignalsHandler() { AtomicSwap(&ShouldDie, TAtomic(1)); ui8 fakeSignal = 0; WriteAllOrDie(SIGNAL_PIPE_WRITE_FD, &fakeSignal, 1); - + DieEvent.WaitT(TDuration::Seconds(15)); - + /* may cause VERIFY failure in signal handler, propably we should leave it to process clean procedure close(SIGNAL_PIPE_WRITE_FD); close(SignalPipeReadFd); */ } - + bool DoInstall(int signum, TAutoPtr<TEventHandler> handler) { TWriteGuard dnd(HandlersLock); TEventHandlerPtr& ev = Handlers[signum]; @@ -181,7 +181,7 @@ namespace { } } }; - + // This pointer is never deleted - yeah, it's intended memory leak. // It is necessary to prevent problems when user's signal handler calls exit function // which destroys all global variables including this one. @@ -204,16 +204,16 @@ void SetAsyncSignalHandler(int signum, TAutoPtr<TEventHandler> handler) { } SIGNALS_HANDLER->Install(signum, handler); -} - +} + #else //_win_ - + void SetAsyncSignalHandler(int, TAutoPtr<TEventHandler>) { // TODO: it's really easy to port using _pipe, _read and _write, but it must be tested properly. } - -#endif - + +#endif + namespace { template <typename TFunc> class TFunctionEventHandler: public TEventHandler { diff --git a/library/cpp/sighandler/async_signals_handler.h b/library/cpp/sighandler/async_signals_handler.h index da36365ace..9de1fe1fc9 100644 --- a/library/cpp/sighandler/async_signals_handler.h +++ b/library/cpp/sighandler/async_signals_handler.h @@ -1,14 +1,14 @@ -#pragma once - +#pragma once + #include <util/generic/ptr.h> #include <functional> -struct TEventHandler { +struct TEventHandler { virtual ~TEventHandler() { } - virtual int Handle(int signum) = 0; -}; - + virtual int Handle(int signum) = 0; +}; + void SetAsyncSignalHandler(int signum, TAutoPtr<TEventHandler> handler); void SetAsyncSignalHandler(int signum, void (*handler)(int)); void SetAsyncSignalFunction(int signum, std::function<void(int)> func); |