tKeep curl handle around - vaccinewars - be a doctor and try to vaccinate the world
git clone git://src.adamsgaard.dk/vaccinewars
Log
Files
Refs
README
LICENSE
---
commit f024be5e55c9509ff3022d6616eef6c84fe4815a
parent b0ae993251eb84b78cf1855d08d1ea824d5bca51
Author: Ben Webb 
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 
 
 #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 
 #include           /* For size_t etc. */
 #include 
-#include 
 
 #ifdef CYGWIN
 #include             /* 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, void *userp)
 {
t@@ -194,40 +182,60 @@ static gboolean MetaConnectError(CURL *conn)
   return TRUE;
 }
 
-gboolean OpenCurlConnection(CurlConnection **c, char *URL, char *body, CURLM *mh)
+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 SendData,
     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))