threading_manager.h
Go to the documentation of this file.
00001 //=================================================================================================
00002 // Copyright (c) 2017, Alexander Stumpf, TU Darmstadt
00003 // All rights reserved.
00004 
00005 // Redistribution and use in source and binary forms, with or without
00006 // modification, are permitted provided that the following conditions are met:
00007 //     * Redistributions of source code must retain the above copyright
00008 //       notice, this list of conditions and the following disclaimer.
00009 //     * Redistributions in binary form must reproduce the above copyright
00010 //       notice, this list of conditions and the following disclaimer in the
00011 //       documentation and/or other materials provided with the distribution.
00012 //     * Neither the name of the Simulation, Systems Optimization and Robotics
00013 //       group, TU Darmstadt nor the names of its contributors may be used to
00014 //       endorse or promote products derived from this software without
00015 //       specific prior written permission.
00016 
00017 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00018 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00019 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00020 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
00021 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00022 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00023 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00024 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00026 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027 //=================================================================================================
00028 
00029 #ifndef VIGIR_FOOTSTEP_PLANNING_THREADING_MANAGER_H__
00030 #define VIGIR_FOOTSTEP_PLANNING_THREADING_MANAGER_H__
00031 
00032 #include <ros/ros.h>
00033 
00034 #include <vigir_footstep_planning_lib/threading/queue.h>
00035 #include <vigir_footstep_planning_lib/threading/worker.h>
00036 
00037 
00038 
00039 namespace vigir_footstep_planning
00040 {
00041 namespace threading
00042 {
00043 template <class T>
00044 class ThreadingManager
00045 {
00046 public:
00047   ThreadingManager(int threads = -1, unsigned int jobs_per_thread = 10, bool auto_start = true)
00048   {
00049     ROS_INFO("[Manager] Spawning %i workers.", threads);
00050     for (int n = 0; n < threads; n++)
00051       workers.push_back(boost::shared_ptr<Worker<T> >(new Worker<T>(queue, jobs_per_thread, auto_start)));
00052   }
00053 
00054   virtual ~ThreadingManager()
00055   {
00056     ROS_INFO("[Manager] Destruct");
00057     stopJobs();
00058   }
00059 
00060   void addJob(boost::shared_ptr<T>& job) { queue.queueJob(job); }
00061   void addJobs(std::list<boost::shared_ptr<T> >& jobs) { queue.queueJobs(jobs); }
00062 
00063   void stopJobs()
00064   {
00065     ROS_INFO("[Manager] Wait for thread termination...");
00066     for (typename std::list<boost::shared_ptr<Worker<T> > >::iterator itr = workers.begin(); itr != workers.end(); itr++)
00067       (*itr)->stop();
00068     deleteJobs();
00069     ROS_INFO("[Manager] Wait for thread termination...Done!");
00070   }
00071 
00072   void interruptJobs()
00073   {
00074     ROS_INFO("[Manager] Interrupt jobs...");
00075     for (typename std::list<boost::shared_ptr<Worker<T> > >::iterator itr = workers.begin(); itr != workers.end(); itr++)
00076       (*itr)->interruptJobs();
00077     deleteJobs();
00078     ROS_INFO("[Manager] Interrupt jobs...Done!");
00079   }
00080 
00081   void deleteJobs() { queue.clear(); }
00082 
00083   bool hasJobsFinished() { return !queue.hasOpenJobs(); }
00084   void waitUntilJobsFinished()
00085   {
00086     try
00087     {
00088       queue.waitUntilJobsProcessed();
00089     }
00090     catch(boost::thread_interrupted& interrupt)
00091     {
00092       ROS_INFO("[Manager] Catched boost::interruption");
00093       interruptJobs();
00094       throw(interrupt);
00095     }
00096   }
00097 
00098   // typedefs
00099   typedef boost::shared_ptr<ThreadingManager> Ptr;
00100   typedef boost::shared_ptr<const ThreadingManager> ConstPtr;
00101 
00102 protected:
00103   Queue<T> queue;
00104   std::list<boost::shared_ptr<Worker<T> > > workers;
00105 };
00106 }
00107 }
00108 
00109 #endif


vigir_footstep_planning_lib
Author(s): Alexander Stumpf
autogenerated on Sat Jul 15 2017 02:47:56