Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include	<u.h>
2
#include	<libc.h>
3
 
4
int	ulcmp(void*, void*);
5
void	swapem(ulong*, long);
6
 
7
enum
8
{
9
	Wormsize	= 157933,
10
};
11
int	wflag;
12
 
13
void
14
main(int argc, char *argv[])
15
{
16
	long i, l, x, lobits, hibits, tot;
17
	int f, j;
18
	char *file;
19
	ulong *b, a, lo, hi;
20
 
21
	ARGBEGIN {
22
	default:
23
		print("usage: disk/exsort [-w] [file]\n");
24
		exits("usage");
25
	case 'w':
26
		wflag++;
27
		break;
28
	} ARGEND;
29
 
30
	file = "/adm/cache";
31
	if(argc > 0)
32
		file = argv[0];
33
 
34
	if(wflag)
35
		f = open(file, ORDWR);
36
	else
37
		f = open(file, OREAD);
38
	if(f < 0) {
39
		print("cant open %s: %r\n", file);
40
		exits("open");
41
	}
42
	l = seek(f, 0, 2) / sizeof(long);
43
 
44
	b = malloc(l*sizeof(long));
45
	if(b == 0) {
46
		print("cant malloc %s: %r\n", file);
47
		exits("malloc");
48
	}
49
	seek(f, 0, 0);
50
	if(read(f, b, l*sizeof(long)) != l*sizeof(long)) {
51
		print("short read %s: %r\n", file);
52
		exits("read");
53
	}
54
 
55
	lobits = 0;
56
	hibits = 0;
57
	for(i=0; i<l; i++) {
58
		a = b[i];
59
		if(a & (1L<<7))
60
			lobits++;
61
		if(a & (1L<<31))
62
			hibits++;
63
	}
64
 
65
	print("lobits = %6ld\n", lobits);
66
	print("hibits = %6ld\n", hibits);
67
 
68
	if(hibits > lobits) {
69
		print("swapping\n");
70
		swapem(b, l);
71
	}
72
 
73
	qsort(b, l, sizeof(ulong), ulcmp);
74
 
75
	tot = 0;
76
	for(j=0; j<100; j++) {
77
		lo = j*Wormsize;
78
		hi = lo + Wormsize;
79
 
80
		x = 0;
81
		for(i=0; i<l; i++) {
82
			a = b[i];
83
			if(a >= lo && a < hi)
84
				x++;
85
		}
86
		if(x) {
87
			print("disk %2d %6ld blocks\n", j, x);
88
			tot += x;
89
		}
90
	}
91
	print("total   %6ld blocks\n", tot);
92
 
93
 
94
	if(wflag) {
95
		if(hibits > lobits)
96
			swapem(b, l);
97
		seek(f, 0, 0);
98
		if(write(f, b, l*sizeof(long)) != l*sizeof(long)) {
99
			print("short write %s\n", file);
100
			exits("write");
101
		}
102
	}
103
 
104
	exits(0);
105
}
106
 
107
int
108
ulcmp(void *va, void *vb)
109
{
110
	ulong *a, *b;
111
 
112
	a = va;
113
	b = vb;
114
 
115
	if(*a > *b)
116
		return 1;
117
	if(*a < *b)
118
		return -1;
119
	return 0;
120
}
121
 
122
void
123
swapem(ulong *b, long l)
124
{
125
	long i;
126
	ulong x, a;
127
 
128
	for(i=0; i<l; i++, b++) {
129
		a = *b;
130
		x = (((a>>0) & 0xff) << 24) |
131
			(((a>>8) & 0xff) << 16) |
132
			(((a>>16) & 0xff) << 8) |
133
			(((a>>24) & 0xff) << 0);
134
		*b = x;
135
	}
136
}