commit edaadfbc3f3aa875d02f68b858ac44b128898f79 from: Omar Polo date: Mon Feb 19 15:39:31 2024 UTC ev: fix/improve cancel_timer and ev_timer_cancel we only reach cancel_timer() for timers in the hap, so delete the unreachable code, and improve what we have. When deleting from the reserve space, just move the last element in the place of the removed one, no need to move everything. It'll be heapified later anyway. commit - 04ffa662adc8ee1b45fcd633c519bbe21f78f93a commit + edaadfbc3f3aa875d02f68b858ac44b128898f79 blob - 012a52f33f76a50f7775584c494436504130e5bf blob + 9ff9a52fad425da5c38844c0c0e01ed19bd459b8 --- ev.c +++ ev.c @@ -366,17 +366,10 @@ bubbledown(size_t i) static inline void cancel_timer(size_t i) { - /* special case: it's the last one */ - if (i == base->ntimers - 1) { - base->ntimers--; - memset(&base->timers[base->ntimers], 0, sizeof(*base->timers)); - return; - } - - memcpy(&base->timers[i], &base->timers[base->ntimers - 1], - sizeof(*base->timers)); base->ntimers--; - + if (i != base->ntimers) + memcpy(&base->timers[i], &base->timers[base->ntimers], + sizeof(*base->timers)); bubbledown(i); } @@ -394,11 +387,9 @@ ev_timer_cancel(unsigned int id) } base->reserve_till--; - if (i != base->reserve_till) - memmove(&base->timers[i], &base->timers[i + 1], - (base->reserve_till - i) * sizeof(*base->timers)); - + memcpy(&base->timers[i], &base->timers[base->reserve_till], + sizeof(*base->timers)); return (0); }