// $Id$ // // Copyright (C) 2010 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Mathias Kretschmer // Jens Moedeker // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file \brief TimerEventProxy non-inline template implementation */ // Custom includes #include #define prefix_ //-///////////////////////////////////////////////////////////////////////////////////////////////// template prefix_ senf::scheduler::TimerEventProxy::TimerEventProxy(std::string const & description) : entrySetById( entrySet.template get()), entrySetByTimeout( entrySet.template get ()), timer( "TimerEventProxy " + description, membind(&TimerEventProxy::timerEvent, this), 0, false) { } template prefix_ void senf::scheduler::TimerEventProxy::timerEvent() { ClockService::clock_type now = senf::scheduler::now(); typename EntrySetByTimeout_t::iterator it = entrySetByTimeout.begin(); while (it != entrySetByTimeout.end() && it->timeout <= now) { Entry item (*it); // remove due entry from set entrySetByTimeout.erase(it); // call callback item.cb(now, item.id); it = entrySetByTimeout.begin(); } if (entrySet.size() > 0) timer.timeout(entrySetByTimeout.begin()->timeout); } template prefix_ void senf::scheduler::TimerEventProxy::add( ClockService::clock_type timeout, IdType const & id, Callback cb) { // insert new entry or replace the timeout of an entry already indexed typename EntrySetById_t::iterator i = entrySetById.find(id); if(i == entrySetById.end()) entrySetByTimeout.insert( Entry(timeout, id, cb)); else{ Entry tmp = *i; tmp.timeout = timeout; entrySetById.replace(i,tmp); } // the scheduler time to the first earliest timeout (ordered index) timer.timeout( entrySetByTimeout.begin()->timeout); } template prefix_ bool senf::scheduler::TimerEventProxy::remove(IdType const & id) { bool removed (entrySetById.erase( id) > 0); if (entrySet.size() > 0) timer.timeout(entrySetByTimeout.begin()->timeout); else timer.disable(); return removed; } template prefix_ senf::ClockService::clock_type senf::scheduler::TimerEventProxy::timeout(IdType const & id) const { typename EntrySetById_t::const_iterator i ( entrySetById.find( id)); return i == entrySetById.end() ? 0 : i->timeout; } template prefix_ std::vector > senf::scheduler::TimerEventProxy::list() const { std::vector > tmp; typename EntrySetByTimeout_t::const_iterator it; for (it = entrySetByTimeout.begin(); it != entrySetByTimeout.end(); ++it) { tmp.push_back(std::make_pair( it->timeout, it->id)); } return tmp; } template prefix_ unsigned senf::scheduler::TimerEventProxy::numEvents() const { return entrySetByTimeout.size(); } template prefix_ void senf::scheduler::TimerEventProxy::clear() { entrySetByTimeout.clear(); } //-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ // Local Variables: // mode: c++ // fill-column: 100 // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" // comment-column: 40 // End: