]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
88277985 | 2 | * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
064af421 | 7 | * |
a14bc59f BP |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
064af421 BP |
15 | */ |
16 | ||
17 | #ifndef COVERAGE_H | |
18 | #define COVERAGE_H 1 | |
19 | ||
20 | /* This file implements a simple form of coverage instrumentation. Points in | |
21 | * source code that are of interest must be explicitly annotated with | |
22 | * COVERAGE_INC. The coverage counters may be logged at any time with | |
23 | * coverage_log(). | |
24 | * | |
25 | * This form of coverage instrumentation is intended to be so lightweight that | |
26 | * it can be enabled in production builds. It is obviously not a substitute | |
27 | * for traditional coverage instrumentation with e.g. "gcov", but it is still | |
28 | * a useful debugging tool. */ | |
29 | ||
857165b5 | 30 | #include "ovs-thread.h" |
5521e08e | 31 | #include "compiler.h" |
064af421 | 32 | |
98cf638b AW |
33 | /* Makes coverage_run run every 5000 ms (5 seconds). |
34 | * If this value is redefined, the new value must | |
35 | * divide 60000 (1 minute). */ | |
36 | #define COVERAGE_RUN_INTERVAL 5000 | |
37 | BUILD_ASSERT_DECL(60000 % COVERAGE_RUN_INTERVAL == 0); | |
38 | ||
bc0d88ee JS |
39 | #define COVERAGE_CLEAR_INTERVAL 1000 |
40 | BUILD_ASSERT_DECL(COVERAGE_RUN_INTERVAL % COVERAGE_CLEAR_INTERVAL == 0); | |
41 | ||
98cf638b AW |
42 | /* Defines the moving average array length. */ |
43 | #define MIN_AVG_LEN (60000/COVERAGE_RUN_INTERVAL) | |
44 | #define HR_AVG_LEN 60 | |
45 | ||
064af421 BP |
46 | /* A coverage counter. */ |
47 | struct coverage_counter { | |
857165b5 BP |
48 | const char *const name; /* Textual name. */ |
49 | unsigned int (*const count)(void); /* Gets, zeros this thread's count. */ | |
50 | unsigned long long int total; /* Total count. */ | |
98cf638b AW |
51 | unsigned long long int last_total; |
52 | /* The moving average arrays. */ | |
53 | unsigned int min[MIN_AVG_LEN]; | |
54 | unsigned int hr[HR_AVG_LEN]; | |
064af421 BP |
55 | }; |
56 | ||
5521e08e HS |
57 | void coverage_counter_register(struct coverage_counter*); |
58 | ||
d76f09ea BP |
59 | /* Defines COUNTER. There must be exactly one such definition at file scope |
60 | * within a program. */ | |
d76f09ea | 61 | #define COVERAGE_DEFINE(COUNTER) \ |
857165b5 BP |
62 | DEFINE_STATIC_PER_THREAD_DATA(unsigned int, \ |
63 | counter_##COUNTER, 0); \ | |
64 | static unsigned int COUNTER##_count(void) \ | |
65 | { \ | |
66 | unsigned int *countp = counter_##COUNTER##_get(); \ | |
67 | unsigned int count = *countp; \ | |
68 | *countp = 0; \ | |
69 | return count; \ | |
70 | } \ | |
71 | static inline void COUNTER##_add(unsigned int n) \ | |
72 | { \ | |
73 | *counter_##COUNTER##_get() += n; \ | |
74 | } \ | |
75 | extern struct coverage_counter counter_##COUNTER; \ | |
76 | struct coverage_counter counter_##COUNTER \ | |
98cf638b | 77 | = { #COUNTER, COUNTER##_count, 0, 0, {0}, {0} }; \ |
493f017d | 78 | OVS_CONSTRUCTOR(COUNTER##_init_coverage) { \ |
5521e08e HS |
79 | coverage_counter_register(&counter_##COUNTER); \ |
80 | } | |
d76f09ea BP |
81 | |
82 | /* Adds 1 to COUNTER. */ | |
857165b5 | 83 | #define COVERAGE_INC(COUNTER) COVERAGE_ADD(COUNTER, 1) |
d76f09ea BP |
84 | |
85 | /* Adds AMOUNT to COUNTER. */ | |
857165b5 | 86 | #define COVERAGE_ADD(COUNTER, AMOUNT) COUNTER##_add(AMOUNT) |
064af421 | 87 | |
f5c6854a | 88 | void coverage_init(void); |
a5f607bc | 89 | void coverage_log(void); |
064af421 | 90 | void coverage_clear(void); |
fbe0962b | 91 | void coverage_try_clear(void); |
98cf638b | 92 | void coverage_run(void); |
064af421 BP |
93 | |
94 | #endif /* coverage.h */ |