[Click] NotifierQueue on multi-threaded Click problem.

Joonwoo Park joonwpark81 at gmail.com
Thu Sep 13 23:05:16 EDT 2007


Well..
It's hard to agree with slowing down code.
BTW Do I need something like this?
Recently move_thread can make another thread's sleeping.

diff --git a/lib/task.cc b/lib/task.cc
index 197859c..a087b3b 100644
--- a/lib/task.cc
+++ b/lib/task.cc
@@ -383,8 +383,8 @@ Task::move_thread(int thread_id)
        if (old_thread->thread_id() != _home_thread_id
            && old_thread->thread_id() != RouterThread::THREAD_STRONG_UNSCHEDULE
) {
            if (scheduled()) {
-               _should_be_scheduled = true;
                fast_unschedule();
+               _should_be_scheduled = true;
            }
            _thread = _router->master()->thread(_home_thread_id);
            old_thread->unlock_tasks();

Joonwoo Park

2007/9/14, Eddie Kohler <kohler at cs.ucla.edu>:
> AARGH!
>
> Well, thanks as usual for the bug report.
>
> I think though that this is one of those cases where your lock does not
> actually fix the problem, it just makes the race condition much less
> likely by slowing down the code.
>
> I have attempted to fix the problem in a different way.  The commit
> message has more.  Let me know how it does....
> Eddie
>
>
>
>
> Joonwoo Park wrote:
> > Unfortunately, A few hours ago I found that my test machine has gone
> > into hibernation.
> > It had worked for about 3 ~ 4 days maybe.
> > And I found that I can reproduce the problem in short time with
> > SLEEPINESS_TRIGGER=1.
> > IMHO, I think process_pending() still has problem.
> > When another thread's Task::add_pending see 'if (!_pending_nextptr)'
> > as FALSE, at the same time if we set it to 0, thread->add_pending()
> > cannot be called again (only if _pending_reschedule is FALSE).
> > As a result, It's seems that a routerthread go sleep forever.
> > I tried patch and It works fine although SLEEPINESS_TRIGGER=1. (I have
> > never seen before working SLEEPINESS_TRIGGER=1)
> > How about this?
> >
> > -
> > Signed-off-by: Joonwoo Park <joonwpark81 at gmail.com>
> >
> >  lib/master.cc |    8 ++++++++
> >  1 files changed, 8 insertions(+), 0 deletions(-)
> >
> > diff --git a/lib/master.cc b/lib/master.cc
> > index 5a56371..cef62be 100644
> > --- a/lib/master.cc
> > +++ b/lib/master.cc
> > @@ -370,7 +370,15 @@ Master::process_pending(RouterThread *thread)
> >      // process the list
> >      while (Task *t = Task::pending_to_task(my_pending)) {
> >       my_pending = t->_pending_nextptr;
> > +     // when another thread's Task::add_pending see 'if (!_pending_nextptr)'
> > +     // as FALSE, at the same time if we set it to 0, thread->add_pending()
> > +     // cannot be called again (only if _pending_reschedule is 0).
> > +     bool lock = !t->_pending_reschedule;
> > +     if (lock)
> > +             flags = _task_lock.acquire();
> >       t->_pending_nextptr = 0;
> > +     if (lock)
> > +             _task_lock.release(flags);
> >       t->process_pending(thread);
> >      }
> >  }
> > -
> >
> > Joonwoo Park
>


More information about the click mailing list