X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FDaemon%2FDaemon.ih;h=bd29a9b88bf17ec0e310c49a1b1a8d299fcac333;hb=f2f5d59e83863f3b513950173baee1b6da2aee3c;hp=ce8b7e3abf932654dbd8c9db6bc76177c1eec91f;hpb=9e69297ff7a7bcd9d952a38e35bbf124cb7f1dda;p=senf.git diff --git a/Utils/Daemon/Daemon.ih b/Utils/Daemon/Daemon.ih index ce8b7e3..bd29a9b 100644 --- a/Utils/Daemon/Daemon.ih +++ b/Utils/Daemon/Daemon.ih @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer NETwork research (NET) +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -23,15 +23,17 @@ /** \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" +#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 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 std::list Targets; + typedef boost::intrusive::ilist,false> Targets; - void readData(Scheduler::EventId event); - void writeData(Scheduler::EventId event, Targets::iterator target); + struct DestroyDelete + { + template + 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_; };