Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ ProfilerSignalManager::~ProfilerSignalManager() noexcept
_isHandlerInPlace = false;
sigaction(_signalToSend, &_previousAction, nullptr);
}
_handler = nullptr;
_handler.store(nullptr, std::memory_order_relaxed);
}

ProfilerSignalManager* ProfilerSignalManager::Get(int signal)
Expand All @@ -49,7 +49,7 @@ ProfilerSignalManager* ProfilerSignalManager::Get(int signal)

bool ProfilerSignalManager::RegisterHandler(HandlerFn_t handler)
{
HandlerFn_t current = _handler;
HandlerFn_t current = _handler.load(std::memory_order_acquire);

if (current != nullptr)
{
Expand All @@ -58,6 +58,7 @@ bool ProfilerSignalManager::RegisterHandler(HandlerFn_t handler)
}
std::unique_lock<std::mutex> lock(_handlerRegisterMutex);

current = _handler.load(std::memory_order_acquire);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch nice

if (current != nullptr)
{
assert(current == handler);
Expand All @@ -68,7 +69,7 @@ bool ProfilerSignalManager::RegisterHandler(HandlerFn_t handler)

if (_isHandlerInPlace)
{
_handler = handler;
_handler.store(handler, std::memory_order_release);
}

return _isHandlerInPlace;
Expand Down Expand Up @@ -204,7 +205,7 @@ void ProfilerSignalManager::SignalHandler(int signal, siginfo_t* info, void* con

bool ProfilerSignalManager::CallCustomHandler(int32_t signal, siginfo_t* info, void* context)
{
HandlerFn_t handler = _handler;
HandlerFn_t handler = _handler.load(std::memory_order_acquire);
return handler != nullptr && handler(signal, info, context);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class ProfilerSignalManager
#ifdef DD_TEST
void Reset()
{
_handler = nullptr;
_handler.store(nullptr, std::memory_order_relaxed);
sigaction(_signalToSend, &_previousAction, nullptr);
_isHandlerInPlace = false;
_canReplaceSignalHandler = true;
Expand Down Expand Up @@ -56,7 +56,7 @@ class ProfilerSignalManager
private:
bool _canReplaceSignalHandler;
int32_t _signalToSend;
HandlerFn_t _handler;
std::atomic<HandlerFn_t> _handler;
pid_t _processId;
bool _isHandlerInPlace;
struct sigaction _previousAction;
Expand Down