Packets: Fix VariantParser invalid parser access bug
[senf.git] / Utils / Daemon / Daemon.ih
index 5cfa158..bd29a9b 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 /** \file
     \brief Daemon internal header */
 
-#ifndef IH_Daemon_
-#define IH_Daemon_ 1
+#ifndef IH_SENF_Utils_Daemon_Daemon_
+#define IH_SENF_Utils_Daemon_Daemon_ 1
 
 // Custom includes
 #include <deque>
-#include <list>
+#include "../boost/intrusive/iset.hpp"
+#include "../boost/intrusive/iset_hook.hpp"
 #include <boost/utility.hpp>
 #include <boost/function.hpp>
 #include "../../Scheduler/Scheduler.hh"
+#include "../../Scheduler/SignalEvent.hh"
 
 ///////////////////////////////ih.p////////////////////////////////////////
 
@@ -62,27 +64,41 @@ namespace detail {
 
         private:
 
+            // This is awkward ... we'll need to erase an element from the target list given
+            // only the target object. This is best implement using an intrusive container.
+            // However, this makes memory-management explicit and we'll need to be careful.
             typedef std::deque<char> Buffer;
-            struct Target
+            struct TargetListTag;
+            typedef boost::intrusive::ilist_base_hook<TargetListTag> TargetListBase;
+
+            struct Target : public TargetListBase
             {
+                Target(Forwarder & fwd, int fd);
+
                 int fd;
                 Buffer::size_type offset;
+                scheduler::FdEvent writeevent;
             };
-            typedef std::list<Target> Targets;
+            typedef boost::intrusive::ilist<TargetListBase::value_traits<Target>,false> Targets;
 
-            void readData(Scheduler::EventId event);
-            void writeData(Scheduler::EventId event, Targets::iterator target);
+            struct DestroyDelete
+            {
+                template <class T>
+                void operator()(T * t) { delete t; }
+            };
+
+            void readData(int event);
+            void writeData(int event, Target * target);
 
             Buffer buffer_;
             int src_;
-
             Targets targets_;
-
             Callback cb_;
+            scheduler::FdEvent readevent_;
         };
         
         void pipeClosed(int id);
-        void sigChld();
+        void sigChld(siginfo_t const &);
         void childDied();
         void childOk();
 
@@ -93,6 +109,8 @@ namespace detail {
         int stderr_;
         bool sigChld_;
 
+        scheduler::SignalEvent cldSignal_;
+        scheduler::TimerEvent timer_;
         Forwarder coutForwarder_;
         Forwarder cerrForwarder_;
     };