aboutsummaryrefslogtreecommitdiff
path: root/backends/networking/curl/connectionmanager.cpp
diff options
context:
space:
mode:
authorAlexander Tkachev2016-06-03 18:04:48 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit9d186929e16ce023222028143a280aca03605fe9 (patch)
tree4a81c58a7613c49dfb44fb3efe7cbfe6ce5d74c4 /backends/networking/curl/connectionmanager.cpp
parent7ff1f918084b8d41826ad869d8c9865e1d53e082 (diff)
downloadscummvm-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.cpp17
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);