Add some possibly-useful markers for debugging threads from coredumps.
[dcpomatic.git] / src / lib / encode_server_finder.cc
index 52c8c89496bdec9b46bb5de1487b06d48907eed8..2fab210c94838fe03e53a77ebea5ab0efcb87f87 100644 (file)
@@ -27,6 +27,7 @@
 #include "dcpomatic_socket.h"
 #include <dcp/raw_convert.h>
 #include <libcxml/cxml.h>
+#include <boost/bind/placeholders.hpp>
 #include <boost/lambda/lambda.hpp>
 #include <iostream>
 
@@ -36,10 +37,13 @@ using std::string;
 using std::list;
 using std::vector;
 using std::cout;
-using boost::shared_ptr;
+using std::shared_ptr;
 using boost::scoped_array;
-using boost::weak_ptr;
+using std::weak_ptr;
 using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
 using dcp::raw_convert;
 
 EncodeServerFinder* EncodeServerFinder::_instance = 0;
@@ -70,25 +74,19 @@ EncodeServerFinder::~EncodeServerFinder ()
 void
 EncodeServerFinder::stop ()
 {
+       boost::this_thread::disable_interruption dis;
+
        _stop = true;
 
        _search_condition.notify_all ();
-       if (_search_thread.joinable()) {
-               try {
-                       _search_thread.join();
-               } catch (...) {
-
-               }
-       }
+       try {
+               _search_thread.join();
+       } catch (...) {}
 
        _listen_io_service.stop ();
-       if (_listen_thread.joinable()) {
-               try {
-                       _listen_thread.join ();
-               } catch (...) {
-
-               }
-       }
+       try {
+               _listen_thread.join ();
+       } catch (...) {}
 
        boost::mutex::scoped_lock lm (_servers_mutex);
        _servers.clear ();
@@ -98,6 +96,8 @@ void
 EncodeServerFinder::search_thread ()
 try
 {
+       start_of_thread ("EncodeServerFinder-search");
+
        boost::system::error_code error;
        boost::asio::io_service io_service;
        boost::asio::ip::udp::socket socket (io_service);
@@ -124,15 +124,10 @@ try
                }
 
                /* Query our `definite' servers (if there are any) */
-               vector<string> servers = Config::instance()->servers ();
-               for (vector<string>::const_iterator i = servers.begin(); i != servers.end(); ++i) {
-                       if (server_found (*i)) {
-                               /* Don't bother asking a server that we already know about */
-                               continue;
-                       }
+               for (auto const& i: Config::instance()->servers()) {
                        try {
                                boost::asio::ip::udp::resolver resolver (io_service);
-                               boost::asio::ip::udp::resolver::query query (*i, raw_convert<string> (HELLO_PORT));
+                               boost::asio::ip::udp::resolver::query query (i, raw_convert<string> (HELLO_PORT));
                                boost::asio::ip::udp::endpoint end_point (*resolver.resolve (query));
                                socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point);
                        } catch (...) {
@@ -175,6 +170,8 @@ catch (...)
 void
 EncodeServerFinder::listen_thread ()
 try {
+       start_of_thread ("EncodeServerFinder-listen");
+
        using namespace boost::asio::ip;
 
        try {