Messages in this thread | | | Subject | Re: list sort | From | Steven Whitehouse <> | Date | Wed, 27 Jul 2011 16:04:19 +0100 |
| |
Hi,
On Wed, 2011-07-27 at 16:45 +0200, Clemens Ladisch wrote: > Steven Whitehouse wrote: > > There seems to be an issue with list_sort trying to compare an object to > > itself. [...] > > While it appears generally harmless, since the list does appear to be > > correctly sorted, it is doing extra work needlessly. > > There are sort algorithms where this happens naturally, and adding > an additional check to avoid calling the comparison function when the > pointers are equal would be more work overall than just calling cmp(). > > This does not happen with list_sort()'s merge sort, but I've noticed > the following hack in merge_and_restore_back_links(): > > do { > /* > * In worst cases this loop may run many iterations. > * Continue callbacks to the client even though no > * element comparison is needed, so the client's cmp() > * routine can invoke cond_resched() periodically. > */ > (*cmp)(priv, tail->next, tail->next); > > tail->next->prev = tail; > tail = tail->next; > } while (tail->next); > > When there is no cond_resched() call, this is indeed needless work. > > However, if the list is so short that cond_resched() is not needed, > the additional comparisons should not hurt anyway. > > > Regards, > Clemens
Ah, I see now... that makes some kind of sense I think. I didn't expect the cmp routine to be dual purpose in that way,
Steve.
| |