Utils/Console: Add short help to 'ls' output
[senf.git] / Scheduler / FdEvent.cc
index f6a6396..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"
@@ -49,9 +50,9 @@ 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 (! 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<FdSet::iterator,FdSet::iterator> 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<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();
 
     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"
 
-\f
+
 // Local Variables:
 // mode: c++
 // fill-column: 100