use std::packaged_task and std::future to simulate boost:🧵:timed_join()
This commit is contained in:
		
							parent
							
								
									1816e6607e
								
							
						
					
					
						commit
						c6a07acd90
					
				
							
								
								
									
										18
									
								
								routed.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								routed.cpp
									
									
									
									
									
								
							| @ -36,12 +36,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include <boost/thread.hpp> // for timed join.
 | #include <cstdlib> | ||||||
| 
 | 
 | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
| 
 | 
 | ||||||
|  | #include <chrono> | ||||||
| #include <functional> | #include <functional> | ||||||
|  | #include <future> | ||||||
| #include <iostream> | #include <iostream> | ||||||
|  | #include <thread> | ||||||
| 
 | 
 | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
| boost::function0<void> console_ctrl_function; | boost::function0<void> console_ctrl_function; | ||||||
| @ -139,7 +142,9 @@ int main(int argc, const char *argv[]) | |||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             boost::thread server_thread(std::bind(&Server::Run, routing_server)); |             std::packaged_task<void()> server_task(std::bind(&Server::Run, routing_server)); | ||||||
|  |             auto future = server_task.get_future(); | ||||||
|  |             std::thread server_thread(std::move(server_task)); | ||||||
| 
 | 
 | ||||||
| #ifndef _WIN32 | #ifndef _WIN32 | ||||||
|             sigset_t wait_mask; |             sigset_t wait_mask; | ||||||
| @ -162,9 +167,16 @@ int main(int argc, const char *argv[]) | |||||||
|             routing_server->Stop(); |             routing_server->Stop(); | ||||||
|             SimpleLogger().Write() << "stopping threads"; |             SimpleLogger().Write() << "stopping threads"; | ||||||
| 
 | 
 | ||||||
|             if (!server_thread.timed_join(boost::posix_time::seconds(2))) |             auto status = future.wait_for(std::chrono::seconds(2)); | ||||||
|  | 
 | ||||||
|  |             if (status != std::future_status::ready) | ||||||
|             { |             { | ||||||
|                 SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!"; |                 SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!"; | ||||||
|  |                 server_task.reset(); // just kill it
 | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 server_thread.join(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user