// -*- C++ -*- namespace Kite { /*! \class RoutingEventLoop * \brief Simple loop dectector for RoutingEvent. * * The RoutingEventLoop can be roughly understood as a truncated histogram * of the \c depth last (in the time meaning) greatest riped up elements. * * The loop detector keep track of the \c depth TrackElement with the * greatest processing count. TrackElement are just identified through * the \c id of their associated AutoSegment. Each entry in the loop * table contains: * - The \c id of the associated TrackSegment (Katabatic::AutoSegment). * - The \c count of times it has been processed * - The \c timestamp of the latest time it has been updated. * * The table (implemented as \c vector<>) it kept sorted on the timestamp * (decreasing). Whenever there is more than \c depth elements in the * table, the oldest one are discarted (regardless of their count). * Obviously, there are pathological cases into which a loop cannot * be detected, but so far it has not happened so a more robust * approach seems not necessary at this time. * * Whenever the count of an element reaches \c countLimit, the looping * flag is set. It will remains set unless the faulty element is * manually removed. */ //! \function RoutingEventLoop::RoutingEventLoop ( size_t depth, int countLimit ); //! Construct a loop detector that handle \c depth differents segments //! and has a looping threshold of \c countLimit. //! \function bool RoutingEventLoop::isLooping () const; //! \sreturn \true if the loop threshold has been reached for at least one //! element. //! \function int RoutingEventLoop::getMaxCount () const; //! The maximal count an element as reached so far. //! \function const std::vector& RoutingEventLoop::getElements () const; //! The complete table elements. //! \function void RoutingEventLoop::update ( size_t id ) ; //! Update the loop, telling that element \c id has appreared one more //! time. //! \function void RoutingEventLoop::erase ( size_t id ) ; //! Remove the entry related to element \c id in the table. The state of //! the table is fully recomputed after the removal (looping flag & //! maximum count). //! //! This method is used when a loop has been encountered, presumably on //! element \c id, and we want to continue. To avoid the loop detector //! yelling at each check, the associated TrackElement should be invalidated //! and it's reference removed from the table. }