From: Pavel Charvat Date: Wed, 16 Jun 2010 19:16:01 +0000 (+0200) Subject: mainloop: Optimized heaps in timers. X-Git-Tag: holmes-import~3 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=a32f67d1b4d960803e55a65408f834f126c3dd90;p=libucw.git mainloop: Optimized heaps in timers. --- diff --git a/ucw/mainloop.c b/ucw/mainloop.c index a9b5e3e1..06db44ff 100644 --- a/ucw/mainloop.c +++ b/ucw/mainloop.c @@ -81,19 +81,36 @@ timer_add(struct main_timer *tm, timestamp_t expires) DBG("MAIN: Setting timer %p (expire at now+%lld)", tm, (long long)(expires-main_now)); else DBG("MAIN: Clearing timer %p", tm); - if (tm->expires) + if (tm->expires < expires) { - ASSERT(tm->index && tm->index <= main_timer_cnt); - HEAP_DELETE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index); - tm->index = 0; + if (!tm->expires) + { + tm->expires = expires; + tm->index = ++main_timer_cnt; + main_timer_table_grow(&main_timer_table, tm->index + 1); + main_timer_table.ptr[tm->index] = tm; + HEAP_INSERT(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP); + } + else + { + tm->expires = expires; + HEAP_INCREASE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index); + } } - tm->expires = expires; - if (expires) + else if (tm->expires > expires) { - tm->index = ++main_timer_cnt; - main_timer_table_grow(&main_timer_table, tm->index + 1); - main_timer_table.ptr[tm->index] = tm; - HEAP_INSERT(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP); + if (!expires) + { + ASSERT(tm->index && tm->index <= main_timer_cnt); + HEAP_DELETE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index); + tm->index = 0; + tm->expires = 0; + } + else + { + tm->expires = expires; + HEAP_DECREASE(struct main_timer *, main_timer_table.ptr, main_timer_cnt, MAIN_TIMER_LESS, MAIN_TIMER_SWAP, tm->index); + } } }