X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFdEvent.cc;h=9cfb4108c7d67d0221aeec0da177d9b87f3a9a21;hb=532240d72e09e19e57fac9bb55c2560b9c9e5b97;hp=58c3d7e3424cfcd95073024b0be26aea3f37ddb1;hpb=03516e8371a90f908ce54dedb3c874eec7dd08ff;p=senf.git diff --git a/Scheduler/FdEvent.cc b/Scheduler/FdEvent.cc index 58c3d7e..9cfb410 100644 --- a/Scheduler/FdEvent.cc +++ b/Scheduler/FdEvent.cc @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2008 +// Copyright (C) 2008 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund @@ -27,6 +27,7 @@ #include "FdEvent.ih" // Custom includes +#include #include "../Utils/senfassert.hh" //#include "FdEvent.mpp" @@ -39,8 +40,8 @@ prefix_ senf::scheduler::detail::FdDispatcher::~FdDispatcher() { for (FdSet::iterator i (fds_.begin()); i != fds_.end(); ++i) { - FdManager::instance().remove(i->fd_); - FIFORunner::instance().dequeue(&(*i)); + detail::FdManager::instance().remove(i->fd_); + detail::FIFORunner::instance().dequeue(&(*i)); } } @@ -49,14 +50,14 @@ prefix_ bool senf::scheduler::detail::FdDispatcher::add(FdEvent & event) std::pair range (fds_.equal_range(event)); int events (0); for (FdSet::iterator i (range.first); i != range.second; ++i) - events |= i->events_; + events |= i->events_; if (event.events_ & events) - throw FdEvent::DuplicateEventRegistrationException(); + throw FdEvent::DuplicateEventRegistrationException() << "vinfo: " << event.v_info(); - if (! FdManager::instance().set(event.fd_, events | event.events_, &event)) + if (! detail::FdManager::instance().set(event.fd_, events | event.events_, &event)) return false; - FIFORunner::instance().enqueue(&event); + detail::FIFORunner::instance().enqueue(&event); fds_.insert(range.first, event); return true; @@ -65,16 +66,16 @@ prefix_ bool senf::scheduler::detail::FdDispatcher::add(FdEvent & event) prefix_ void senf::scheduler::detail::FdDispatcher::remove(FdEvent & event) { fds_.erase(FdSet::current(event)); - FIFORunner::instance().dequeue(&event); + detail::FIFORunner::instance().dequeue(&event); std::pair range (fds_.equal_range(event)); if (range.first == range.second) - FdManager::instance().remove(event.fd_); + detail::FdManager::instance().remove(event.fd_); else { int events (0); for (FdSet::iterator i (range.first); i != range.second; ++i) events |= i->events_; - FdManager::instance().set(event.fd_, events, &(*range.first)); + detail::FdManager::instance().set(event.fd_, events, &(*range.first)); } } @@ -86,25 +87,25 @@ prefix_ void senf::scheduler::detail::FileDispatcher::add(FdEvent & event) std::pair range (fds_.equal_range(event)); int events (0); for (FdSet::iterator i (range.first); i != range.second; ++i) - events |= i->events_; + events |= i->events_; if (event.events_ & events) - throw FdEvent::DuplicateEventRegistrationException(); + throw FdEvent::DuplicateEventRegistrationException() << "vinfo: " << event.v_info(); - FIFORunner::instance().enqueue(&event); + detail::FIFORunner::instance().enqueue(&event); fds_.insert(range.first, event); - FdManager::instance().timeout(0); + detail::FdManager::instance().timeout(0); } prefix_ senf::scheduler::detail::FileDispatcher::FileDispatcher() - : managerTimeout_ (scheduler::FdManager::instance().timeout()) + : managerTimeout_ (scheduler::detail::FdManager::instance().timeout()) {} prefix_ senf::scheduler::detail::FileDispatcher::~FileDispatcher() { - FdManager::instance().timeout(-1); + detail::FdManager::instance().timeout(-1); for (FdSet::iterator i (fds_.begin()); i != fds_.end(); ++i) - FIFORunner::instance().dequeue(&(*i)); + detail::FIFORunner::instance().dequeue(&(*i)); } prefix_ void senf::scheduler::detail::FileDispatcher::prepareRun() @@ -118,9 +119,9 @@ prefix_ void senf::scheduler::detail::FileDispatcher::prepareRun() prefix_ void senf::scheduler::detail::FileDispatcher::remove(FdEvent & event) { fds_.erase(FdSet::current(event)); - FIFORunner::instance().dequeue(&event); + detail::FIFORunner::instance().dequeue(&event); if (fds_.empty()) - FdManager::instance().timeout(managerTimeout_); + detail::FdManager::instance().timeout(managerTimeout_); } /////////////////////////////////////////////////////////////////////////// @@ -152,7 +153,7 @@ prefix_ senf::scheduler::FdEvent & senf::scheduler::FdEvent::events(int events) disable(); events_ = events; if (en) - enabled(); + enabled(); return *this; } @@ -162,22 +163,45 @@ prefix_ void senf::scheduler::FdEvent::signal(int events) detail::FdDispatcher::FdSet::iterator const i_end (detail::FdDispatcher::instance().fds_.end()); bool all ((events & (EV_ERR | EV_HUP)) && ! (events & (EV_READ | EV_PRIO | EV_WRITE))); for (; i != i_end && fd_ == i->fd_; ++i) { - i->signaledEvents_ = events; - if (i->events_ & events || all) - i->setRunnable(); + i->signaledEvents_ = events & (EV_ERR | EV_HUP | i->events_); + if (i->events_ & events || all) + i->setRunnable(); } } -prefix_ void senf::scheduler::FdEvent::run() +prefix_ void senf::scheduler::FdEvent::v_run() { cb_(signaledEvents_); } +prefix_ char const * senf::scheduler::FdEvent::v_type() + const +{ + return "fd"; +} + +prefix_ std::string senf::scheduler::FdEvent::v_info() + const +{ + std::stringstream ss; + + ss << "fd " << fd_; + if (! pollable_) + ss << " (NOT pollable)"; + if (events_ & EV_READ) + ss << " READ"; + if (events_ & EV_PRIO) + ss << " PRIO"; + if (events_ & EV_WRITE) + ss << " WRITE"; + return ss.str(); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "FdEvent.mpp" - + // Local Variables: // mode: c++ // fill-column: 100