}
}
-prefix_ void senf::scheduler::FdDispatcher::add(int fd, Callback const & cb, int events)
+prefix_ bool senf::scheduler::FdDispatcher::add(std::string const & name, int fd,
+ Callback const & cb, int events)
{
if (events == 0)
- return;
+ return true;
FdMap::iterator i (fds_.find(fd));
if (i == fds_.end()) {
- i = fds_.insert(std::make_pair(fd, FdEvent())).first;
+ i = fds_.insert(std::make_pair(fd, FdEvent(name))).first;
runner_.enqueue(static_cast<FdEvent::ReadTask*>(&i->second));
runner_.enqueue(static_cast<FdEvent::PrioTask*>(&i->second));
runner_.enqueue(static_cast<FdEvent::WriteTask*>(&i->second));
}
FdEvent & event (i->second);
- if (events & EV_READ) event.FdEvent::ReadTask::cb = cb;
- if (events & EV_PRIO) event.FdEvent::PrioTask::cb = cb;
- if (events & EV_WRITE) event.FdEvent::WriteTask::cb = cb;
-
- manager_.set(fd, event.activeEvents(), &event);
- }
-
- prefix_ void senf::scheduler::FdDispatcher::remove(int fd, int events)
- {
- if (events == 0)
- return;
-
- FdMap::iterator i (fds_.find(fd));
- if (i == fds_.end())
- return;
- FdEvent & event (i->second);
-
- if (events & EV_READ) event.FdEvent::ReadTask::cb = 0;
- if (events & EV_PRIO) event.FdEvent::PrioTask::cb = 0;
- if (events & EV_WRITE) event.FdEvent::WriteTask::cb = 0;
-
- int activeEvents (event.activeEvents());
- if (! activeEvents) {
- manager_.remove(fd);
- runner_.dequeue(static_cast<FdEvent::ReadTask*>(&i->second));
- runner_.dequeue(static_cast<FdEvent::PrioTask*>(&i->second));
- runner_.dequeue(static_cast<FdEvent::WriteTask*>(&i->second));
+ if (events & EV_READ)
+ event.FdEvent::ReadTask::cb = cb;
+ if (events & EV_PRIO)
+ event.FdEvent::PrioTask::cb = cb;
+ if (events & EV_WRITE)
+ event.FdEvent::WriteTask::cb = cb;
+
+ if (! manager_.set(fd, event.activeEvents(), &event)) {
+ runner_.dequeue(static_cast<FdEvent::ReadTask*>(&i->second));
+ runner_.dequeue(static_cast<FdEvent::PrioTask*>(&i->second));
+ runner_.dequeue(static_cast<FdEvent::WriteTask*>(&i->second));
+ fds_.erase(i);
+ return false;
+ }
+ else
+ return true;
+}
+
+prefix_ void senf::scheduler::FdDispatcher::remove(int fd, int events)
+{
+ if (events == 0)
+ return;
+
+ FdMap::iterator i (fds_.find(fd));
+ if (i == fds_.end())
+ return;
+ FdEvent & event (i->second);
+
+ if (events & EV_READ)
+ event.FdEvent::ReadTask::cb = 0;
+ if (events & EV_PRIO)
+ event.FdEvent::PrioTask::cb = 0;
+ if (events & EV_WRITE)
+ event.FdEvent::WriteTask::cb = 0;
+
+ int activeEvents (event.activeEvents());
+ if (! activeEvents) {
+ manager_.remove(fd);
+ runner_.dequeue(static_cast<FdEvent::ReadTask*>(&i->second));
+ runner_.dequeue(static_cast<FdEvent::PrioTask*>(&i->second));
+ runner_.dequeue(static_cast<FdEvent::WriteTask*>(&i->second));
fds_.erase(fd);
} else
manager_.set(fd, activeEvents, &event);
if (events & EV_WRITE)
WriteTask::runnable = true;
- if (events & (EV_ERR | EV_HUP) && ! events & (EV_READ | EV_PRIO | EV_WRITE)) {
+ if ((events & (EV_ERR | EV_HUP)) && ! (events & (EV_READ | EV_PRIO | EV_WRITE))) {
if (ReadTask::cb) ReadTask::runnable = true;
if (PrioTask::cb) PrioTask::runnable = true;
if (WriteTask::cb) WriteTask::runnable = true;