1 //
2 //  collector_test.cpp
3 //
4 //  Copyright (c) 2003 Peter Dimov
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 #include <boost/shared_ptr.hpp>
12 #include <vector>
13 #include <iostream>
14 #include <cstdlib>
15 #include <ctime>
16 
17 // sp_collector.cpp exported functions
18 
19 std::size_t find_unreachable_objects(bool report);
20 void free_unreachable_objects();
21 
22 struct X
23 {
24     void* fill[32];
25     boost::shared_ptr<X> p;
26 };
27 
report()28 void report()
29 {
30     std::cout << "Calling find_unreachable_objects:\n";
31 
32     std::clock_t t = std::clock();
33 
34     std::size_t n = find_unreachable_objects(false);
35 
36     t = std::clock() - t;
37 
38     std::cout << n << " unreachable objects.\n";
39     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
40 }
41 
free()42 void free()
43 {
44     std::cout << "Calling free_unreachable_objects:\n";
45 
46     std::clock_t t = std::clock();
47 
48     free_unreachable_objects();
49 
50     t = std::clock() - t;
51 
52     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
53 }
54 
main()55 int main()
56 {
57     std::vector< boost::shared_ptr<X> > v1, v2;
58 
59     int const n = 256 * 1024;
60 
61     std::cout << "Filling v1 and v2\n";
62 
63     for(int i = 0; i < n; ++i)
64     {
65         v1.push_back(boost::shared_ptr<X>(new X));
66         v2.push_back(boost::shared_ptr<X>(new X));
67     }
68 
69     report();
70 
71     std::cout << "Creating the cycles\n";
72 
73     for(int i = 0; i < n - 1; ++i)
74     {
75         v2[i]->p = v2[i+1];
76     }
77 
78     v2[n-1]->p = v2[0];
79 
80     report();
81 
82     std::cout << "Resizing v2 to size of 1\n";
83 
84     v2.resize(1);
85     report();
86 
87     std::cout << "Clearing v2\n";
88 
89     v2.clear();
90     report();
91 
92     std::cout << "Clearing v1\n";
93 
94     v1.clear();
95     report();
96 
97     free();
98     report();
99 }
100