Skip to content

Commit 8e4742f

Browse files
committed
Skip compression if malloc failed. Close post buffer as soon as the curl job is complete.
1 parent c93c3b7 commit 8e4742f

File tree

4 files changed

+31
-25
lines changed

4 files changed

+31
-25
lines changed

context.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ CurlContext::CurlContext(CURL* c, IPluginContext* plugin) {
1515
CurlContext::~CurlContext() {
1616
curl_easy_cleanup(curl);
1717
if(headers != NULL)
18-
curl_slist_free_all(headers);
19-
if(post)
20-
free(post);
18+
curl_slist_free_all(headers);
2119
}
2220

2321
void CurlContext::AddHeader(const char* string) {
@@ -26,37 +24,35 @@ void CurlContext::AddHeader(const char* string) {
2624
headers = new_headers;
2725
}
2826

29-
// called right before the main thread adds job to the queue
27+
// called right before event thread adds job to the queue
3028
void CurlContext::OnCurlStarted() {
3129
in_event_thread = true;
3230
// compress post if available
33-
if(post)
34-
{
31+
if(post) {
3532
char* compressBuffer = (char*)malloc(compressBound(postLength));
36-
// TODO check malloc?
37-
uLongf compressLength;
38-
int result = compress2((Bytef*)compressBuffer, &compressLength, (Bytef*)post, postLength, Z_BEST_SPEED);
39-
if(result == Z_OK)
40-
{
41-
free(post);
42-
post = compressBuffer;
43-
postLength = compressLength;
44-
AddHeader("Content-Encoding: gzip");
45-
}
46-
else
47-
{
48-
// compression failed
49-
free(compressBuffer);
33+
if(compressBuffer != NULL) {
34+
uLongf compressLength;
35+
int result = compress2((Bytef*)compressBuffer, &compressLength, (Bytef*)post, postLength, Z_BEST_SPEED);
36+
if(result == Z_OK) {
37+
free(post);
38+
post = compressBuffer;
39+
postLength = compressLength;
40+
AddHeader("Content-Encoding: gzip");
41+
} else {
42+
// compression failed
43+
free(compressBuffer);
44+
}
5045
}
5146

5247
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postLength);
5348
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
5449
}
5550
}
5651

57-
// called when the main thread loops through finished jobs
58-
void CurlContext::OnCurlCompleted() {
52+
// called when the game thread loops through finished jobs
53+
void CurlContext::OnCurlCompletedGameThread() {
5954
in_event_thread = false;
55+
6056
IPluginFunction* func = GetSourcepawnFunction(sourcepawn_plugin_context, sourcepawn_callback);
6157
// the plugin that called us disappeared, delete ourselves
6258
if(func == NULL) {
@@ -85,7 +81,15 @@ void CurlContext::OnCurlCompleted() {
8581
func->PushCell(sourcepawn_userdata);
8682
func->Execute(NULL);
8783

88-
//printf("Finished Code %i size %i\n%.*s\n", curlcode, buffer.size(), 256, &buffer[0]);
84+
//printf("Finished Code %i size %i\n%.*s\n", curlcode, buffer.size(), 256, &buffer[0]);
85+
}
86+
87+
// called when event thread finishes a curl job
88+
void CurlContext::OnCurlCompleted() {
89+
if(post) {
90+
free(post);
91+
post = NULL;
92+
}
8993
}
9094

9195
////////////////

context.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CurlContext {
3333
void AddHeader(const char* string);
3434
void OnCurlStarted();
3535
void OnCurlCompleted();
36+
void OnCurlCompletedGameThread();
3637
};
3738

3839
class CurlSocketContext {

extension.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void OnGameFrame(bool simulating) {
5858
if(!g_curl_done_queue.Empty()) {
5959
g_curl_done_queue.Lock();
6060
while(!g_curl_done_queue.Empty()) {
61-
g_curl_done_queue.Pop()->OnCurlCompleted();
61+
g_curl_done_queue.Pop()->OnCurlCompletedGameThread();
6262
}
6363
g_curl_done_queue.Unlock();
6464
}
@@ -76,6 +76,7 @@ void CheckCompletedCurlJobs() {
7676
curl_multi_remove_handle(g_curl, message->easy_handle);
7777
curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, (char*)&curl_context);
7878
curl_context->curlcode = message->data.result;
79+
curl_context->OnCurlCompleted();
7980
g_curl_done_queue.Lock();
8081
g_curl_done_queue.Push(curl_context);
8182
g_curl_done_queue.Unlock();

sdk/smsdk_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
/* Basic information exposed publicly */
4141
#define SMEXT_CONF_NAME "Async"
4242
#define SMEXT_CONF_DESCRIPTION "Asyncronous Network Commands"
43-
#define SMEXT_CONF_VERSION "2.0"
43+
#define SMEXT_CONF_VERSION "2.1"
4444
#define SMEXT_CONF_AUTHOR "Bottiger"
4545
#define SMEXT_CONF_URL "www.skial.com"
4646
#define SMEXT_CONF_LOGTAG "ASYNC"

0 commit comments

Comments
 (0)