• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Révisiondbe0282763fbef5ad89e4c72bbfd00386075ca64 (tree)
l'heure2012-09-15 03:51:00
Auteurshibacow <shibacow@user...>
Commitershibacow

Message de Log

シグナルを受けて終了するように変更

Change Summary

Modification

--- a/server/Server.cpp
+++ b/server/Server.cpp
@@ -75,7 +75,14 @@ namespace network {
7575 void Server::Stop()
7676 {
7777 io_service_.stop();
78+ Logger::Info("stop server");
7879 }
80+ void Server::Stop(int innterrupt_type)
81+ {
82+ io_service_.stop();
83+ Logger::Info(_T("stop server innterrupt_type=%d"),innterrupt_type);
84+ }
85+
7986
8087 bool Server::Empty() const
8188 {
--- a/server/Server.hpp
+++ b/server/Server.hpp
@@ -28,6 +28,7 @@ class Server {
2828 Server(uint16_t port);
2929 void Start(CallbackFuncPtr callback);
3030 void Stop();
31+ void Stop(int interrupt_type);
3132 void SendAll(const Command&);
3233 void SendOthers(const Command&, SessionWeakPtr);
3334
--- /dev/null
+++ b/server/ServerSigHandler.hpp
@@ -0,0 +1,62 @@
1+//
2+// 割り込みハンドラーを用いてgracefull delete
3+//
4+
5+#pragma once
6+#include <csignal>
7+#include <boost/thread.hpp>
8+//#include "../common/network/Session.hpp"
9+#include "Server.hpp"
10+
11+namespace network {
12+
13+class ServerSigHandler {
14+public:
15+ ServerSigHandler(int sig,Server *_server) : sig_to_wait(sig){
16+ sigset_t ss;
17+ sigemptyset( &ss );
18+ sigaddset( &ss, sig_to_wait );
19+ // マスクをセットして現在のマスクのバックアップも行う
20+ sigprocmask( SIG_BLOCK, &ss, &backup );
21+ // シグナルを待機して、補足、メンバー関数の実行をするスレッドを実行
22+ signal_thread = new boost::thread( boost::bind(&ServerSigHandler::wait_and_exec, this) );
23+ signal_thread->detach();
24+ server=_server;
25+ }
26+
27+ ~ServerSigHandler() {
28+ sigprocmask( SIG_SETMASK, &backup, NULL );
29+ //signal_thread->join(); いらない
30+ delete signal_thread;
31+ }
32+
33+private:
34+ // トラップするシグナル
35+ int sig_to_wait;
36+ // マスクのバックアップ
37+ sigset_t backup;
38+ boost::thread *signal_thread;
39+ Server *server;
40+ bool wait_and_exec() {
41+ sigset_t ss;
42+ sigemptyset(&ss);
43+ int ret = sigaddset(&ss, sig_to_wait);
44+ if (ret != 0)
45+ return false;
46+ // シグナルをブロック
47+ ret = pthread_sigmask(SIG_BLOCK, &ss, NULL);
48+ if (ret != 0)
49+ return false;
50+ while(1) {
51+ int signo;
52+ if (sigwait(&ss, &signo) == 0) {
53+ //Serverをstopする.
54+ (server->Stop)( signo );
55+ break;
56+ }
57+ }
58+ return true;
59+ }
60+};
61+
62+}
--- a/server/main.cpp
+++ b/server/main.cpp
@@ -16,6 +16,8 @@
1616 #include "../common/Logger.hpp"
1717 #include "Config.hpp"
1818 #include "Account.hpp"
19+#include "ServerSigHandler.hpp"
20+#include <csignal>
1921
2022 #ifdef _WIN32
2123 #include <boost/interprocess/windows_shared_memory.hpp>
@@ -316,11 +318,12 @@ int main(int argc, char* argv[])
316318 });
317319 }
318320 #endif
319-
321+ network::ServerSigHandler handler(SIGINT,&server);
320322 server.Start(callback);
321323
322324 } catch (std::exception& e) {
323325 Logger::Error(e.what());
326+
324327 Logger::Info("Stop Server");
325328 }
326329