summaryrefslogtreecommitdiff
path: root/src/client/ThumbnailBroker.cpp
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-11-26 10:34:17 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-11-26 10:34:17 (GMT)
commitb08812569cf96dcd5a62c8d0467bd14f3ae90e54 (patch)
tree98375c0ba26212c04cb9ff0ea183f6b3066dd659 /src/client/ThumbnailBroker.cpp
parent6a4040f2b7aa86992a340f8bf5afb95011a1e989 (diff)
downloadpowder-b08812569cf96dcd5a62c8d0467bd14f3ae90e54.zip
powder-b08812569cf96dcd5a62c8d0467bd14f3ae90e54.tar.gz
Stop using persistent connections when we don't need them. Force shutdown of Thumbnailbroker before http lib close, fixes #84
Diffstat (limited to 'src/client/ThumbnailBroker.cpp')
-rw-r--r--src/client/ThumbnailBroker.cpp90
1 files changed, 67 insertions, 23 deletions
diff --git a/src/client/ThumbnailBroker.cpp b/src/client/ThumbnailBroker.cpp
index e884a98..92ccfd8 100644
--- a/src/client/ThumbnailBroker.cpp
+++ b/src/client/ThumbnailBroker.cpp
@@ -19,6 +19,9 @@ ThumbnailBroker::ThumbnailBroker()
//listenersMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init (&listenersMutex, NULL);
+
+
+ pthread_mutex_init (&runningMutex, NULL);
}
ThumbnailBroker::~ThumbnailBroker()
@@ -26,6 +29,45 @@ ThumbnailBroker::~ThumbnailBroker()
}
+void ThumbnailBroker::assureRunning()
+{
+ pthread_mutex_lock(&runningMutex);
+ bool running = thumbnailQueueRunning;
+ thumbnailQueueRunning = true;
+ pthread_mutex_unlock(&runningMutex);
+
+ if(!running)
+ {
+#ifdef DEBUG
+ std::cout << typeid(*this).name() << " Starting background thread for new " << __FUNCTION__ << " request" << std::endl;
+#endif
+ pthread_create(&thumbnailQueueThread, 0, &ThumbnailBroker::thumbnailQueueProcessHelper, this);
+ }
+}
+
+void ThumbnailBroker::Shutdown()
+{
+ pthread_mutex_lock(&runningMutex);
+ if(thumbnailQueueRunning)
+ {
+ thumbnailQueueRunning = false;
+ pthread_mutex_unlock(&runningMutex);
+ pthread_join(thumbnailQueueThread, NULL);
+ }
+ else
+ pthread_mutex_unlock(&runningMutex);
+
+
+ for (std::list<ThumbnailRequest>::iterator iter = currentRequests.begin(), end = currentRequests.end(); iter != end; ++iter)
+ {
+ ThumbnailRequest req = *iter;
+ if(req.HTTPContext)
+ {
+ http_async_req_close(req.HTTPContext);
+ }
+ }
+}
+
void ThumbnailBroker::RenderThumbnail(GameSave * gameSave, int width, int height, ThumbnailListener * tListener)
{
RenderThumbnail(gameSave, true, true, width, height, tListener);
@@ -35,36 +77,20 @@ void ThumbnailBroker::RenderThumbnail(GameSave * gameSave, bool decorations, boo
{
AttachThumbnailListener(tListener);
pthread_mutex_lock(&thumbnailQueueMutex);
- bool running = thumbnailQueueRunning;
- thumbnailQueueRunning = true;
renderRequests.push_back(ThumbRenderRequest(new GameSave(*gameSave), decorations, fire, width, height, ListenerHandle(tListener->ListenerRand, tListener)));
pthread_mutex_unlock(&thumbnailQueueMutex);
- if(!running)
- {
-#ifdef DEBUG
- std::cout << typeid(*this).name() << " Starting background thread for new " << __FUNCTION__ << " request" << std::endl;
-#endif
- pthread_create(&thumbnailQueueThread, 0, &ThumbnailBroker::thumbnailQueueProcessHelper, this);
- }
+ assureRunning();
}
void ThumbnailBroker::RetrieveThumbnail(int saveID, int saveDate, int width, int height, ThumbnailListener * tListener)
{
AttachThumbnailListener(tListener);
pthread_mutex_lock(&thumbnailQueueMutex);
- bool running = thumbnailQueueRunning;
- thumbnailQueueRunning = true;
thumbnailRequests.push_back(ThumbnailRequest(saveID, saveDate, width, height, ListenerHandle(tListener->ListenerRand, tListener)));
pthread_mutex_unlock(&thumbnailQueueMutex);
- if(!running)
- {
-#ifdef DEBUG
- std::cout << typeid(*this).name() << " Starting background thread for new " << __FUNCTION__ << " request" << std::endl;
-#endif
- pthread_create(&thumbnailQueueThread, 0, &ThumbnailBroker::thumbnailQueueProcessHelper, this);
- }
+ assureRunning();
}
void * ThumbnailBroker::thumbnailQueueProcessHelper(void * ref)
@@ -97,17 +123,33 @@ void ThumbnailBroker::FlushThumbQueue()
void ThumbnailBroker::thumbnailQueueProcessTH()
{
time_t lastAction = time(NULL);
+ pthread_mutex_lock(&runningMutex);
+ thumbnailQueueRunning = true;
+ pthread_mutex_unlock(&runningMutex);
while(true)
{
//Shutdown after 2 seconds of idle
if(time(NULL) - lastAction > 2)
{
- pthread_mutex_lock(&thumbnailQueueMutex);
- thumbnailQueueRunning = false;
- pthread_mutex_unlock(&thumbnailQueueMutex);
+#ifdef DEBUG
+ std::cout << typeid(*this).name() << " Idle shutdown" << std::endl;
+#endif
+ break;
+ }
+
+
+ pthread_mutex_lock(&runningMutex);
+ bool running = thumbnailQueueRunning;
+ pthread_mutex_unlock(&runningMutex);
+ if(!running)
+ {
+#ifdef DEBUG
+ std::cout << typeid(*this).name() << " Requested shutdown" << std::endl;
+#endif
break;
}
+
//Renderer
pthread_mutex_lock(&thumbnailQueueMutex);
if(renderRequests.size())
@@ -220,7 +262,7 @@ void ThumbnailBroker::thumbnailQueueProcessTH()
std::cout << typeid(*this).name() << " Creating new request for " << req.ID.SaveID << ":" << req.ID.SaveDate << std::endl;
#endif
- req.HTTPContext = http_async_req_start(NULL, (char *)urlStream.str().c_str(), NULL, 0, 1);
+ req.HTTPContext = http_async_req_start(NULL, (char *)urlStream.str().c_str(), NULL, 0, 0);
req.RequestTime = time(NULL);
currentRequests.push_back(req);
}
@@ -252,7 +294,6 @@ void ThumbnailBroker::thumbnailQueueProcessTH()
char * data;
int status, data_size, imgw, imgh;
data = http_async_req_stop(req.HTTPContext, &status, &data_size);
- free(req.HTTPContext);
if (status == 200 && data)
{
@@ -307,6 +348,9 @@ void ThumbnailBroker::thumbnailQueueProcessTH()
}
}
+ pthread_mutex_lock(&runningMutex);
+ thumbnailQueueRunning = false;
+ pthread_mutex_unlock(&runningMutex);
}
void ThumbnailBroker::RetrieveThumbnail(int saveID, int width, int height, ThumbnailListener * tListener)