summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcracker64 <cracker642@gmail.com>2013-03-10 03:47:08 (GMT)
committer cracker64 <cracker642@gmail.com>2013-03-10 03:47:08 (GMT)
commita9e66429d60c0867e540d645a8c52db79abb1736 (patch)
tree45f2b3b48cfcf488c9f02b34a624f6a431a4ad43 /src
parent6090f0b0aaf302612f363cd3d85408e3b7d1150b (diff)
downloadpowder-a9e66429d60c0867e540d645a8c52db79abb1736.zip
powder-a9e66429d60c0867e540d645a8c52db79abb1736.tar.gz
Fix some memory issues when closing preview UI too fast.
I'm not sure if this pthread usage is ideal, but it does seem to work on linux.
Diffstat (limited to 'src')
-rw-r--r--src/client/Client.cpp3
-rw-r--r--src/preview/PreviewModel.cpp61
2 files changed, 55 insertions, 9 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index 4c13850..577f78e 100644
--- a/src/client/Client.cpp
+++ b/src/client/Client.cpp
@@ -1594,16 +1594,19 @@ SaveInfo * Client::GetSave(int saveID, int saveDate)
tempSave->Favourite = tempFavourite.Value();
tempSave->Views = tempViews.Value();
tempSave->Version = tempVersion.Value();
+ free(data);
return tempSave;
}
catch (json::Exception &e)
{
lastError = "Could not read response";
+ free(data);
return NULL;
}
}
else
{
+ if (data) free(data);
lastError = http_ret_text(dataStatus);
}
return NULL;
diff --git a/src/preview/PreviewModel.cpp b/src/preview/PreviewModel.cpp
index 8a0ff59..f4cd6ec 100644
--- a/src/preview/PreviewModel.cpp
+++ b/src/preview/PreviewModel.cpp
@@ -38,27 +38,63 @@ void * PreviewModel::updateSaveCommentsTHelper(void * obj)
void * PreviewModel::updateSaveInfoT()
{
+ int check;
+ pthread_attr_t attr;
SaveInfo * tempSave = Client::Ref().GetSave(tSaveID, tSaveDate);
- updateSaveInfoFinished = true;
- return tempSave;
+ pthread_getattr_np(pthread_self(), &attr);
+ pthread_attr_getdetachstate(&attr,&check);
+ pthread_attr_destroy(&attr);
+ if (check==PTHREAD_CREATE_JOINABLE)
+ {
+ updateSaveInfoFinished = true;
+ return tempSave;
+ } else
+ {
+ if (tempSave) delete tempSave;
+ }
+ return NULL;
}
void * PreviewModel::updateSaveDataT()
{
- int tempDataSize;
+ int tempDataSize, check;
+ pthread_attr_t attr;
unsigned char * tempData = Client::Ref().GetSaveData(tSaveID, tSaveDate, tempDataSize);
- saveDataBuffer.clear();
- if (tempData)
- saveDataBuffer.insert(saveDataBuffer.begin(), tempData, tempData+tempDataSize);
- updateSaveDataFinished = true;
+ pthread_getattr_np(pthread_self(), &attr);
+ pthread_attr_getdetachstate(&attr,&check);
+ pthread_attr_destroy(&attr);
+ if (check==PTHREAD_CREATE_JOINABLE)
+ {
+ saveDataBuffer.clear();
+ if (tempData)
+ saveDataBuffer.insert(saveDataBuffer.begin(), tempData, tempData+tempDataSize);
+ updateSaveDataFinished = true;
+ }
+ if (tempData) free(tempData);
+
return NULL;
}
void * PreviewModel::updateSaveCommentsT()
{
+ int check;
+ pthread_attr_t attr;
std::vector<SaveComment*> * tempComments = Client::Ref().GetComments(tSaveID, (commentsPageNumber-1)*20, 20);
- updateSaveCommentsFinished = true;
- return tempComments;
+ pthread_getattr_np(pthread_self(), &attr);
+ pthread_attr_getdetachstate(&attr,&check);
+ pthread_attr_destroy(&attr);
+ if (check==PTHREAD_CREATE_JOINABLE)
+ {
+ updateSaveCommentsFinished = true;
+ return tempComments;
+ } else
+ {
+ for(int i = 0; i < tempComments->size(); i++)
+ delete tempComments->at(i);
+ tempComments->clear();
+ delete tempComments;
+ }
+ return NULL;
}
void PreviewModel::SetFavourite(bool favourite)
@@ -307,6 +343,12 @@ void PreviewModel::Update()
}
PreviewModel::~PreviewModel() {
+ //pthread_join(updateSaveDataThread, NULL);
+ //pthread_join(updateSaveInfoThread, NULL);
+ //pthread_join(updateSaveCommentsThread, NULL);
+ if (updateSaveDataWorking) pthread_detach(updateSaveDataThread);
+ if (updateSaveInfoWorking) pthread_detach(updateSaveInfoThread);
+ if (updateSaveCommentsWorking) pthread_detach(updateSaveCommentsThread);
if(save)
delete save;
if(saveComments)
@@ -314,6 +356,7 @@ PreviewModel::~PreviewModel() {
for(int i = 0; i < saveComments->size(); i++)
delete saveComments->at(i);
saveComments->clear();
+ delete saveComments;
}
saveDataBuffer.clear();
}