BadVPN – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @file debugcounter.h
3 * @author Ambroz Bizjak <ambrop7@gmail.com>
4 *
5 * @section LICENSE
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the author nor the
15 * names of its contributors may be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * @section DESCRIPTION
30 *
31 * Counter for detecting leaks.
32 */
33  
34 #ifndef BADVPN_MISC_DEBUGCOUNTER_H
35 #define BADVPN_MISC_DEBUGCOUNTER_H
36  
37 #include <stdint.h>
38  
39 #include <misc/debug.h>
40  
41 /**
42 * Counter for detecting leaks.
43 */
44 typedef struct {
45 #ifndef NDEBUG
46 int32_t c;
47 #else
48 int dummy_field; // struct must have at least one field
49 #endif
50 } DebugCounter;
51  
52 #define DEBUGCOUNTER_STATIC { 0 }
53  
54 /**
55 * Initializes the object.
56 * The object is initialized with counter value zero.
57 *
58 * @param obj the object
59 */
60 static void DebugCounter_Init (DebugCounter *obj)
61 {
62 #ifndef NDEBUG
63 obj->c = 0;
64 #endif
65 }
66  
67 /**
68 * Frees the object.
69 * This does not have to be called when the counter is no longer needed.
70 * The counter value must be zero.
71 *
72 * @param obj the object
73 */
74 static void DebugCounter_Free (DebugCounter *obj)
75 {
76 #ifndef NDEBUG
77 ASSERT(obj->c == 0 || obj->c == INT32_MAX)
78 #endif
79 }
80  
81 /**
82 * Increments the counter.
83 * Increments the counter value by one.
84 *
85 * @param obj the object
86 */
87 static void DebugCounter_Increment (DebugCounter *obj)
88 {
89 #ifndef NDEBUG
90 ASSERT(obj->c >= 0)
91  
92 if (obj->c != INT32_MAX) {
93 obj->c++;
94 }
95 #endif
96 }
97  
98 /**
99 * Decrements the counter.
100 * The counter value must be >0.
101 * Decrements the counter value by one.
102 *
103 * @param obj the object
104 */
105 static void DebugCounter_Decrement (DebugCounter *obj)
106 {
107 #ifndef NDEBUG
108 ASSERT(obj->c > 0)
109  
110 if (obj->c != INT32_MAX) {
111 obj->c--;
112 }
113 #endif
114 }
115  
116 #endif