ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libeio/eio.c
(Generate patch)

Comparing libeio/eio.c (file contents):
Revision 1.37 by root, Fri Jun 12 16:48:08 2009 UTC vs.
Revision 1.38 by root, Fri Jun 12 20:01:42 2009 UTC

1002#define EIO_QSORT_CUTOFF 20 /* quite high, but performs well on many filesystems */ 1002#define EIO_QSORT_CUTOFF 20 /* quite high, but performs well on many filesystems */
1003 1003
1004static void 1004static void
1005eio_dent_sort (eio_dirent *dents, int size) 1005eio_dent_sort (eio_dirent *dents, int size)
1006{ 1006{
1007 /* should be good for 2**31 entries */
1008 struct rng { int l, r; } rng [32];
1009 int i, j; 1007 int i, j;
1010 1008
1011 i = 0; 1009 if (size > EIO_QSORT_CUTOFF * 3) /* skip quicksort for small directories */
1012 rng[0].l = 0;
1013 rng[0].r = size;
1014
1015 while (expect_true (i >= 0))
1016 { 1010 {
1017 int L = rng [i].l; 1011 /* first, use quicksort */
1018 int R = rng [i].r - 1; 1012 /* should be good for 2**31 entries */
1013 struct rng { int l, r; } rng [32];
1019 1014
1020 if (expect_false (L + EIO_QSORT_CUTOFF < R)) 1015 i = 0;
1016 rng[0].l = 0;
1017 rng[0].r = size;
1018
1019 while (expect_true (i >= 0))
1021 { 1020 {
1022 eio_dirent piv = dents [L]; 1021 int L = rng [i].l;
1022 int R = rng [i].r - 1;
1023 1023
1024 while (L < R) 1024 if (expect_false (L + EIO_QSORT_CUTOFF < R))
1025 { 1025 {
1026 eio_dirent piv = dents [L];
1027
1028 while (L < R)
1029 {
1026 while (eio_dent_cmp (&dents [R], &piv) >= 0 && L < R) 1030 while (eio_dent_cmp (&dents [R], &piv) >= 0 && L < R)
1027 --R; 1031 --R;
1028 1032
1029 if (L < R) 1033 if (L < R)
1030 dents [L++] = dents [R]; 1034 dents [L++] = dents [R];
1031 1035
1032 while (eio_dent_cmp (&dents [L], &piv) <= 0 && L < R) 1036 while (eio_dent_cmp (&dents [L], &piv) <= 0 && L < R)
1033 ++L; 1037 ++L;
1034 1038
1035 if (L < R) 1039 if (L < R)
1036 dents [R--] = dents [L]; 1040 dents [R--] = dents [L];
1041 }
1042
1043 dents [L] = piv;
1044
1045 ++i;
1046 rng [i].l = L + 1;
1047 rng [i].r = rng [i - 1].r;
1048 rng [i - 1].r = L;
1049
1050 if (rng [i].r - rng [i].l > rng [i - 1].r - rng [i - 1].l)
1051 {
1052 struct rng t;
1053
1054 t = rng [i]; rng [i] = rng [i - 1]; rng [i - 1] = t;
1055 }
1037 } 1056 }
1038 1057 else
1039 dents [L] = piv;
1040
1041 ++i;
1042 rng [i].l = L + 1;
1043 rng [i].r = rng [i - 1].r;
1044 rng [i - 1].r = L;
1045
1046 if (rng [i].r - rng [i].l > rng [i - 1].r - rng [i - 1].l)
1047 { 1058 --i;
1048 struct rng t;
1049
1050 t = rng [i]; rng [i] = rng [i - 1]; rng [i - 1] = t;
1051 }
1052 } 1059 }
1053 else
1054 --i;
1055 } 1060 }
1056 1061
1057 /* use a simple insertion sort at the end */ 1062 /* use a simple insertion sort at the end */
1058 for (i = 1; i < size; ++i) 1063 for (i = 1; i < size; ++i)
1059 { 1064 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines