1 /*
2 * Copyright 2013 Paweł Dziepak, pdziepak@quarnos.org.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef _KERNEL_LOAD_TRACKING_H
6 #define _KERNEL_LOAD_TRACKING_H
7
8
9 #include <OS.h>
10
11
12 const int32 kMaxLoad = 1000;
13 const bigtime_t kLoadMeasureInterval = 1000;
14 const bigtime_t kIntervalInaccuracy = kLoadMeasureInterval / 4;
15
16
17 static inline int32
compute_load(bigtime_t & measureTime,bigtime_t & measureActiveTime,int32 & load,bigtime_t now)18 compute_load(bigtime_t& measureTime, bigtime_t& measureActiveTime, int32& load,
19 bigtime_t now)
20 {
21 if (measureTime == 0) {
22 measureTime = now;
23 return -1;
24 }
25
26 bigtime_t deltaTime = now - measureTime;
27
28 if (deltaTime < kLoadMeasureInterval)
29 return -1;
30
31 int32 oldLoad = load;
32 ASSERT(oldLoad >= 0 && oldLoad <= kMaxLoad);
33
34 int32 newLoad = measureActiveTime * kMaxLoad;
35 newLoad /= max_c(deltaTime, 1);
36 newLoad = max_c(min_c(newLoad, kMaxLoad), 0);
37
38 measureActiveTime = 0;
39 measureTime = now;
40
41 deltaTime += kIntervalInaccuracy;
42 bigtime_t n = deltaTime / kLoadMeasureInterval;
43 ASSERT(n > 0);
44
45 if (n > 10)
46 load = newLoad;
47 else {
48 newLoad *= (1 << n) - 1;
49 load = (load + newLoad) / (1 << n);
50 ASSERT(load >= 0 && load <= kMaxLoad);
51 }
52
53 return oldLoad;
54 }
55
56
57 #endif // _KERNEL_LOAD_TRACKING_H
58