simple_gc.cpp
Go to the documentation of this file.
1 /*********************************************************************
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2010, Willow Garage, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of the Willow Garage nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *********************************************************************/
34 
35 #include <rosrt/detail/simple_gc.h>
36 #include <rosrt/detail/managers.h>
37 #include <rosrt/init.h>
38 #include <ros/debug.h>
39 
40 namespace rosrt
41 {
42 namespace detail
43 {
44 
46 : running_(true)
47 , pool_gc_queue_(ops.gc_queue_size)
48 , period_(ops.gc_period.toSec())
49 {
50  pool_gc_thread_ = boost::thread(&SimpleGC::gcThread, this);
51 }
52 
54 {
55  running_ = false;
56  pool_gc_thread_.join();
57 }
58 
59 void addPoolToGC(void* pool, SimpleGC::DeleteFunc deleter, SimpleGC::IsDeletableFunc deletable)
60 {
61  getGC()->add(pool, deleter, deletable);
62 }
63 
64 void SimpleGC::add(void* pool, DeleteFunc deleter, IsDeletableFunc deletable)
65 {
66  PoolGCItem i;
67  i.pool = pool;
68  i.deleter = deleter;
69  i.is_deletable = deletable;
70  pool_gc_queue_.push(i);
71 }
72 
74 {
75  typedef std::vector<PoolGCItem> V_PoolGCItem;
76  V_PoolGCItem gc_items;
77 
78  while (running_)
79  {
81 
82  {
84  while (it)
85  {
86  gc_items.push_back(it->val);
88  it = it->next;
89  pool_gc_queue_.free(tmp);
90  }
91  }
92 
93  {
94  for (size_t i = 0; i < gc_items.size();)
95  {
96  PoolGCItem& item = gc_items[i];
97  if (item.is_deletable(item.pool))
98  {
99  item.deleter(item.pool);
100  item = gc_items.back();
101  gc_items.pop_back();
102  }
103  else
104  {
105  ++i;
106  }
107  }
108  }
109  }
110 
111  {
112  // Once we've stopped running, make sure everything is deleted
113  V_PoolGCItem::iterator it = gc_items.begin();
114  V_PoolGCItem::iterator end = gc_items.end();
115  for (; it != end; ++it)
116  {
117  PoolGCItem& item = *it;
118  if (!item.is_deletable(item.pool))
119  {
120  ROS_WARN("Pool %p still has allocated blocks. Deleting anyway.", item.pool);
121  }
122 
123  item.deleter(item.pool);
124  }
125  }
126 }
127 
128 } // namespace detail
129 } // namespace rosrt
130 
boost::thread pool_gc_thread_
Definition: simple_gc.h:75
MWSRQueue< PoolGCItem > pool_gc_queue_
Definition: simple_gc.h:76
volatile bool running_
Definition: simple_gc.h:66
Definition: managers.h:38
void(* DeleteFunc)(void *pool)
Definition: simple_gc.h:55
#define ROS_WARN(...)
void add(void *pool, DeleteFunc deleter, IsDeletableFunc deletable)
Definition: simple_gc.cpp:64
bool sleep() const
SimpleGC * getGC()
Definition: init.cpp:93
bool(* IsDeletableFunc)(void *pool)
Definition: simple_gc.h:56
SimpleGC(const InitOptions &ops)
Definition: simple_gc.cpp:45
void addPoolToGC(void *pool, PoolDeleteFunc deleter, PoolDeletableFunc deletable)
Definition: simple_gc.cpp:59


rosrt
Author(s): Josh Faust
autogenerated on Fri Apr 5 2019 02:16:39