… | |
… | |
776 | /* towards the root */ |
776 | /* towards the root */ |
777 | void inline_speed |
777 | void inline_speed |
778 | upheap (WT *heap, int k) |
778 | upheap (WT *heap, int k) |
779 | { |
779 | { |
780 | WT w = heap [k]; |
780 | WT w = heap [k]; |
|
|
781 | ev_tstamp w_at = w->at; |
781 | |
782 | |
782 | for (;;) |
783 | for (;;) |
783 | { |
784 | { |
784 | int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; |
785 | int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; |
785 | |
786 | |
786 | if (p == k || heap [p]->at <= w->at) |
787 | if (p == k || heap [p]->at <= w_at) |
787 | break; |
788 | break; |
788 | |
789 | |
789 | heap [k] = heap [p]; |
790 | heap [k] = heap [p]; |
790 | ev_active (heap [k]) = k; |
791 | ev_active (heap [k]) = k; |
791 | k = p; |
792 | k = p; |
… | |
… | |
809 | WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0; |
810 | WT *pos = heap + DHEAP * (k - HEAP0) + HEAP0; |
810 | |
811 | |
811 | // find minimum child |
812 | // find minimum child |
812 | if (expect_true (pos + DHEAP - 1 < E)) |
813 | if (expect_true (pos + DHEAP - 1 < E)) |
813 | { |
814 | { |
814 | /* fast path */ |
|
|
815 | (minpos = pos + 0), (minat = (*minpos)->at); |
815 | /* fast path */ (minpos = pos + 0), (minat = (*minpos)->at); |
816 | if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
816 | if (pos [1]->at < minat) (minpos = pos + 1), (minat = (*minpos)->at); |
817 | if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
817 | if (pos [2]->at < minat) (minpos = pos + 2), (minat = (*minpos)->at); |
818 | if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
818 | if (pos [3]->at < minat) (minpos = pos + 3), (minat = (*minpos)->at); |
819 | } |
819 | } |
820 | else |
820 | else if (pos < E) |
821 | { |
821 | { |
822 | /* slow path */ |
|
|
823 | if (pos >= E) |
|
|
824 | break; |
|
|
825 | (minpos = pos + 0), (minat = (*minpos)->at); |
822 | /* slow path */ (minpos = pos + 0), (minat = (*minpos)->at); |
826 | 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); |
827 | 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); |
828 | 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); |
829 | } |
826 | } |
|
|
827 | else |
|
|
828 | break; |
830 | |
829 | |
831 | if (w->at <= minat) |
830 | if (w->at <= minat) |
832 | break; |
831 | break; |
833 | |
832 | |
834 | ev_active (*minpos) = k; |
833 | ev_active (*minpos) = k; |