X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FDaemon%2FDaemon.ih;h=bd29a9b88bf17ec0e310c49a1b1a8d299fcac333;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=795008ab1ce7424dc2dc5ca1d1353f467d06249f;hpb=db007c39287e3c666dd6b53edc8c3404617c7dd5;p=senf.git diff --git a/Utils/Daemon/Daemon.ih b/Utils/Daemon/Daemon.ih index 795008a..bd29a9b 100644 --- a/Utils/Daemon/Daemon.ih +++ b/Utils/Daemon/Daemon.ih @@ -23,12 +23,13 @@ /** \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 -#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);