Beginnings of graceful stop
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 10 Apr 2012 11:43:29 +0000 (13:43 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 10 Apr 2012 11:43:29 +0000 (13:43 +0200)
include/metaproxy/filter.hpp
include/metaproxy/router.hpp
src/filter.cpp
src/filter_frontend_net.cpp
src/filter_frontend_net.hpp
src/metaproxy_prog.cpp
src/router_chain.cpp
src/router_chain.hpp
src/router_flexml.cpp
src/router_flexml.hpp

index b42116c..2d5495f 100644 (file)
@@ -41,6 +41,8 @@ namespace metaproxy_1 {
                                    const char *path) = 0;
 
             virtual void start() const;
+
+            virtual void stop() const;
         };
 
         class FilterException : public std::runtime_error {
index 11c6e96..25db0cd 100644 (file)
@@ -43,6 +43,7 @@ namespace metaproxy_1
 
         virtual RoutePos *createpos() const = 0;
         virtual void start() = 0;
+        virtual void stop() = 0;
     };
 
     class RoutePos : boost::noncopyable {
index e625618..a195931 100644 (file)
@@ -27,6 +27,10 @@ void mp::filter::Base::start() const
 {
 }
 
+void mp::filter::Base::stop() const
+{
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4
index a3ab5f7..216d740 100644 (file)
@@ -375,6 +375,17 @@ mp::filter::FrontendNet::~FrontendNet()
             delete m_p->az[i];
         delete [] m_p->az;
     }
+    m_p->az = 0;
+}
+
+void mp::filter::FrontendNet::stop() const
+{
+    if (m_p->az)
+    {
+        size_t i;
+        for (i = 0; i<m_p->m_ports.size(); i++)
+            m_p->az[i]->server("");
+    }
 }
 
 bool mp::My_Timer_Thread::timeout()
index 719770f..92a6603 100644 (file)
@@ -38,6 +38,7 @@ namespace metaproxy_1 {
             void process(metaproxy_1::Package & package) const;
             void configure(const xmlNode * ptr, bool test_only,
                            const char *path);
+            void stop() const;
         public:
             /// set ports
             void set_ports(std::vector<Port> &ports);
index 4f28e4f..ce60c60 100644 (file)
@@ -52,8 +52,11 @@ static pid_t process_group = 0;
 
 static void sig_term_handler(int s)
 {
+    routerp->stop();
+#if 0
     kill(-process_group, SIGTERM); /* kill all children processes as well */
     _exit(0);
+#endif
 }
 #endif
 
@@ -69,6 +72,7 @@ static void handler_debug(void *data)
 
     mp::Package pack;
     pack.router(*routerp).move(); /* should never exit */
+    _exit(0);
 }
     
 static void handler_normal(void *data)
index ccd0486..fa4385f 100644 (file)
@@ -58,6 +58,14 @@ void mp::RouterChain::start()
         (*it)->start();
 }
 
+void mp::RouterChain::stop()
+{
+    std::list<const filter::Base *>::const_iterator it;
+
+    for (it = m_p->m_filter_list.begin(); it != m_p->m_filter_list.end(); it++)
+        (*it)->stop();
+}
+
 const mp::filter::Base *mp::RouterChain::Pos::move(const char *route)
 {
     if (it == m_p->m_filter_list.end())
@@ -83,7 +91,6 @@ mp::RoutePos *mp::RouterChain::Pos::clone()
     return p;
 }
 
-
 mp::RouterChain::Pos::~Pos()
 {
 }
index 052ce0a..a395205 100644 (file)
@@ -35,6 +35,7 @@ namespace metaproxy_1 {
         virtual RoutePos *createpos() const;
         RouterChain & append(const filter::Base &filter);
         void start();
+        void stop();
     private:
         boost::scoped_ptr<Rep> m_p;
         /// disabled because class is singleton
index 7e5bbbb..29e468b 100644 (file)
@@ -503,6 +503,24 @@ void mp::RouterFleXML::start()
     }
 }
 
+void mp::RouterFleXML::stop()
+{
+    std::map<std::string,RouterFleXML::Route>::iterator route_it;
+
+    route_it = m_p->m_routes.begin();
+    while (route_it != m_p->m_routes.end())
+    {
+        RouterFleXML::Route route = route_it->second;
+
+        std::list<boost::shared_ptr<const mp::filter::Base> >::iterator it;
+
+        for (it = route.m_list.begin(); it != route.m_list.end(); it++)
+            (*it)->stop();
+        route_it++;
+    }
+}
+
+
 /*
  * Local variables:
  * c-basic-offset: 4
index a83e1b8..2a385d7 100644 (file)
@@ -44,6 +44,7 @@ namespace metaproxy_1
 
         virtual RoutePos *createpos() const;
         void start();
+        void stop();
     private:
         boost::scoped_ptr<Rep> m_p;
     };