diff options
author | Alexander Tkachev | 2016-06-03 18:04:48 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | 9d186929e16ce023222028143a280aca03605fe9 (patch) | |
tree | 4a81c58a7613c49dfb44fb3efe7cbfe6ce5d74c4 /backends/networking/curl/connectionmanager.cpp | |
parent | 7ff1f918084b8d41826ad869d8c9865e1d53e082 (diff) | |
download | scummvm-rg350-9d186929e16ce023222028143a280aca03605fe9.tar.gz scummvm-rg350-9d186929e16ce023222028143a280aca03605fe9.tar.bz2 scummvm-rg350-9d186929e16ce023222028143a280aca03605fe9.zip |
CLOUD: Add CloudIcon
To achieve smoother animation, ConnectionManager's timer now is 20 times
more frequent.
I'm encountering some strange libcurl.dll segfault problem when I close
the application while some Requests are active. It's not
CloudIcon-related, so it's more likely related to this 20 FPS timer.
This problem shows up only in Visual Studio for me.
Diffstat (limited to 'backends/networking/curl/connectionmanager.cpp')
-rw-r--r-- | backends/networking/curl/connectionmanager.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/backends/networking/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp index 44511fdb23..c044a1577d 100644 --- a/backends/networking/curl/connectionmanager.cpp +++ b/backends/networking/curl/connectionmanager.cpp @@ -37,7 +37,7 @@ DECLARE_SINGLETON(Networking::ConnectionManager); namespace Networking { -ConnectionManager::ConnectionManager(): _multi(0), _timerStarted(false) { +ConnectionManager::ConnectionManager(): _multi(0), _timerStarted(false), _frame(0) { curl_global_init(CURL_GLOBAL_ALL); _multi = curl_multi_init(); } @@ -52,12 +52,13 @@ ConnectionManager::~ConnectionManager() { delete request; if (callback) (*callback)(request); } - _requests.clear(); - _handleMutex.unlock(); + _requests.clear(); //cleanup curl_multi_cleanup(_multi); curl_global_cleanup(); + _multi = nullptr; + _handleMutex.unlock(); } void ConnectionManager::registerEasyHandle(CURL *easy) { @@ -95,9 +96,13 @@ void ConnectionManager::stopTimer() { void ConnectionManager::handle() { //lock mutex here (in case another handle() would be called before this one ends) _handleMutex.lock(); - interateRequests(); - processTransfers(); + ++_frame; + if (_frame % CLOUD_PERIOD == 0) interateRequests(); + if (_frame % CURL_PERIOD == 0) processTransfers(); _handleMutex.unlock(); + + //icon redrawing is doesn't require any mutex, but must be done after requests are iterated + _icon.draw(); } void ConnectionManager::interateRequests() { @@ -123,6 +128,8 @@ void ConnectionManager::interateRequests() { } void ConnectionManager::processTransfers() { + if (!_multi) return; + //check libcurl's transfers and notify requests of messages from queue (transfer completion or failure) int transfersRunning; curl_multi_perform(_multi, &transfersRunning); |