ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.c
(Generate patch)

Comparing libev/ev.c (file contents):
Revision 1.238 by root, Thu May 8 20:49:12 2008 UTC vs.
Revision 1.240 by root, Thu May 8 21:21:41 2008 UTC

766 * a small-code-size 2-heap one and a ~1.5kb larger 4-heap 766 * a small-code-size 2-heap one and a ~1.5kb larger 4-heap
767 * which is more cache-efficient. 767 * which is more cache-efficient.
768 * the difference is about 5% with 50000+ watchers. 768 * the difference is about 5% with 50000+ watchers.
769 */ 769 */
770#define USE_4HEAP !EV_MINIMAL 770#define USE_4HEAP !EV_MINIMAL
771#define USE_4HEAP 1/* they do not work corretcly */
772#if USE_4HEAP 771#if USE_4HEAP
773 772
774#define DHEAP 4 773#define DHEAP 4
775#define HEAP0 (DHEAP - 1) /* index of first element in heap */ 774#define HEAP0 (DHEAP - 1) /* index of first element in heap */
776 775
777/* towards the root */ 776/* towards the root */
778void inline_speed 777void inline_speed
779upheap (WT *heap, int k) 778upheap (WT *heap, int k)
780{ 779{
781 WT w = heap [k]; 780 WT w = heap [k];
781 ev_tstamp w_at = w->at;
782 782
783 for (;;) 783 for (;;)
784 { 784 {
785 int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; 785 int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0;
786 786
787 if (p == k || heap [p]->at <= w->at) 787 if (p == k || heap [p]->at <= w_at)
788 break; 788 break;
789 789
790 heap [k] = heap [p]; 790 heap [k] = heap [p];
791 ev_active (heap [k]) = k; 791 ev_active (heap [k]) = k;
792 k = p; 792 k = p;
810 WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0; 810 WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0;
811 811
812 // find minimum child 812 // find minimum child
813 if (expect_true (pos + DHEAP - 1 < E)) 813 if (expect_true (pos + DHEAP - 1 < E))
814 { 814 {
815 /* fast path */
816 (minpos = pos + 0), (minat = (*minpos)->at); 815 /* fast path */ (minpos = pos + 0), (minat = (*minpos)->at);
817 if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); 816 if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at);
818 if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); 817 if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at);
819 if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); 818 if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at);
820 } 819 }
821 else 820 else if (pos < E)
822 { 821 {
823 /* slow path */
824 if (pos >= E)
825 break;
826 (minpos = pos + 0), (minat = (*minpos)->at); 822 /* slow path */ (minpos = pos + 0), (minat = (*minpos)->at);
827 if (pos + 1 < E && pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); 823 if (pos + 1 < E && pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at);
828 if (pos + 2 < E && pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); 824 if (pos + 2 < E && pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at);
829 if (pos + 3 < E && pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); 825 if (pos + 3 < E && pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at);
830 } 826 }
827 else
828 break;
831 829
832 if (w->at <= minat) 830 if (w->at <= minat)
833 break; 831 break;
834 832
835 ev_active (*minpos) = k; 833 ev_active (*minpos) = k;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines