Main Page
Namespaces
Classes
Files
File List
File Members
include
vigir_footstep_planning_lib
threading
threading_manager.h
Go to the documentation of this file.
1
//=================================================================================================
2
// Copyright (c) 2017, Alexander Stumpf, TU Darmstadt
3
// All rights reserved.
4
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are met:
7
// * Redistributions of source code must retain the above copyright
8
// notice, this list of conditions and the following disclaimer.
9
// * Redistributions in binary form must reproduce the above copyright
10
// notice, this list of conditions and the following disclaimer in the
11
// documentation and/or other materials provided with the distribution.
12
// * Neither the name of the Simulation, Systems Optimization and Robotics
13
// group, TU Darmstadt nor the names of its contributors may be used to
14
// endorse or promote products derived from this software without
15
// specific prior written permission.
16
17
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
21
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
//=================================================================================================
28
29
#ifndef VIGIR_FOOTSTEP_PLANNING_THREADING_MANAGER_H__
30
#define VIGIR_FOOTSTEP_PLANNING_THREADING_MANAGER_H__
31
32
#include <
ros/ros.h
>
33
34
#include <
vigir_footstep_planning_lib/threading/queue.h
>
35
#include <
vigir_footstep_planning_lib/threading/worker.h
>
36
37
38
39
namespace
vigir_footstep_planning
40
{
41
namespace
threading
42
{
43
template
<
class
T>
44
class
ThreadingManager
45
{
46
public
:
47
ThreadingManager
(
int
threads = -1,
unsigned
int
jobs_per_thread = 10,
bool
auto_start =
true
)
48
{
49
ROS_INFO
(
"[Manager] Spawning %i workers."
, threads);
50
for
(
int
n = 0; n < threads; n++)
51
workers
.push_back(
boost::shared_ptr
<
Worker<T>
>(
new
Worker<T>
(
queue
, jobs_per_thread, auto_start)));
52
}
53
54
virtual
~ThreadingManager
()
55
{
56
ROS_INFO
(
"[Manager] Destruct"
);
57
stopJobs
();
58
}
59
60
void
addJob
(
boost::shared_ptr<T>
& job) {
queue
.queueJob(job); }
61
void
addJobs
(std::list<
boost::shared_ptr<T>
>& jobs) {
queue
.queueJobs(jobs); }
62
63
void
stopJobs
()
64
{
65
ROS_INFO
(
"[Manager] Wait for thread termination..."
);
66
for
(
typename
std::list<
boost::shared_ptr
<
Worker<T>
> >::iterator itr =
workers
.begin(); itr !=
workers
.end(); itr++)
67
(*itr)->stop();
68
deleteJobs
();
69
ROS_INFO
(
"[Manager] Wait for thread termination...Done!"
);
70
}
71
72
void
interruptJobs
()
73
{
74
ROS_INFO
(
"[Manager] Interrupt jobs..."
);
75
for
(
typename
std::list<
boost::shared_ptr
<
Worker<T>
> >::iterator itr =
workers
.begin(); itr !=
workers
.end(); itr++)
76
(*itr)->interruptJobs();
77
deleteJobs
();
78
ROS_INFO
(
"[Manager] Interrupt jobs...Done!"
);
79
}
80
81
void
deleteJobs
() {
queue
.clear(); }
82
83
bool
hasJobsFinished
() {
return
!
queue
.hasOpenJobs(); }
84
void
waitUntilJobsFinished
()
85
{
86
try
87
{
88
queue
.waitUntilJobsProcessed();
89
}
90
catch
(boost::thread_interrupted& interrupt)
91
{
92
ROS_INFO
(
"[Manager] Catched boost::interruption"
);
93
interruptJobs
();
94
throw
(interrupt);
95
}
96
}
97
98
// typedefs
99
typedef
boost::shared_ptr<ThreadingManager>
Ptr
;
100
typedef
boost::shared_ptr<const ThreadingManager>
ConstPtr
;
101
102
protected
:
103
Queue<T>
queue
;
104
std::list<boost::shared_ptr<Worker<T> > >
workers
;
105
};
106
}
107
}
108
109
#endif
worker.h
vigir_footstep_planning::threading::ThreadingManager::addJobs
void addJobs(std::list< boost::shared_ptr< T > > &jobs)
Definition:
threading_manager.h:61
vigir_footstep_planning::threading::ThreadingManager::addJob
void addJob(boost::shared_ptr< T > &job)
Definition:
threading_manager.h:60
vigir_footstep_planning::threading::ThreadingManager::queue
Queue< T > queue
Definition:
threading_manager.h:103
vigir_footstep_planning::threading::ThreadingManager::hasJobsFinished
bool hasJobsFinished()
Definition:
threading_manager.h:83
vigir_footstep_planning::threading::ThreadingManager::ThreadingManager
ThreadingManager(int threads=-1, unsigned int jobs_per_thread=10, bool auto_start=true)
Definition:
threading_manager.h:47
boost::shared_ptr
vigir_footstep_planning::threading::ThreadingManager::waitUntilJobsFinished
void waitUntilJobsFinished()
Definition:
threading_manager.h:84
queue.h
vigir_footstep_planning::threading::ThreadingManager
Definition:
threading_manager.h:44
vigir_footstep_planning::threading::ThreadingManager::deleteJobs
void deleteJobs()
Definition:
threading_manager.h:81
vigir_footstep_planning::threading::ThreadingManager::interruptJobs
void interruptJobs()
Definition:
threading_manager.h:72
ROS_INFO
#define ROS_INFO(...)
vigir_footstep_planning
Definition:
helper.h:49
vigir_footstep_planning::threading::Queue
Definition:
queue.h:45
ros.h
vigir_footstep_planning::threading::ThreadingManager::~ThreadingManager
virtual ~ThreadingManager()
Definition:
threading_manager.h:54
vigir_footstep_planning::threading::ThreadingManager::ConstPtr
boost::shared_ptr< const ThreadingManager > ConstPtr
Definition:
threading_manager.h:100
vigir_footstep_planning::threading::ThreadingManager::Ptr
boost::shared_ptr< ThreadingManager > Ptr
Definition:
threading_manager.h:99
vigir_footstep_planning::threading::ThreadingManager::stopJobs
void stopJobs()
Definition:
threading_manager.h:63
vigir_footstep_planning::threading::ThreadingManager::workers
std::list< boost::shared_ptr< Worker< T > > > workers
Definition:
threading_manager.h:104
vigir_footstep_planning::threading::Worker
Definition:
worker.h:45
vigir_footstep_planning_lib
Author(s): Alexander Stumpf
autogenerated on Mon Jun 10 2019 15:47:33