Add SIGINT signal handler on linux to cleanly shutdown replay host

This commit is contained in:
baldurk
2016-07-13 17:55:47 +02:00
parent 0c55e9374c
commit 95e00d58bf
3 changed files with 28 additions and 3 deletions
+14 -3
View File
@@ -31,6 +31,9 @@
using std::string;
using std::wstring;
bool usingKillSignal = false;
volatile uint32_t killSignal = false;
void readCapOpts(const std::string &str, CaptureOptions *opts)
{
if(str.length() < sizeof(CaptureOptions))
@@ -403,12 +406,15 @@ struct ReplayHostCommand : public Command
string host = parser.get<string>("host");
uint32_t port = parser.get<uint32_t>("port");
volatile bool32 kill = false;
std::cerr << "Spawning a replay host listening on " << (host.empty() ? "*" : host) << ":"
<< port << "..." << std::endl;
RENDERDOC_SpawnReplayHost(host.empty() ? NULL : host.c_str(), port, &kill);
usingKillSignal = true;
RENDERDOC_SpawnReplayHost(host.empty() ? NULL : host.c_str(), port, &killSignal);
std::cerr << std::endl << "Cleaning up from replay hosting." << std::endl;
return 0;
}
};
@@ -449,6 +455,9 @@ struct ReplayCommand : public Command
if(parser.exist("remote-host"))
{
std::cout << "Replaying '" << filename << "' on " << parser.get<string>("remote-host") << ":"
<< parser.get<uint32_t>("remote-port") << "." << std::endl;
ReplayCreateStatus status = RENDERDOC_CreateRemoteReplayConnection(
parser.get<string>("remote-host").c_str(), parser.get<uint32_t>("remote-port"), &remote);
@@ -476,6 +485,8 @@ struct ReplayCommand : public Command
}
else
{
std::cout << "Replaying '" << filename << "' locally.." << std::endl;
ReplayCreateStatus status =
RENDERDOC_CreateReplayRenderer(filename.c_str(), &progress, &renderer);
+3
View File
@@ -47,6 +47,9 @@ struct Command
virtual bool IsCaptureCommand() = 0;
};
extern bool usingKillSignal;
extern volatile uint32_t killSignal;
void add_command(const std::string &name, Command *cmd);
void add_alias(const std::string &alias, const std::string &command);
+11
View File
@@ -27,6 +27,7 @@
#include <iconv.h>
#include <locale.h>
#include <replay/renderdoc_replay.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <xcb/xcb.h>
@@ -134,6 +135,14 @@ void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg
// be resolved and libGL wouldn't link, meaning dlsym(RTLD_NEXT) would fai
extern "C" void glXWaitGL();
void sig_handler(int signo)
{
if(usingKillSignal)
killSignal = true;
else
exit(1);
}
int main(int argc, char *argv[])
{
std::setlocale(LC_CTYPE, "");
@@ -142,6 +151,8 @@ int main(int argc, char *argv[])
if(never_run)
glXWaitGL();
signal(SIGINT, sig_handler);
// do any linux-specific setup here
// process any linux-specific arguments here