OSDN Git Service

シグナルを受けて終了するように変更
authorshibacow <shibacow@users.sourceforge.jp>
Fri, 14 Sep 2012 18:51:00 +0000 (11:51 -0700)
committershibacow <shibacow@users.sourceforge.jp>
Fri, 14 Sep 2012 18:51:00 +0000 (11:51 -0700)
server/Server.cpp
server/Server.hpp
server/ServerSigHandler.hpp [new file with mode: 0644]
server/main.cpp

index 711e11e..41a306f 100644 (file)
@@ -75,7 +75,14 @@ namespace network {
     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
     {
index ab4647a..d589a4a 100644 (file)
@@ -28,6 +28,7 @@ class Server {
         Server(uint16_t port);
         void Start(CallbackFuncPtr callback);
         void Stop();
+        void Stop(int interrupt_type);
         void SendAll(const Command&);
         void SendOthers(const Command&, SessionWeakPtr);
 
diff --git a/server/ServerSigHandler.hpp b/server/ServerSigHandler.hpp
new file mode 100644 (file)
index 0000000..9c20aec
--- /dev/null
@@ -0,0 +1,62 @@
+//
+// 割り込みハンドラーを用いて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;
+  }
+};
+
+}
index cfa3397..0643fbc 100644 (file)
@@ -16,6 +16,8 @@
 #include "../common/Logger.hpp"
 #include "Config.hpp"
 #include "Account.hpp"
+#include "ServerSigHandler.hpp"
+#include <csignal>
 
 #ifdef _WIN32
 #include <boost/interprocess/windows_shared_memory.hpp>
@@ -316,11 +318,12 @@ int main(int argc, char* argv[])
         });
     }
        #endif
-
+    network::ServerSigHandler handler(SIGINT,&server);
     server.Start(callback);
 
   } catch (std::exception& e) {
       Logger::Error(e.what());
+      
       Logger::Info("Stop Server");
   }