@@ -585,16 +585,49 @@ struct commit_list *filter_skipped(struct commit_list *list,
585
585
return filtered ;
586
586
}
587
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 )
591
622
{
592
- int index , i ;
593
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 );
594
628
595
629
cur = list ;
596
630
previous = NULL ;
597
- index = count * skip_num / skip_denom ;
598
631
599
632
for (i = 0 ; cur ; cur = cur -> next , i ++ ) {
600
633
if (i == index ) {
@@ -614,7 +647,6 @@ static struct commit_list *managed_skipped(struct commit_list *list,
614
647
struct commit_list * * tried )
615
648
{
616
649
int count , skipped_first ;
617
- int skip_num , skip_denom ;
618
650
619
651
* tried = NULL ;
620
652
@@ -626,11 +658,7 @@ static struct commit_list *managed_skipped(struct commit_list *list,
626
658
if (!skipped_first )
627
659
return list ;
628
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 );
634
662
}
635
663
636
664
static void bisect_rev_setup (struct rev_info * revs , const char * prefix ,
0 commit comments