tKeep curl handle around - vaccinewars - be a doctor and try to vaccinate the w… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit f024be5e55c9509ff3022d6616eef6c84fe4815a | |
parent b0ae993251eb84b78cf1855d08d1ea824d5bca51 | |
Author: Ben Webb <[email protected]> | |
Date: Thu, 29 Oct 2020 23:08:48 -0700 | |
Keep curl handle around | |
Don't close the curl handle when we're done talking | |
tto the metaserver, but reuse it for the next | |
connection. This should speed things up. | |
Diffstat: | |
M src/network.h | 12 ++++++++++++ | |
M src/serverside.c | 103 +++++++++++++++--------------… | |
2 files changed, 63 insertions(+), 52 deletions(-) | |
--- | |
diff --git a/src/network.h b/src/network.h | |
t@@ -55,11 +55,23 @@ | |
#include "error.h" | |
#ifdef NETWORKING | |
+#include <curl/curl.h> | |
#ifndef SOCKET_ERROR | |
#define SOCKET_ERROR -1 | |
#endif | |
+typedef struct _CurlConnection { | |
+ CURLM *multi; | |
+ CURL *h; | |
+ gboolean running; | |
+ gchar *data; | |
+ size_t data_size; | |
+ char Terminator; /* Character that separates messages */ | |
+ char StripChar; /* Char that should be removed | |
+ * from messages */ | |
+} CurlConnection; | |
+ | |
typedef struct _ConnBuf { | |
gchar *Data; /* bytes waiting to be read/written */ | |
gint Length; /* allocated length of the "Data" buffer */ | |
diff --git a/src/serverside.c b/src/serverside.c | |
t@@ -28,7 +28,6 @@ | |
#include <string.h> | |
#include <sys/types.h> /* For size_t etc. */ | |
#include <sys/stat.h> | |
-#include <curl/curl.h> | |
#ifdef CYGWIN | |
#include <windows.h> /* For datatypes such as BOOL */ | |
t@@ -105,21 +104,10 @@ gboolean MetaPlayerPending = FALSE; | |
GSList *FirstServer = NULL; | |
#ifdef NETWORKING | |
-static GScanner *Scanner; | |
- | |
/* Data waiting to be sent to/read from the metaserver */ | |
-CURLM *MetaConnM = NULL; | |
- | |
-typedef struct _CurlConnection { | |
- CURL *h; | |
- gchar *data; | |
- size_t data_size; | |
- char Terminator; /* Character that separates messages */ | |
- char StripChar; /* Char that should be removed | |
- * from messages */ | |
-} CurlConnection; | |
+CurlConnection MetaConn; | |
-CurlConnection *MetaConn = NULL; | |
+static GScanner *Scanner; | |
static size_t MetaConnWriteFunc(void *contents, size_t size, size_t nmemb, voi… | |
{ | |
t@@ -194,40 +182,60 @@ static gboolean MetaConnectError(CURL *conn) | |
return TRUE; | |
} | |
-gboolean OpenCurlConnection(CurlConnection **c, char *URL, char *body, CURLM *… | |
+void CurlInit(CurlConnection *conn) | |
{ | |
- CurlConnection *conn; | |
- | |
- conn = g_new0(CurlConnection, 1); | |
+ curl_global_init(CURL_GLOBAL_DEFAULT); | |
+ conn->multi = curl_multi_init(); | |
conn->h = curl_easy_init(); | |
+ conn->running = FALSE; | |
conn->Terminator = '\n'; | |
conn->StripChar = '\r'; | |
conn->data_size = 0; | |
+} | |
+ | |
+void CloseCurlConnection(CurlConnection *conn) | |
+{ | |
+ curl_multi_remove_handle(conn->multi, conn->h); | |
+ g_free(conn->data); | |
+ conn->data_size = 0; | |
+ conn->running = FALSE; | |
+} | |
+ | |
+void CurlCleanup(CurlConnection *conn) | |
+{ | |
+ if (conn->running) { | |
+ CloseCurlConnection(conn); | |
+ } | |
+ curl_easy_cleanup(conn->h); | |
+ curl_multi_cleanup(conn->multi); | |
+ curl_global_cleanup(); | |
+} | |
+ | |
+gboolean OpenCurlConnection(CurlConnection *conn, char *URL, char *body) | |
+{ | |
+ /* If the previous connect hung for so long that it's still active, then | |
+ * break the connection before we start a new one */ | |
+ if (conn->running) { | |
+ CloseCurlConnection(conn); | |
+ } | |
+ | |
if (conn->h) { | |
int still_running; | |
conn->data = g_malloc(1); | |
+ conn->data_size = 0; | |
curl_easy_setopt(conn->h, CURLOPT_COPYPOSTFIELDS, body); | |
curl_easy_setopt(conn->h, CURLOPT_URL, URL); | |
curl_easy_setopt(conn->h, CURLOPT_WRITEFUNCTION, MetaConnWriteFunc); | |
curl_easy_setopt(conn->h, CURLOPT_WRITEDATA, conn); | |
- curl_multi_add_handle(mh, conn->h); | |
- curl_multi_perform(mh, &still_running); | |
- *c = conn; | |
+ curl_multi_add_handle(conn->multi, conn->h); | |
+ conn->running = TRUE; | |
+ curl_multi_perform(conn->multi, &still_running); | |
return TRUE; | |
} else { | |
- g_free(conn); | |
return FALSE; | |
} | |
} | |
-void CloseCurlConnection(CurlConnection *c, CURLM *mh) | |
-{ | |
- curl_multi_remove_handle(mh, c->h); | |
- curl_easy_cleanup(c->h); | |
- g_free(c->data); | |
- g_free(c); | |
-} | |
- | |
static void ServerHttpAuth(HttpConnection *conn, gboolean proxyauth, | |
gchar *realm, gpointer data) | |
{ | |
t@@ -303,11 +311,6 @@ void RegisterWithMetaServer(gboolean Up, gboolean SendDat… | |
return; | |
} | |
- /* If the previous connect hung for so long that it's still active, then | |
- * break the connection before we start a new one */ | |
- if (MetaConn) | |
- CloseCurlConnection(MetaConn, MetaConnM); | |
- | |
body = g_string_new(""); | |
g_string_assign(body, "output=text&"); | |
t@@ -342,7 +345,7 @@ void RegisterWithMetaServer(gboolean Up, gboolean SendData, | |
} | |
} | |
- retval = OpenCurlConnection(&MetaConn, MetaServer.URL, body->str, MetaConnM); | |
+ retval = OpenCurlConnection(&MetaConn, MetaServer.URL, body->str); | |
dopelog(2, LF_SERVER, _("Waiting for connect to metaserver at %s..."), | |
MetaServer.URL); | |
t@@ -998,7 +1001,7 @@ void RequestServerShutdown(void) | |
*/ | |
gboolean IsServerShutdown(void) | |
{ | |
- return (WantQuit && !FirstServer && !MetaConn); | |
+ return (WantQuit && !FirstServer && !MetaConn.running); | |
} | |
static GPrintFunc StartServerReply(NetworkBuffer *netbuf) | |
t@@ -1216,6 +1219,7 @@ void ServerLoop(struct CMDLINE *cmdline) | |
struct timeval timeout; | |
int MinTimeout; | |
GString *LineBuf; | |
+ | |
gboolean DoneOK; | |
gchar *buf; | |
t@@ -1227,9 +1231,7 @@ void ServerLoop(struct CMDLINE *cmdline) | |
#endif | |
InitConfiguration(cmdline); | |
- | |
- curl_global_init(CURL_GLOBAL_DEFAULT); | |
- MetaConnM = curl_multi_init(); | |
+ CurlInit(&MetaConn); | |
if (!StartServer()) | |
return; | |
t@@ -1256,7 +1258,7 @@ void ServerLoop(struct CMDLINE *cmdline) | |
FD_ZERO(&readfs); | |
FD_ZERO(&writefs); | |
FD_ZERO(&errorfs); | |
- curl_multi_fdset(MetaConnM, &readfs, &writefs, &errorfs, &topsock); | |
+ curl_multi_fdset(MetaConn.multi, &readfs, &writefs, &errorfs, &topsock); | |
FD_SET(ListenSock, &readfs); | |
FD_SET(ListenSock, &errorfs); | |
topsock = MAX(topsock + 1, ListenSock + 1); | |
t@@ -1357,9 +1359,9 @@ void ServerLoop(struct CMDLINE *cmdline) | |
if (IsServerShutdown()) | |
break; | |
#endif | |
- if (MetaConn) { | |
+ if (MetaConn.running) { | |
int still_running; | |
- curl_multi_perform(MetaConnM, &still_running); | |
+ curl_multi_perform(MetaConn.multi, &still_running); | |
// dopelog(2, LF_SERVER, "MetaServer multi_perform: %d", still_running); | |
/* if (RespondToSelect(&MetaConn->NetBuf, &readfs, &writefs, | |
&errorfs, &DoneOK)) { | |
t@@ -1382,12 +1384,12 @@ void ServerLoop(struct CMDLINE *cmdline) | |
break; | |
} */ | |
if (still_running == 0) { | |
- char *ch = MetaConn->data; | |
+ char *ch = MetaConn.data; | |
while(ch && *ch) { | |
- char *sep_pt = strchr(ch, MetaConn->Terminator); | |
+ char *sep_pt = strchr(ch, MetaConn.Terminator); | |
if (sep_pt) { | |
*sep_pt = '\0'; | |
- if (sep_pt > ch && sep_pt[-1] == MetaConn->StripChar) { | |
+ if (sep_pt > ch && sep_pt[-1] == MetaConn.StripChar) { | |
sep_pt[-1] = '\0'; | |
} | |
sep_pt++; | |
t@@ -1398,8 +1400,7 @@ void ServerLoop(struct CMDLINE *cmdline) | |
ch = sep_pt; | |
} | |
dopelog(4, LF_SERVER, "MetaServer: (closed)\n"); | |
- CloseCurlConnection(MetaConn, MetaConnM); | |
- MetaConn = NULL; | |
+ CloseCurlConnection(&MetaConn); | |
if (IsServerShutdown()) | |
break; | |
} | |
t@@ -1437,9 +1438,7 @@ void ServerLoop(struct CMDLINE *cmdline) | |
StopServer(); | |
g_string_free(LineBuf, TRUE); | |
- curl_multi_cleanup(MetaConnM); | |
- | |
- curl_global_cleanup(); | |
+ CurlCleanup(&MetaConn); | |
} | |
#ifdef GUI_SERVER | |
t@@ -3804,7 +3803,7 @@ long GetMinimumTimeout(GSList *First) | |
time_t timenow; | |
timenow = time(NULL); | |
- curl_multi_timeout(MetaConnM, &mintime); | |
+ curl_multi_timeout(MetaConn.multi, &mintime); | |
if (AddTimeout(MetaMinTimeout, timenow, &mintime)) | |
return 0; | |
if (AddTimeout(MetaUpdateTimeout, timenow, &mintime)) |