[Click] Bug in QuickNoteQueue
Eddie Kohler
kohler at cs.ucla.edu
Tue Jun 30 15:30:14 EDT 2009
Hi Ashish,
Thanks for these patches. I've checked in a somewhat different version -- let
me know if it works for you.
Eddie
Ashish Sharma wrote:
> Hi Eddie,
>
> Here is a revised patch that should be thread safe.
> Thanks Cliff for pointing this out.
>
> diff --git a/elements/standard/quicknotequeue.cc
> b/elements/standard/quicknotequeue.cc
> index 88d8b3a..c590925 100644
> --- a/elements/standard/quicknotequeue.cc
> +++ b/elements/standard/quicknotequeue.cc
> @@ -46,7 +46,17 @@ QuickNoteQueue::pull(int)
> if (h != t)
> return pull_success(h, t, nh);
> else
> + {
> + _empty_note.sleep();
> +#if HAVE_MULTITHREAD
> + // Work around race condition between push() and pull().
> + // We might have just undone push()'s Notifier::wake() call.
> + // Easiest lock-free solution: check whether we should wake again!
> + if (size())
> + _empty_note.wake();
> +#endif
> return 0;
> + }
> }
>
> CLICK_ENDDECLS
>
>
>
> Thanks.
>
> Ashish
>
> On Sun, Jun 28, 2009 at 8:01 PM, Ashish Sharma<ashishs.sharma at gmail.com> wrote:
>> Hi Eddie,
>>
>> Thanks for your effort in checking in this new element. I got a chance
>> to test it out only now. There is however one bug in this, the
>> empty_note.sleep is only called when the queue becomes empty, but if
>> the queue is empty to begin with, this goes into a constant polling
>> mode, calling pull in a loop. Here is a possible patch that fixes it.
>> Please consider applying the following patch. Also the suggestion of
>> making the SLEEPINESS_TRIGGER value configurable seems like a good
>> idea. I can write a patch if you think it should be done.
>>
>> diff --git a/elements/standard/quicknotequeue.cc
>> b/elements/standard/quicknotequeue.cc
>> index 88d8b3a..4350346 100644
>> --- a/elements/standard/quicknotequeue.cc
>> +++ b/elements/standard/quicknotequeue.cc
>> @@ -46,7 +46,10 @@ QuickNoteQueue::pull(int)
>> if (h != t)
>> return pull_success(h, t, nh);
>> else
>> + {
>> + _empty_note.sleep();
>> return 0;
>> + }
>> }
>>
>> CLICK_ENDDECLS
>>
>>
>> Thanks
>> Ashish
>>
>>
>> SUB: Notifier::upstream_empty_signal is always active
>>
>> On Sun, Jun 14, 2009 at 9:47 AM, Eddie Kohler<kohler at cs.ucla.edu> wrote:
>>>> If you want not even one failed pull(), that will take some
>>>> reorganization of the code to clear the notifier in a different place (this
>>>> would be easy to do).
>>>
>>> You may be interested in QuickNoteQueue, just checked in.
>>>
>>> Eddie
>>>
>>>
>>>
>>>>> Since the valid/invalid test is an expensive
>>>>> one, what I would like is for the Notifier signal to act like a test
>>>>> function, so I only perform the valid/invalid operation if a queue is
>>>>> non-empty. Further, in case the queue is not empty but belongs to the set
>>>>> of
>>>>> "invalid" queues, I do not want to put the packet back at the head of the
>>>>> queue (of which I cannot think of a simple way of doing from within the
>>>>> scheduler element).
>>>> More generally, it seems like you should make your valid/invalid check
>>>> cheaper. There are many possible ways to do this, including caching old
>>>> values of the check and only updating the cache when necessary.
>>>>
>>>> Eddie
>>>>
>>>>
>>>>> One solution is that I extend the Queue element to include a test
>>>>> function
>>>>> and along with the signal check the test function.
>>>>>
>>>>> Is there a clean way to make the Notifier signal active only when the
>>>>> input
>>>>> queue is really non-empty and not a false alarm?
>>>>>
>>>>> Thank you for your time. I would really appreciate any suggestions or
>>>>> thoughts.
>>>>>
>>>>> Thanks
>>>>> Ashish
>>>>> _______________________________________________
>>>>> click mailing list
>>>>> click at amsterdam.lcs.mit.edu
>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>> _______________________________________________
>>>> click mailing list
>>>> click at amsterdam.lcs.mit.edu
>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list