X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFdEvent.cc;h=9cfb4108c7d67d0221aeec0da177d9b87f3a9a21;hb=b89e3166f7680755683dccee5e48cb3a820185c0;hp=f6a6396fa0d4fdc658dcf5fd51d02606efc98fc2;hpb=ac90835cbb00ca83a51ab9efb23fdcb75518e808;p=senf.git diff --git a/Scheduler/FdEvent.cc b/Scheduler/FdEvent.cc index f6a6396..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" @@ -49,9 +50,9 @@ 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 (! detail::FdManager::instance().set(event.fd_, events | event.events_, &event)) return false; @@ -69,12 +70,12 @@ prefix_ void senf::scheduler::detail::FdDispatcher::remove(FdEvent & event) std::pair range (fds_.equal_range(event)); if (range.first == range.second) - detail::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_; - detail::FdManager::instance().set(event.fd_, events, &(*range.first)); + detail::FdManager::instance().set(event.fd_, events, &(*range.first)); } } @@ -86,9 +87,9 @@ 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(); detail::FIFORunner::instance().enqueue(&event); fds_.insert(range.first, event); @@ -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