From 7ae514af0aea1b953a93f88d5507e6c1dd675908 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 6 Jul 2015 13:37:35 +0100 Subject: [PATCH] Better updating of servers list when things change. --- src/lib/config.cc | 4 ++-- src/lib/config.h | 14 ++++++++++---- src/lib/encoder.cc | 13 +++++++++---- src/lib/encoder.h | 2 +- src/lib/server_finder.cc | 35 +++++++++++++++++++++-------------- src/lib/server_finder.h | 10 +++++++--- src/wx/servers_list_dialog.cc | 28 +++++++++++++++++----------- src/wx/servers_list_dialog.h | 3 +-- 8 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/lib/config.cc b/src/lib/config.cc index ee38e9866..16a3849b5 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -407,9 +407,9 @@ Config::drop () } void -Config::changed () +Config::changed (Property what) { - Changed (); + Changed (what); } void diff --git a/src/lib/config.h b/src/lib/config.h index 0040591f1..ad95bc344 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -59,6 +59,12 @@ public: boost::filesystem::path default_directory_or (boost::filesystem::path a) const; + enum Property { + USE_ANY_SERVERS, + SERVERS, + OTHER + }; + /** @return base port number to use for J2K encoding servers */ int server_port_base () const { return _server_port_base; @@ -66,7 +72,7 @@ public: void set_use_any_servers (bool u) { _use_any_servers = u; - changed (); + changed (USE_ANY_SERVERS); } bool use_any_servers () const { @@ -76,7 +82,7 @@ public: /** @param s New list of servers */ void set_servers (std::vector s) { _servers = s; - changed (); + changed (SERVERS); } /** @return Host names / IP addresses of J2K encoding servers that should definitely be used */ @@ -395,8 +401,8 @@ public: void add_to_history (boost::filesystem::path p); - void changed (); - boost::signals2::signal Changed; + void changed (Property p = OTHER); + boost::signals2::signal Changed; void write () const; diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index c3ad08441..07c97c674 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -36,6 +36,7 @@ #include "data.h" #include #include +#include #include #include "i18n.h" @@ -66,7 +67,7 @@ Encoder::Encoder (shared_ptr film, weak_ptr j, shared_ptrset_encoder_threads (_threads.size ()); if (!ServerFinder::instance()->disabled ()) { - _server_found_connection = ServerFinder::instance()->connect (boost::bind (&Encoder::server_found, this, _1)); + _server_found_connection = ServerFinder::instance()->ServersListChanged.connect (boost::bind (&Encoder::servers_list_changed, this)); } } @@ -271,6 +272,7 @@ Encoder::terminate_threads () } _threads.clear (); + _terminate = false; } void @@ -362,7 +364,10 @@ catch (...) } void -Encoder::server_found (ServerDescription s) +Encoder::servers_list_changed () { - add_worker_threads (s); + terminate_threads (); + BOOST_FOREACH (ServerDescription i, ServerFinder::instance()->servers ()) { + add_worker_threads (i); + } } diff --git a/src/lib/encoder.h b/src/lib/encoder.h index 6bbdda4c5..85bc6ae99 100644 --- a/src/lib/encoder.h +++ b/src/lib/encoder.h @@ -83,7 +83,7 @@ private: void encoder_thread (boost::optional); void terminate_threads (); void add_worker_threads (ServerDescription); - void server_found (ServerDescription); + void servers_list_changed (); /** Film that we are encoding */ boost::shared_ptr _film; diff --git a/src/lib/server_finder.cc b/src/lib/server_finder.cc index ac4651657..a189ae802 100644 --- a/src/lib/server_finder.cc +++ b/src/lib/server_finder.cc @@ -47,6 +47,7 @@ ServerFinder::ServerFinder () { _broadcast_thread = new boost::thread (boost::bind (&ServerFinder::broadcast_thread, this)); _listen_thread = new boost::thread (boost::bind (&ServerFinder::listen_thread, this)); + Config::instance()->Changed.connect (boost::bind (&ServerFinder::config_changed, this, _1)); } ServerFinder::~ServerFinder () @@ -172,7 +173,7 @@ ServerFinder::handle_accept (boost::system::error_code ec, shared_ptr so boost::mutex::scoped_lock lm (_mutex); _servers.push_back (sd); } - emit (boost::bind (boost::ref (ServerFound), sd)); + emit (boost::bind (boost::ref (ServersListChanged))); } start_accept (); @@ -190,19 +191,6 @@ ServerFinder::server_found (string ip) const return i != _servers.end (); } -boost::signals2::connection -ServerFinder::connect (boost::function fn) -{ - boost::mutex::scoped_lock lm (_mutex); - - /* Emit the current list of servers */ - for (list::iterator i = _servers.begin(); i != _servers.end(); ++i) { - fn (*i); - } - - return ServerFound.connect (fn); -} - ServerFinder* ServerFinder::instance () { @@ -219,3 +207,22 @@ ServerFinder::drop () delete _instance; _instance = 0; } + +list +ServerFinder::servers () const +{ + boost::mutex::scoped_lock lm (_mutex); + return _servers; +} + +void +ServerFinder::config_changed (Config::Property what) +{ + if (what == Config::USE_ANY_SERVERS || what == Config::SERVERS) { + { + boost::mutex::scoped_lock lm (_mutex); + _servers.clear (); + } + ServersListChanged (); + } +} diff --git a/src/lib/server_finder.h b/src/lib/server_finder.h index ec855938b..c43c2a422 100644 --- a/src/lib/server_finder.h +++ b/src/lib/server_finder.h @@ -19,13 +19,12 @@ #include "server.h" #include "signaller.h" +#include "config.h" #include class ServerFinder : public Signaller, public ExceptionStore { public: - boost::signals2::connection connect (boost::function); - static ServerFinder* instance (); static void drop (); @@ -37,6 +36,11 @@ public: return _disabled; } + std::list servers () const; + + /** Emitted whenever the list of servers changes */ + boost::signals2::signal ServersListChanged; + private: ServerFinder (); ~ServerFinder (); @@ -48,7 +52,7 @@ private: void start_accept (); void handle_accept (boost::system::error_code ec, boost::shared_ptr socket); - boost::signals2::signal ServerFound; + void config_changed (Config::Property what); bool _disabled; diff --git a/src/wx/servers_list_dialog.cc b/src/wx/servers_list_dialog.cc index 13c6df707..b678da073 100644 --- a/src/wx/servers_list_dialog.cc +++ b/src/wx/servers_list_dialog.cc @@ -17,10 +17,11 @@ */ -#include -#include "lib/server_finder.h" #include "servers_list_dialog.h" #include "wx_util.h" +#include "lib/server_finder.h" +#include +#include using std::list; using std::string; @@ -61,19 +62,24 @@ ServersListDialog::ServersListDialog (wxWindow* parent) s->Layout (); s->SetSizeHints (this); - _server_finder_connection = ServerFinder::instance()->connect (boost::bind (&ServersListDialog::server_found, this, _1)); + _server_finder_connection = ServerFinder::instance()->ServersListChanged.connect (boost::bind (&ServersListDialog::servers_list_changed, this)); + servers_list_changed (); } void -ServersListDialog::server_found (ServerDescription s) +ServersListDialog::servers_list_changed () { - wxListItem list_item; - int const n = _list->GetItemCount (); - list_item.SetId (n); - _list->InsertItem (list_item); + _list->DeleteAllItems (); + + int n = 0; + BOOST_FOREACH (ServerDescription i, ServerFinder::instance()->servers ()) { + wxListItem list_item; + list_item.SetId (n); + _list->InsertItem (list_item); - _list->SetItem (n, 0, std_to_wx (s.host_name ())); - _list->SetItem (n, 1, std_to_wx (lexical_cast (s.threads ()))); + _list->SetItem (n, 0, std_to_wx (i.host_name ())); + _list->SetItem (n, 1, std_to_wx (lexical_cast (i.threads ()))); - _servers.push_back (s); + ++n; + } } diff --git a/src/wx/servers_list_dialog.h b/src/wx/servers_list_dialog.h index 3804d2a7e..60fcdb236 100644 --- a/src/wx/servers_list_dialog.h +++ b/src/wx/servers_list_dialog.h @@ -27,9 +27,8 @@ public: ServersListDialog (wxWindow *); private: - void server_found (ServerDescription); + void servers_list_changed (); - std::list _servers; wxListCtrl* _list; boost::signals2::scoped_connection _server_finder_connection; -- 2.30.2