summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Application.h10
-rw-r--r--cpp/src/Ice/Application.cpp13
2 files changed, 23 insertions, 0 deletions
diff --git a/cpp/include/Ice/Application.h b/cpp/include/Ice/Application.h
index e983e050fe3..90ddaf7f413 100644
--- a/cpp/include/Ice/Application.h
+++ b/cpp/include/Ice/Application.h
@@ -83,10 +83,20 @@ public:
static void holdInterrupt();
static void releaseInterrupt();
+ //
+ // This method returns true if a signal handler was triggered,
+ // false otherwise. This can be used once Communicator::waitForShutdown()
+ // returns to test whether the shutdown was due to an interrupt (interrupted()
+ // returns true in that case) or because Communicator::shutdown() was called
+ // (interupted() returns false in that case).
+ //
+ static bool interrupted();
+
private:
static const char* _appName;
static CommunicatorPtr _communicator;
+ static bool _interrupted;
#ifdef _WIN32
friend BOOL WINAPI interruptHandler(DWORD);
diff --git a/cpp/src/Ice/Application.cpp b/cpp/src/Ice/Application.cpp
index f87d16503be..78f3ed6ac95 100644
--- a/cpp/src/Ice/Application.cpp
+++ b/cpp/src/Ice/Application.cpp
@@ -20,6 +20,8 @@ using namespace Ice;
const char* Application::_appName = 0;
CommunicatorPtr Application::_communicator;
+bool Application::_interrupted = false;
+
#ifndef _WIN32
const int Application::signals[] = { SIGHUP, SIGINT, SIGTERM };
sigset_t Application::signalSet;
@@ -49,6 +51,7 @@ Ice::Application::main(int argc, char* argv[], const char* configFile)
return EXIT_FAILURE;
}
+ Application::_interrupted = false;
_appName = argv[0];
int status;
@@ -147,6 +150,8 @@ Ice::Application::communicator()
BOOL WINAPI
Ice::interruptHandler(DWORD)
{
+ Application::_interrupted = true;
+
//
// Don't use Application::communicator(), this is not signal-safe.
//
@@ -231,6 +236,8 @@ Ice::Application::releaseInterrupt()
void
Ice::interruptHandler(int)
{
+ Application::_interrupted = true;
+
//
// Don't use Application::communicator(), this is not signal-safe.
//
@@ -293,3 +300,9 @@ Ice::Application::releaseInterrupt()
}
#endif
+
+bool
+Ice::Application::interrupted()
+{
+ return Application::_interrupted;
+}