X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFdDispatcher.cc;h=4d8007b073aa8b629702b4e43edb9a2d2454f164;hb=09010bdcf81888480d4d481a523f9714a89f2625;hp=a393be5e97f992822a4d94bb3d7e3b6928cfa47b;hpb=919e588a2c387c9a910aa8761e65155a0d205bba;p=senf.git diff --git a/Scheduler/FdDispatcher.cc b/Scheduler/FdDispatcher.cc index a393be5..4d8007b 100644 --- a/Scheduler/FdDispatcher.cc +++ b/Scheduler/FdDispatcher.cc @@ -46,47 +46,62 @@ prefix_ senf::scheduler::FdDispatcher::~FdDispatcher() } } -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(&i->second)); runner_.enqueue(static_cast(&i->second)); runner_.enqueue(static_cast(&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(&i->second)); - runner_.dequeue(static_cast(&i->second)); - runner_.dequeue(static_cast(&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(&i->second)); + runner_.dequeue(static_cast(&i->second)); + runner_.dequeue(static_cast(&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(&i->second)); + runner_.dequeue(static_cast(&i->second)); + runner_.dequeue(static_cast(&i->second)); fds_.erase(fd); } else manager_.set(fd, activeEvents, &event); @@ -106,7 +121,7 @@ prefix_ void senf::scheduler::FdDispatcher::FdEvent::signal(int e) 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;