--- libev/ev.c 2008/05/21 12:51:38 1.246 +++ libev/ev.c 2008/05/21 21:22:10 1.247 @@ -804,6 +804,7 @@ #define DHEAP 4 #define HEAP0 (DHEAP - 1) /* index of first element in heap */ +#define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0) /* towards the root */ void inline_speed @@ -813,7 +814,7 @@ for (;;) { - int p = ((k - HEAP0 - 1) / DHEAP) + HEAP0; + int p = HPARENT (k); if (p == k || ANHE_at (heap [p]) <= ANHE_at (he)) break; @@ -823,8 +824,8 @@ k = p; } - ev_active (ANHE_w (he)) = k; heap [k] = he; + ev_active (ANHE_w (he)) = k; } /* away from the root */ @@ -861,19 +862,20 @@ if (ANHE_at (he) <= minat) break; - ev_active (ANHE_w (*minpos)) = k; heap [k] = *minpos; + ev_active (ANHE_w (*minpos)) = k; k = minpos - heap; } - ev_active (ANHE_w (he)) = k; heap [k] = he; + ev_active (ANHE_w (he)) = k; } #else // 4HEAP #define HEAP0 1 +#define HPARENT(k) ((k) >> 1) /* towards the root */ void inline_speed @@ -883,7 +885,7 @@ for (;;) { - int p = k >> 1; + int p = HPARENT (k); /* maybe we could use a dummy element at heap [0]? */ if (!p || ANHE_at (heap [p]) <= ANHE_at (he)) @@ -931,8 +933,10 @@ void inline_size adjustheap (ANHE *heap, int N, int k) { - upheap (heap, k); - downheap (heap, N, k); + if (k > HEAP0 && ANHE_at (heap [HPARENT (k)]) >= ANHE_at (heap [k])) + upheap (heap, k); + else + downheap (heap, N, k); } /*****************************************************************************/