Commit Diff


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);
 }