aboutsummaryrefslogtreecommitdiff
path: root/lib/coverage.h
blob: 98b6a85b23fb4c39d66e89841c7493ac1323220e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * Copyright (c) 2009 Nicira Networks.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef COVERAGE_H
#define COVERAGE_H 1

/* This file implements a simple form of coverage instrumentation.  Points in
 * source code that are of interest must be explicitly annotated with
 * COVERAGE_INC.  The coverage counters may be logged at any time with
 * coverage_log().
 *
 * This form of coverage instrumentation is intended to be so lightweight that
 * it can be enabled in production builds.  It is obviously not a substitute
 * for traditional coverage instrumentation with e.g. "gcov", but it is still
 * a useful debugging tool. */

#include "vlog.h"

/* A coverage counter. */
struct coverage_counter {
    const char *name;           /* Textual name. */
    unsigned int count;         /* Count within the current epoch. */
    unsigned long long int total; /* Total count over all epochs. */
};

/* Increments the counter with the given NAME.  Coverage counters need not be
 * declared explicitly, but when you add the first coverage counter to a given
 * file, you must also add that file to COVERAGE_FILES in lib/automake.mk. */
#define COVERAGE_INC(NAME)                              \
    do {                                                \
        extern struct coverage_counter NAME##_count;    \
        NAME##_count.count++;                           \
    } while (0)

/* Adds AMOUNT to the coverage counter with the given NAME. */
#define COVERAGE_ADD(NAME, AMOUNT)                      \
    do {                                                \
        extern struct coverage_counter NAME##_count;    \
        NAME##_count.count += AMOUNT;                   \
    } while (0)

void coverage_log(enum vlog_level);
void coverage_clear(void);

#endif /* coverage.h */