$search
00001 /********************************************************************* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (c) 2010, Willow Garage, Inc. 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * * Redistributions in binary form must reproduce the above 00014 * copyright notice, this list of conditions and the following 00015 * disclaimer in the documentation and/or other materials provided 00016 * with the distribution. 00017 * * Neither the name of the Willow Garage nor the names of its 00018 * contributors may be used to endorse or promote products derived 00019 * from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 *********************************************************************/ 00034 00035 #include <rosrt/detail/simple_gc.h> 00036 #include <rosrt/detail/managers.h> 00037 #include <rosrt/init.h> 00038 #include <ros/debug.h> 00039 00040 namespace rosrt 00041 { 00042 namespace detail 00043 { 00044 00045 SimpleGC::SimpleGC(const InitOptions& ops) 00046 : running_(true) 00047 , pool_gc_queue_(ops.gc_queue_size) 00048 , period_(ops.gc_period.toSec()) 00049 { 00050 pool_gc_thread_ = boost::thread(&SimpleGC::gcThread, this); 00051 } 00052 00053 SimpleGC::~SimpleGC() 00054 { 00055 running_ = false; 00056 pool_gc_thread_.join(); 00057 } 00058 00059 void addPoolToGC(void* pool, SimpleGC::DeleteFunc deleter, SimpleGC::IsDeletableFunc deletable) 00060 { 00061 getGC()->add(pool, deleter, deletable); 00062 } 00063 00064 void SimpleGC::add(void* pool, DeleteFunc deleter, IsDeletableFunc deletable) 00065 { 00066 PoolGCItem i; 00067 i.pool = pool; 00068 i.deleter = deleter; 00069 i.is_deletable = deletable; 00070 pool_gc_queue_.push(i); 00071 } 00072 00073 void SimpleGC::gcThread() 00074 { 00075 typedef std::vector<PoolGCItem> V_PoolGCItem; 00076 V_PoolGCItem gc_items; 00077 00078 while (running_) 00079 { 00080 ros::WallDuration(period_).sleep(); 00081 00082 { 00083 MWSRQueue<PoolGCItem>::Node* it = pool_gc_queue_.popAll(); 00084 while (it) 00085 { 00086 gc_items.push_back(it->val); 00087 MWSRQueue<PoolGCItem>::Node* tmp = it; 00088 it = it->next; 00089 pool_gc_queue_.free(tmp); 00090 } 00091 } 00092 00093 { 00094 for (size_t i = 0; i < gc_items.size();) 00095 { 00096 PoolGCItem& item = gc_items[i]; 00097 if (item.is_deletable(item.pool)) 00098 { 00099 item.deleter(item.pool); 00100 item = gc_items.back(); 00101 gc_items.pop_back(); 00102 } 00103 else 00104 { 00105 ++i; 00106 } 00107 } 00108 } 00109 } 00110 00111 { 00112 // Once we've stopped running, make sure everything is deleted 00113 V_PoolGCItem::iterator it = gc_items.begin(); 00114 V_PoolGCItem::iterator end = gc_items.end(); 00115 for (; it != end; ++it) 00116 { 00117 PoolGCItem& item = *it; 00118 if (!item.is_deletable(item.pool)) 00119 { 00120 ROS_WARN("Pool %p still has allocated blocks. Deleting anyway.", item.pool); 00121 } 00122 00123 item.deleter(item.pool); 00124 } 00125 } 00126 } 00127 00128 } // namespace detail 00129 } // namespace rosrt 00130