diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/disk/exsort.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/disk/exsort.c')
-rwxr-xr-x | sys/src/cmd/disk/exsort.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/sys/src/cmd/disk/exsort.c b/sys/src/cmd/disk/exsort.c new file mode 100755 index 000000000..4a04c845a --- /dev/null +++ b/sys/src/cmd/disk/exsort.c @@ -0,0 +1,136 @@ +#include <u.h> +#include <libc.h> + +int ulcmp(void*, void*); +void swapem(ulong*, long); + +enum +{ + Wormsize = 157933, +}; +int wflag; + +void +main(int argc, char *argv[]) +{ + long i, l, x, lobits, hibits, tot; + int f, j; + char *file; + ulong *b, a, lo, hi; + + ARGBEGIN { + default: + print("usage: disk/exsort [-w] [file]\n"); + exits("usage"); + case 'w': + wflag++; + break; + } ARGEND; + + file = "/adm/cache"; + if(argc > 0) + file = argv[0]; + + if(wflag) + f = open(file, ORDWR); + else + f = open(file, OREAD); + if(f < 0) { + print("cant open %s: %r\n", file); + exits("open"); + } + l = seek(f, 0, 2) / sizeof(long); + + b = malloc(l*sizeof(long)); + if(b == 0) { + print("cant malloc %s: %r\n", file); + exits("malloc"); + } + seek(f, 0, 0); + if(read(f, b, l*sizeof(long)) != l*sizeof(long)) { + print("short read %s: %r\n", file); + exits("read"); + } + + lobits = 0; + hibits = 0; + for(i=0; i<l; i++) { + a = b[i]; + if(a & (1L<<7)) + lobits++; + if(a & (1L<<31)) + hibits++; + } + + print("lobits = %6ld\n", lobits); + print("hibits = %6ld\n", hibits); + + if(hibits > lobits) { + print("swapping\n"); + swapem(b, l); + } + + qsort(b, l, sizeof(ulong), ulcmp); + + tot = 0; + for(j=0; j<100; j++) { + lo = j*Wormsize; + hi = lo + Wormsize; + + x = 0; + for(i=0; i<l; i++) { + a = b[i]; + if(a >= lo && a < hi) + x++; + } + if(x) { + print("disk %2d %6ld blocks\n", j, x); + tot += x; + } + } + print("total %6ld blocks\n", tot); + + + if(wflag) { + if(hibits > lobits) + swapem(b, l); + seek(f, 0, 0); + if(write(f, b, l*sizeof(long)) != l*sizeof(long)) { + print("short write %s\n", file); + exits("write"); + } + } + + exits(0); +} + +int +ulcmp(void *va, void *vb) +{ + ulong *a, *b; + + a = va; + b = vb; + + if(*a > *b) + return 1; + if(*a < *b) + return -1; + return 0; +} + +void +swapem(ulong *b, long l) +{ + long i; + ulong x, a; + + for(i=0; i<l; i++, b++) { + a = *b; + x = (((a>>0) & 0xff) << 24) | + (((a>>8) & 0xff) << 16) | + (((a>>16) & 0xff) << 8) | + (((a>>24) & 0xff) << 0); + *b = x; + } +} |