// $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>
#include "FdEvent.ih"
// Custom includes
+#include <sstream>
#include "../Utils/senfassert.hh"
//#include "FdEvent.mpp"
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));
}
}
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;
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));
}
}
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()
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_);
}
///////////////////////////////////////////////////////////////////////////
disable();
events_ = events;
if (en)
- enabled();
+ enabled();
return *this;
}
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;
+ 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