void Server::Stop()
{
io_service_.stop();
+ Logger::Info("stop server");
}
+ void Server::Stop(int innterrupt_type)
+ {
+ io_service_.stop();
+ Logger::Info(_T("stop server innterrupt_type=%d"),innterrupt_type);
+ }
+
bool Server::Empty() const
{
Server(uint16_t port);
void Start(CallbackFuncPtr callback);
void Stop();
+ void Stop(int interrupt_type);
void SendAll(const Command&);
void SendOthers(const Command&, SessionWeakPtr);
--- /dev/null
+//
+// 割り込みハンドラーを用いてgracefull delete
+//
+
+#pragma once
+#include <csignal>
+#include <boost/thread.hpp>
+//#include "../common/network/Session.hpp"
+#include "Server.hpp"
+
+namespace network {
+
+class ServerSigHandler {
+public:
+ ServerSigHandler(int sig,Server *_server) : sig_to_wait(sig){
+ sigset_t ss;
+ sigemptyset( &ss );
+ sigaddset( &ss, sig_to_wait );
+ // マスクをセットして現在のマスクのバックアップも行う
+ sigprocmask( SIG_BLOCK, &ss, &backup );
+ // シグナルを待機して、補足、メンバー関数の実行をするスレッドを実行
+ signal_thread = new boost::thread( boost::bind(&ServerSigHandler::wait_and_exec, this) );
+ signal_thread->detach();
+ server=_server;
+ }
+
+ ~ServerSigHandler() {
+ sigprocmask( SIG_SETMASK, &backup, NULL );
+ //signal_thread->join(); いらない
+ delete signal_thread;
+ }
+
+private:
+ // トラップするシグナル
+ int sig_to_wait;
+ // マスクのバックアップ
+ sigset_t backup;
+ boost::thread *signal_thread;
+ Server *server;
+ bool wait_and_exec() {
+ sigset_t ss;
+ sigemptyset(&ss);
+ int ret = sigaddset(&ss, sig_to_wait);
+ if (ret != 0)
+ return false;
+ // シグナルをブロック
+ ret = pthread_sigmask(SIG_BLOCK, &ss, NULL);
+ if (ret != 0)
+ return false;
+ while(1) {
+ int signo;
+ if (sigwait(&ss, &signo) == 0) {
+ //Serverをstopする.
+ (server->Stop)( signo );
+ break;
+ }
+ }
+ return true;
+ }
+};
+
+}
#include "../common/Logger.hpp"
#include "Config.hpp"
#include "Account.hpp"
+#include "ServerSigHandler.hpp"
+#include <csignal>
#ifdef _WIN32
#include <boost/interprocess/windows_shared_memory.hpp>
});
}
#endif
-
+ network::ServerSigHandler handler(SIGINT,&server);
server.Start(callback);
} catch (std::exception& e) {
Logger::Error(e.what());
+
Logger::Info("Stop Server");
}