aboutsummaryrefslogtreecommitdiff
path: root/src/Gobbledegook.cpp
diff options
context:
space:
mode:
authorPaul Nettle <nettle.paul@gmail.com>2017-09-01 13:23:34 -0500
committerPaul Nettle <nettle.paul@gmail.com>2017-09-01 13:23:34 -0500
commit322aeccbe9065863246078da3a945e8f9983d2c5 (patch)
tree5288c9f4a338e80e6e9ac4ed9e682536b3e6871d /src/Gobbledegook.cpp
parentRemoved null-terminators from strings being built into Variants as byte arrays. (diff)
downloadgobbledegook-322aeccbe9065863246078da3a945e8f9983d2c5.tar.gz
gobbledegook-322aeccbe9065863246078da3a945e8f9983d2c5.tar.bz2
gobbledegook-322aeccbe9065863246078da3a945e8f9983d2c5.zip
Cleaned up the logging a bit, improved server termination status returned from ggkWait.
Diffstat (limited to 'src/Gobbledegook.cpp')
-rw-r--r--src/Gobbledegook.cpp114
1 files changed, 86 insertions, 28 deletions
diff --git a/src/Gobbledegook.cpp b/src/Gobbledegook.cpp
index f571be7..43e7e76 100644
--- a/src/Gobbledegook.cpp
+++ b/src/Gobbledegook.cpp
@@ -54,22 +54,45 @@
#include "Logger.h"
#include "Server.h"
-// During initialization, we'll check for complation at this interval
-static const int kMaxAsyncInitCheckIntervalMS = 10;
+namespace ggk
+{
+ // During initialization, we'll check for complation at this interval
+ static const int kMaxAsyncInitCheckIntervalMS = 10;
+
+ // Our server thread
+ static std::thread serverThread;
+
+ // The current server state
+ volatile static GGKServerRunState serverRunState = EUninitialized;
-// Our server thread
-static std::thread serverThread;
+ // The current server health
+ volatile static GGKServerHealth serverHealth = EOk;
-// The current server state
-volatile static GGKServerRunState serverRunState = EUninitialized;
+ // We store the old GLib print handler and error print handler so we can restore if
+ static GPrintFunc printHandlerGLib;
+ static GPrintFunc printerrHandlerGLib;
+ static GLogFunc logHandlerGLib;
-// The current server health
-volatile static GGKServerHealth serverHealth = EOk;
+ // Our update queue
+ typedef std::tuple<std::string, std::string> QueueEntry;
+ std::deque<QueueEntry> updateQueue;
+ std::mutex updateQueueMutex;
+
+ // Internal method to set the run state of the server
+ void setServerRunState(GGKServerRunState newState)
+ {
+ Logger::status(SSTR << "** SERVER RUN STATE CHANGED: " << ggkGetServerRunStateString(serverRunState) << " -> " << ggkGetServerRunStateString(newState));
+ serverRunState = newState;
+ }
+
+ // Internal method to set the health of the server
+ void setServerHealth(GGKServerHealth newState)
+ {
+ serverHealth = newState;
+ }
+}; // namespace ggk
-// Our update queue
-typedef std::tuple<std::string, std::string> QueueEntry;
-std::deque<QueueEntry> updateQueue;
-std::mutex updateQueueMutex;
+using namespace ggk;
// ---------------------------------------------------------------------------------------------------------------------------------
// _ _ _ _ _
@@ -228,13 +251,6 @@ const char *ggkGetServerRunStateString(GGKServerRunState state)
}
}
-// Internal method to set the run state of the server
-void setServerRunState(GGKServerRunState newState)
-{
- Logger::status(SSTR << "** SERVER RUN STATE CHANGED: " << ggkGetServerRunStateString(serverRunState) << " -> " << ggkGetServerRunStateString(newState));
- serverRunState = newState;
-}
-
// Convenience method to check ServerRunState for a running server
int ggkIsServerRunning()
{
@@ -271,12 +287,6 @@ const char *ggkGetServerHealthString(GGKServerHealth state)
}
}
-// Internal method to set the health of the server
-void setServerHealth(GGKServerHealth newState)
-{
- serverHealth = newState;
-}
-
// ---------------------------------------------------------------------------------------------------------------------------------
// ____ _ _ _
// / ___|| |_ ___ _ __ | |_| |__ ___ ___ ___ _ ____ _____ _ __
@@ -330,9 +340,13 @@ int ggkShutdownAndWait()
// Typically, a call to this method would follow `ggkTriggerShutdown()`.
int ggkWait()
{
+ int result = 0;
try
{
+ Logger::info("Stopping GGK server");
serverThread.join();
+
+ result = 1;
}
catch(std::system_error &ex)
{
@@ -354,8 +368,12 @@ int ggkWait()
}
}
- // Return true if we're stopped, otherwise false
- return ggkGetServerRunState() == EStopped ? 1 : 0;
+ // Restore the GLib output functions
+ g_set_print_handler(printHandlerGLib);
+ g_set_printerr_handler(printerrHandlerGLib);
+ g_log_set_default_handler(logHandlerGLib, nullptr);
+
+ return result;
}
// ---------------------------------------------------------------------------------------------------------------------------------
@@ -387,6 +405,46 @@ int ggkWait()
// safely for an indefinite period of time.
int ggkStart(GGKServerDataGetter getter, GGKServerDataSetter setter, int maxAsyncInitTimeoutMS)
{
+ //
+ // Start by capturing the GLib output
+ //
+
+ // Redirect GLib output to this log method
+ printHandlerGLib = g_set_print_handler([](const gchar *string)
+ {
+ Logger::info(string);
+ });
+ printerrHandlerGLib = g_set_printerr_handler([](const gchar *string)
+ {
+ Logger::error(string);
+ });
+ logHandlerGLib = g_log_set_default_handler([](const gchar *log_domain, GLogLevelFlags log_levels, const gchar *message, gpointer /*user_data*/)
+ {
+ std::string str = std::string(log_domain) + ": " + message;
+ if ((log_levels & (G_LOG_FLAG_RECURSION|G_LOG_FLAG_FATAL)) != 0)
+ {
+ Logger::fatal(str);
+ }
+ else if ((log_levels & (G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_ERROR)) != 0)
+ {
+ Logger::error(str);
+ }
+ else if ((log_levels & G_LOG_LEVEL_WARNING) != 0)
+ {
+ Logger::warn(str);
+ }
+ else if ((log_levels & G_LOG_LEVEL_DEBUG) != 0)
+ {
+ Logger::debug(str);
+ }
+ else
+ {
+ Logger::info(str);
+ }
+ }, nullptr);
+
+ Logger::info("Starting GGK server");
+
// Allocate our server
TheServer = std::make_shared<Server>(getter, setter);
@@ -430,4 +488,4 @@ int ggkStart(GGKServerDataGetter getter, GGKServerDataSetter setter, int maxAsyn
// Everything looks good
return 1;
-} \ No newline at end of file
+}