X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFdDispatcher.cc;h=4103b510e84066ab5d58b42683186306335032fb;hb=40fa3e3f1e0f639c68bd15bf469e35045f94abee;hp=7d033a3126092a15c82188fc89f9a5d618968e42;hpb=c4c0c1809c65d2b369e7888895f95c09f82116b9;p=senf.git diff --git a/Scheduler/FdDispatcher.cc b/Scheduler/FdDispatcher.cc index 7d033a3..4103b51 100644 --- a/Scheduler/FdDispatcher.cc +++ b/Scheduler/FdDispatcher.cc @@ -46,10 +46,11 @@ 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()) { @@ -60,11 +61,28 @@ prefix_ void senf::scheduler::FdDispatcher::add(int fd, Callback const & cb, int } 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; + if (events & EV_READ) { + event.FdEvent::ReadTask::cb = cb; + event.FdEvent::ReadTask::name = name; + } + if (events & EV_PRIO) { + event.FdEvent::PrioTask::cb = cb; + event.FdEvent::PrioTask::name = name; + } + if (events & EV_WRITE) { + event.FdEvent::WriteTask::cb = cb; + event.FdEvent::WriteTask::name = name; + } - manager_.set(fd, event.activeEvents(), &event); + 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) @@ -77,9 +95,18 @@ prefix_ void senf::scheduler::FdDispatcher::remove(int fd, int events) 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; + if (events & EV_READ) { + event.FdEvent::ReadTask::cb = 0; + event.FdEvent::ReadTask::name.clear(); + } + if (events & EV_PRIO) { + event.FdEvent::PrioTask::cb = 0; + event.FdEvent::PrioTask::name.clear(); + } + if (events & EV_WRITE) { + event.FdEvent::WriteTask::cb = 0; + event.FdEvent::WriteTask::name.clear(); + } int activeEvents (event.activeEvents()); if (! activeEvents) { @@ -106,7 +133,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;