| 
									
										
										
										
											2003-01-27 14:02:00 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | //  collector_test.cpp
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Copyright (c) 2003 Peter Dimov
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2004-07-26 00:32:12 +00:00
										 |  |  | // Distributed under the Boost Software License, Version 1.0. (See
 | 
					
						
							|  |  |  | // accompanying file LICENSE_1_0.txt or copy at
 | 
					
						
							|  |  |  | // http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							| 
									
										
										
										
											2003-01-27 14:02:00 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <boost/shared_ptr.hpp>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <cstdlib>
 | 
					
						
							|  |  |  | #include <ctime>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // sp_collector.cpp exported functions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::size_t find_unreachable_objects(bool report); | 
					
						
							|  |  |  | void free_unreachable_objects(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct X | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     void* fill[32]; | 
					
						
							|  |  |  |     boost::shared_ptr<X> p; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void report() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::cout << "Calling find_unreachable_objects:\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::clock_t t = std::clock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::size_t n = find_unreachable_objects(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     t = std::clock() - t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << n << " unreachable objects.\n"; | 
					
						
							|  |  |  |     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void free() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::cout << "Calling free_unreachable_objects:\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::clock_t t = std::clock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     free_unreachable_objects(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     t = std::clock() - t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::vector< boost::shared_ptr<X> > v1, v2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int const n = 256 * 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "Filling v1 and v2\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(int i = 0; i < n; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         v1.push_back(boost::shared_ptr<X>(new X)); | 
					
						
							|  |  |  |         v2.push_back(boost::shared_ptr<X>(new X)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "Creating the cycles\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(int i = 0; i < n - 1; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         v2[i]->p = v2[i+1]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     v2[n-1]->p = v2[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "Resizing v2 to size of 1\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     v2.resize(1); | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "Clearing v2\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     v2.clear(); | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cout << "Clearing v1\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     v1.clear(); | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     free(); | 
					
						
							|  |  |  |     report(); | 
					
						
							|  |  |  | } |