1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)networkdelta.c	2.5 (Berkeley) 07/15/91";
10 #endif /* not lint */
11 
12 #include "globals.h"
13 #include <protocols/timed.h>
14 
15 extern int machup;
16 
17 /*
18  * `networkdelta' selects the largest set of deltas that fall within the
19  * interval RANGE, and uses them to compute the network average delta
20  */
21 
22 long networkdelta()
23 {
24 	int i, j, maxind, minind;
25 	int ext;
26 	int tempind;
27 	long tempdata;
28 	long x[NHOSTS];
29 	long average;
30 
31 	for (i=0; i<slvcount; i++)
32 		x[i] = hp[i].delta;
33 	for (i=0; i<slvcount-1; i++) {
34 		tempdata = x[i];
35 		tempind = i;
36 		for (j=i+1; j<slvcount; j++) {
37 			if (x[j] < tempdata) {
38 				tempdata = x[j];
39 				tempind = j;
40 			}
41 		}
42 		x[tempind] = x[i];
43 		x[i] = tempdata;
44 	}
45 
46 	/* this piece of code is critical: DO NOT TOUCH IT! */
47 /****/
48 	i=0; j=1; minind=0; maxind=1;
49 	if (machup == 2)
50 		goto compute;
51 	do {
52 		if (x[j]-x[i] <= RANGE)
53 			j++;
54 		else {
55 			if (j > i+1)
56  				j--;
57 			if ((x[j]-x[i] <= RANGE) && (j-i >= maxind-minind)) {
58 				minind=i;
59 				maxind=j;
60 			}
61 			i++;
62 			if(i == j)
63 				j++;
64 		}
65 	} while (j < machup);
66 	if ((x[machup-1] - x[i] <= RANGE) && (machup-i-1 >= maxind-minind)) {
67 		minind=i; maxind=machup-1;
68 	}
69 /****/
70 compute:
71 	ext = maxind - minind + 1;
72 	average = 0;
73 	for (i=minind; i<=maxind; i++)
74 		average += x[i];
75 	average /= ext;
76 	return(average);
77 }
78