]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-statbag_cc.cc
spelling: syscall
[thirdparty/pdns.git] / pdns / test-statbag_cc.cc
1 #define BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_NO_MAIN
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7 #include <boost/test/unit_test.hpp>
8 #include <boost/assign/list_of.hpp>
9
10 #include <boost/tuple/tuple.hpp>
11 #include <stdint.h>
12 #include "misc.hh"
13 #include "dns.hh"
14 #include "statbag.hh"
15
16 using std::string;
17
18 static void *threadMangler(void* a)
19 {
20 AtomicCounter* ac=(AtomicCounter*)a;
21 for(unsigned int n=0; n < 1000000; ++n)
22 (*ac)++;
23 return 0;
24 }
25
26 static void *threadMangler2(void* a)
27 {
28 StatBag* S = (StatBag*)a;
29 for(unsigned int n=0; n < 1000000; ++n)
30 S->inc("c");
31 return 0;
32 }
33
34
35
36 BOOST_AUTO_TEST_SUITE(test_misc_hh)
37
38 BOOST_AUTO_TEST_CASE(test_StatBagBasic) {
39 StatBag s;
40 s.declare("a", "description");
41 s.declare("b", "description");
42 s.declare("c", "description");
43 s.inc("a");
44 BOOST_CHECK_EQUAL(s.read("a"), 1);
45
46 int n;
47 for(n=0; n < 1000000; ++n)
48 s.inc("b");
49
50 BOOST_CHECK_EQUAL(s.read("b"), n);
51
52 AtomicCounter* ac = s.getPointer("a");
53 for(n=0; n < 1000000; ++n)
54 (*ac)++;
55
56 BOOST_CHECK_EQUAL(s.read("a"), n+1);
57
58 AtomicCounter* acc = s.getPointer("c");
59 pthread_t tid[4];
60 for(int i=0; i < 4; ++i)
61 pthread_create(&tid[i], 0, threadMangler, (void*)acc);
62 void* res;
63 for(int i=0; i < 4 ; ++i)
64 pthread_join(tid[i], &res);
65
66 BOOST_CHECK_EQUAL(s.read("c"), 4000000U);
67
68 s.set("c", 0);
69
70 for(int i=0; i < 4; ++i)
71 pthread_create(&tid[i], 0, threadMangler2, (void*)&s);
72
73 for(int i=0; i < 4 ; ++i)
74 pthread_join(tid[i], &res);
75
76 BOOST_CHECK_EQUAL(s.read("c"), 4000000U);
77
78
79 s.set("c", 1ULL<<31);
80 BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<31) );
81 s.inc("c");
82 BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<31) +1 );
83
84 #ifdef UINTPTR_MAX
85 #if UINTPTR_MAX > 0xffffffffULL
86 BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 8);
87 s.set("c", 1ULL<<33);
88 BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<33) );
89 s.inc("c");
90 BOOST_CHECK_EQUAL(s.read("c"), (1ULL<<33) +1 );
91
92 s.set("c", ~0ULL);
93 BOOST_CHECK_EQUAL(s.read("c"), 0xffffffffffffffffULL );
94 s.inc("c");
95 BOOST_CHECK_EQUAL(s.read("c"), 0 );
96 #else
97 BOOST_CHECK_EQUAL(sizeof(AtomicCounterInner), 4);
98 BOOST_CHECK_EQUAL(~0UL, 0xffffffffUL);
99 s.set("c", ~0UL);
100 BOOST_CHECK_EQUAL(s.read("c"), 0xffffffffUL );
101 s.inc("c");
102 BOOST_CHECK_EQUAL(s.read("c"), 0 );
103 #endif
104 #endif
105 }
106
107
108 BOOST_AUTO_TEST_SUITE_END()
109