- boost::mutex::scoped_lock threads_lock (_threads_mutex);
-
- int n = 0;
- for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) {
- /* Be careful not to throw in here otherwise _threads will not be clear()ed */
- LOG_GENERAL ("Terminating thread %1 of %2", n + 1, _threads.size ());
- (*i)->interrupt ();
- if (!(*i)->joinable()) {
- LOG_ERROR_NC ("About to join() a non-joinable thread");
- }
- try {
- (*i)->join ();
- } catch (boost::thread_interrupted& e) {
- /* This is to be expected (I think?) */
- } catch (exception& e) {
- LOG_ERROR ("join() threw an exception: %1", e.what());
- } catch (...) {
- LOG_ERROR_NC ("join() threw an exception");
- }
- delete *i;
- LOG_GENERAL_NC ("Thread terminated");
- ++n;
+ boost::this_thread::disable_interruption dis;
+
+ if (!_threads) {
+ return;
+ }
+
+ _threads->interrupt_all ();
+ try {
+ _threads->join_all ();
+ } catch (exception& e) {
+ LOG_ERROR ("join() threw an exception: %1", e.what());
+ } catch (...) {
+ LOG_ERROR_NC ("join() threw an exception");