1    	// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2    	// vim: ts=8 sw=2 smarttab
3    	
4    	#include "tools/rbd_mirror/Threads.h"
5    	#include "common/Timer.h"
6    	#include "common/WorkQueue.h"
7    	#include "librbd/ImageCtx.h"
8    	
9    	namespace rbd {
10   	namespace mirror {
11   	
12   	template <typename I>
13   	Threads<I>::Threads(CephContext *cct) {
14   	  thread_pool = new ThreadPool(cct, "Journaler::thread_pool", "tp_journal",
15   	                               cct->_conf.get_val<uint64_t>("rbd_op_threads"),
16   	                               "rbd_op_threads");
17   	  thread_pool->start();
18   	
19   	  work_queue = new ContextWQ("Journaler::work_queue",
20   	                             cct->_conf.get_val<uint64_t>("rbd_op_thread_timeout"),
21   	                             thread_pool);
22   	
23   	  timer = new SafeTimer(cct, timer_lock, true);
24   	  timer->init();
25   	}
26   	
27   	template <typename I>
(1) Event exn_spec_violation: An exception of type "std::length_error" is thrown but the throw list "throw()" doesn't allow it to be thrown. This will cause a call to unexpected() which usually calls terminate().
Also see events: [fun_call_w_exception]
28   	Threads<I>::~Threads() {
29   	  {
30   	    std::lock_guard timer_locker{timer_lock};
(2) Event fun_call_w_exception: Called function throws an exception of type "std::length_error". [details]
Also see events: [exn_spec_violation]
31   	    timer->shutdown();
32   	  }
33   	  delete timer;
34   	
35   	  work_queue->drain();
36   	  delete work_queue;
37   	
38   	  thread_pool->stop();
39   	  delete thread_pool;
40   	}
41   	
42   	} // namespace mirror
43   	} // namespace rbd
44   	
45   	template class rbd::mirror::Threads<librbd::ImageCtx>;
46