585
return filtered;
586
}
587
588
-static struct commit_list *apply_skip_ratio(struct commit_list *list,
589
- int count,
590
- int skip_num, int skip_denom)
588
+#define PRN_MODULO 32768
589
+
590
+/*
591
+ * This is a pseudo random number generator based on "man 3 rand".
592
+ * It is not used properly because the seed is the argument and it
593
+ * is increased by one between each call, but that should not matter
594
+ * for this application.
595
+ */
596
+int get_prn(int count) {
597
+ count = count * 1103515245 + 12345;
598
+ return ((unsigned)(count/65536) % PRN_MODULO);
599
+}
600
+
601
+/*
602
+ * Custom integer square root from
603
+ * http://en.wikipedia.org/wiki/Integer_square_root
604
+ */
605
+static int sqrti(int val)
606
+{
607
+ float d, x = val;
608
+
609
+ if (val == 0)
610
+ return 0;
611
+
612
+ do {
613
+ float y = (x + (float)val / x) / 2;
614
+ d = (y > x) ? y - x : x - y;
615
+ x = y;
616
+ } while (d >= 0.5);
617
+
618
+ return (int)x;
619
+}
620
+
621
+static struct commit_list *skip_away(struct commit_list *list, int count)
622
{
592
- int index, i;
623
struct commit_list *cur, *previous;
624
+ int prn, index, i;
625
+
626
+ prn = get_prn(count);
627
+ index = (count * prn / PRN_MODULO) * sqrti(prn) / sqrti(PRN_MODULO);
628
629
cur = list;
630
previous = NULL;
597
- index = count * skip_num / skip_denom;
631
632
for (i = 0; cur; cur = cur->next, i++) {
633
if (i == index) {
647
struct commit_list **tried)
648
{
649
int count, skipped_first;
617
- int skip_num, skip_denom;
650
651
*tried = NULL;
652
658
if (!skipped_first)
659
return list;
660
629
- /* Use alternatively 1/5, 2/5 and 3/5 as skip ratio. */
630
- skip_num = count % 3 + 1;
631
- skip_denom = 5;
632
-
633
- return apply_skip_ratio(list, count, skip_num, skip_denom);
661
+ return skip_away(list, count);
662
}
663
664
static void bisect_rev_setup(struct rev_info *revs, const char *prefix,