X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FDaemon%2FDaemon.ih;h=f6ec463483867c861d9163291811562eb90a2b15;hb=9348e1098d66ac2684c8e280abf8d7143c887982;hp=3dec5e2afc10bf96b1da1f197e6a78db05c5d626;hpb=925317c7f45c32b01ab9292023db3f372b74bf0f;p=senf.git diff --git a/Utils/Daemon/Daemon.ih b/Utils/Daemon/Daemon.ih index 3dec5e2..f6ec463 100644 --- a/Utils/Daemon/Daemon.ih +++ b/Utils/Daemon/Daemon.ih @@ -28,7 +28,8 @@ // Custom includes #include -#include +#include "../boost/intrusive/iset.hpp" +#include "../boost/intrusive/iset_hook.hpp" #include #include #include "../../Scheduler/Scheduler.hh" @@ -63,23 +64,37 @@ 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 Buffer; - struct Target + struct TargetListTag; + typedef boost::intrusive::ilist_base_hook TargetListBase; + + struct Target : public TargetListBase { + Target(Forwarder & fwd, int fd); + int fd; Buffer::size_type offset; + scheduler::FdEvent writeevent; + }; + typedef boost::intrusive::ilist,false> Targets; + + struct DestroyDelete + { + template + void operator()(T * t) { delete t; } }; - typedef std::list Targets; void readData(int event); - void writeData(int event, Targets::iterator target); + void writeData(int event, Target * target); Buffer buffer_; int src_; - Targets targets_; - Callback cb_; + scheduler::FdEvent readevent_; }; void pipeClosed(int id); @@ -95,6 +110,7 @@ namespace detail { bool sigChld_; scheduler::SignalEvent cldSignal_; + scheduler::TimerEvent timer_; Forwarder coutForwarder_; Forwarder cerrForwarder_; };