Add missing Build-Depends to debian/control
[senf.git] / Scheduler / FdEvent.cc
index 58c3d7e..9cfb410 100644 (file)
@@ -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 <g0dil@berlios.de>
@@ -27,6 +27,7 @@
 #include "FdEvent.ih"
 
 // Custom includes
+#include <sstream>
 #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<FdSet::iterator,FdSet::iterator> 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<FdSet::iterator,FdSet::iterator> 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<FdSet::iterator,FdSet::iterator> 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"
 
-\f
+
 // Local Variables:
 // mode: c++
 // fill-column: 100