X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FSignalDispatcher.hh;h=2c2b7ae56c412f7e26c99587fcc9ff4f23910a9f;hb=ee63e5771e9d69c7fe6de6c1b53b92d1307f2fc1;hp=752f06359857990a1ed25cca60ea9099fa8f60d6;hpb=7a02284399aee1039c67aea3691b4899d8fa10d4;p=senf.git diff --git a/Scheduler/SignalDispatcher.hh b/Scheduler/SignalDispatcher.hh index 752f063..2c2b7ae 100644 --- a/Scheduler/SignalDispatcher.hh +++ b/Scheduler/SignalDispatcher.hh @@ -38,7 +38,16 @@ namespace senf { namespace scheduler { - /** \brief + /** \brief Scheduler dispatcher managing UNIX signals + + This dispatcher supports registering UNIX signals with the Scheduler. + + \implementation SignalDispatcher provides a single signal handler which all registered + signals are assigned to. When a signal is received, data is written to a pipe which has + been added to the FdManager and this signals the event. + + \todo Add signal block/unblock management to the FdManager to reduce the number of + setprocmask() calls */ class SignalDispatcher : public FdManager::Event @@ -53,26 +62,33 @@ namespace scheduler { ///\name Structors and default members ///@{ - explicit SignalDispatcher(FdManager & manager, FIFORunner & runner); + SignalDispatcher(FdManager & manager, FIFORunner & runner); ~SignalDispatcher(); ///@} /////////////////////////////////////////////////////////////////////////// - void add(int signal, Callback const & cb); - void remove(int signal); + void add(int signal, Callback const & cb); ///< Add signal event + /**< \param[in] signal signal number + \param[in] cb Callback */ + + void remove(int signal); ///< Unregister signal event + + void unblockSignals(); ///< Unblock registered signals + /**< Must be called before waiting for an event */ + void blockSignals(); ///< Block registered signals + /**< Must be called directly after FdManager returns */ - void blockSignals(); - void unblockSignals(); + bool empty() const; ///< \c true, if no signal is registered. protected: private: + ///< Internal: UNIX signal event struct SignalEvent : public FIFORunner::TaskInfo { - explicit SignalEvent(Callback cb_); - virtual ~SignalEvent(); + SignalEvent(int signal, Callback cb_); virtual void run(); siginfo_t siginfo;