diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-03-05 21:03:31 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-03-05 22:20:37 +0000 |
| commit | 78c9e9838a205bbd66e0a5456514a0818e024b66 (patch) | |
| tree | f64c984b703a15fe7d63851610b7eacc6deacd35 | |
| parent | dae7fea98a5ca43d7e278b6381afcb5ccd1a310b (diff) | |
Set thread affinity on Windows XP so that each encoder thread
is tied to a single CPU. There is some suggestion on the web
that Windows 7 does this better, which may explain the slowdowns
and erratic timings that we see post-2.6.3 on Windows XP (see #771).
| -rw-r--r-- | ChangeLog | 4 | ||||
| -rw-r--r-- | src/lib/encoder.cc | 16 |
2 files changed, 19 insertions, 1 deletions
@@ -1,3 +1,7 @@ +2016-03-05 Carl Hetherington <cth@carlh.net> + + * Try to fix slowdowns on Windows XP (#771). + 2016-03-02 Carl Hetherington <cth@carlh.net> * Version 2.6.31 released. diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 8ba794a8e..34cae7d76 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -381,9 +381,23 @@ Encoder::servers_list_changed () boost::mutex::scoped_lock lm (_threads_mutex); +#ifdef BOOST_THREAD_PLATFORM_WIN32 + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + GetVersionEx (&info); + bool const windows_xp = (info.dwMajorVersion == 5 && info.dwMinorVersion == 1); + LOG_GENERAL_NC (N_("Setting thread affinity for Windows XP")); +#endif + if (!Config::instance()->only_servers_encode ()) { for (int i = 0; i < Config::instance()->num_local_encoding_threads (); ++i) { - _threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, optional<EncodeServerDescription> ()))); + boost::thread* t = new boost::thread (boost::bind (&Encoder::encoder_thread, this, optional<EncodeServerDescription> ())); + _threads.push_back (t); +#ifdef BOOST_THREAD_PLATFORM_WIN32 + if (windows_xp) { + SetThreadAffinityMask (t->native_handle(), 1 << i); + } +#endif } } |
