Skip to content

Commit f7200a0

Browse files
authored
Merge branch 'main' into conan-windows
2 parents 454b27f + f362e4b commit f7200a0

File tree

5 files changed

+106
-95
lines changed

5 files changed

+106
-95
lines changed

src/viam/sdk/CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ target_sources(viamsdk
126126
module/handler_map.cpp
127127
module/module.cpp
128128
module/service.cpp
129-
module/signal_manager.cpp
130129
referenceframe/frame.cpp
131130
registry/registry.cpp
132131
resource/reconfigurable.cpp
@@ -221,6 +220,18 @@ target_sources(viamsdk
221220
${CMAKE_CURRENT_BINARY_DIR}/../../viam/sdk/common/grpc_fwd.hpp
222221
)
223222

223+
if(WIN32)
224+
target_sources(viamsdk
225+
PRIVATE
226+
module/signal_manager_windows.cpp
227+
)
228+
else()
229+
target_sources(viamsdk
230+
PRIVATE
231+
module/signal_manager_posix.cpp
232+
)
233+
endif()
234+
224235
set_target_properties(
225236
viamsdk PROPERTIES
226237
SOVERSION noabi

src/viam/sdk/module/signal_manager.cpp

Lines changed: 0 additions & 79 deletions
This file was deleted.

src/viam/sdk/module/signal_manager.hpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
#pragma once
22

3-
#include <signal.h>
4-
5-
#ifdef _WIN32
6-
#include <windows.h>
7-
#endif
3+
#include <memory>
84

95
namespace viam {
106
namespace sdk {
@@ -27,16 +23,8 @@ class SignalManager {
2723
int wait();
2824

2925
private:
30-
#ifdef _WIN32
31-
static BOOL WINAPI console_handler_routine_(DWORD dwCtrlType);
32-
void handle_signal_(int signal);
33-
34-
static SignalManager* instance_;
35-
HANDLE signal_event_ = INVALID_HANDLE_VALUE;
36-
int signal_code_ = 0;
37-
#else
38-
sigset_t sigset_;
39-
#endif
26+
struct Impl;
27+
std::unique_ptr<Impl> pImpl;
4028
};
4129

4230
} // namespace sdk
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <viam/sdk/module/signal_manager.hpp>
2+
3+
#include <pthread.h>
4+
5+
#include <csignal>
6+
7+
namespace viam {
8+
namespace sdk {
9+
10+
struct SignalManager::Impl {
11+
sigset_t sigset_;
12+
};
13+
14+
SignalManager::SignalManager() : pImpl(std::make_unique<Impl>()) {
15+
sigemptyset(&(pImpl->sigset_));
16+
sigaddset(&(pImpl->sigset_), SIGINT);
17+
sigaddset(&(pImpl->sigset_), SIGTERM);
18+
pthread_sigmask(SIG_BLOCK, &(pImpl->sigset_), NULL);
19+
}
20+
21+
SignalManager::~SignalManager() = default;
22+
23+
int SignalManager::wait() {
24+
int sig = 0;
25+
return sigwait(&((pImpl->sigset_)), &sig);
26+
}
27+
28+
} // namespace sdk
29+
} // namespace viam
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <windows.h> //this file assumes WIN32
2+
3+
#include <viam/sdk/module/signal_manager.hpp>
4+
5+
#include <signal.h>
6+
7+
#include <stdexcept>
8+
9+
namespace viam {
10+
namespace sdk {
11+
12+
struct SignalManager::Impl { // Windows implementation details of SignalManager
13+
static BOOL WINAPI console_handler_routine_(DWORD dwCtrlType) {
14+
if (dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT) {
15+
instance_->pImpl->handle_signal_(SIGINT);
16+
return TRUE;
17+
} else if (dwCtrlType == CTRL_CLOSE_EVENT || dwCtrlType == CTRL_LOGOFF_EVENT ||
18+
dwCtrlType == CTRL_SHUTDOWN_EVENT) {
19+
instance_->pImpl->handle_signal_(SIGTERM);
20+
return TRUE;
21+
}
22+
return FALSE;
23+
}
24+
25+
void handle_signal_(int signal) {
26+
if (signal_event_ != INVALID_HANDLE_VALUE) {
27+
signal_code_ = signal;
28+
SetEvent(signal_event_);
29+
}
30+
}
31+
32+
static SignalManager* instance_;
33+
HANDLE signal_event_ = INVALID_HANDLE_VALUE;
34+
int signal_code_ = 0;
35+
};
36+
37+
SignalManager* SignalManager::Impl::instance_ = nullptr;
38+
39+
SignalManager::SignalManager() : pImpl(std::make_unique<Impl>()) {
40+
SignalManager::Impl::instance_ = this;
41+
SetConsoleCtrlHandler(SignalManager::Impl::console_handler_routine_, TRUE);
42+
}
43+
44+
SignalManager::~SignalManager() {
45+
SetConsoleCtrlHandler(NULL, FALSE);
46+
if (pImpl->signal_event_ != INVALID_HANDLE_VALUE) {
47+
CloseHandle(pImpl->signal_event_);
48+
}
49+
SignalManager::Impl::instance_ = nullptr;
50+
}
51+
52+
int SignalManager::wait() {
53+
pImpl->signal_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
54+
if (pImpl->signal_event_ == INVALID_HANDLE_VALUE) {
55+
throw std::runtime_error("Failed to create signal event");
56+
}
57+
WaitForSingleObject(pImpl->signal_event_, INFINITE);
58+
return static_cast<DWORD>(pImpl->signal_code_);
59+
}
60+
61+
} // namespace sdk
62+
} // namespace viam

0 commit comments

Comments
 (0)