[PATCH 1/3] Clean up CURL handles in unused request slots
authorNick Hengeveld <nickh@reactrix.com>
Fri, 21 Oct 2005 19:06:10 +0000 (12:06 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 22 Oct 2005 02:20:17 +0000 (19:20 -0700)
Clean up CURL handles in unused request slots

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
http-fetch.c

index a7dc2cc..d26fae8 100644 (file)
@@ -291,11 +291,7 @@ static struct active_request_slot *get_active_slot(void)
        }
        if (slot == NULL) {
                newslot = xmalloc(sizeof(*newslot));
-#ifdef NO_CURL_EASY_DUPHANDLE
-               newslot->curl = get_curl_handle();
-#else
-               newslot->curl = curl_easy_duphandle(curl_default);
-#endif
+               newslot->curl = NULL;
                newslot->in_use = 0;
                newslot->next = NULL;
 
@@ -311,6 +307,14 @@ static struct active_request_slot *get_active_slot(void)
                slot = newslot;
        }
 
+       if (slot->curl == NULL) {
+#ifdef NO_CURL_EASY_DUPHANDLE
+               slot->curl = get_curl_handle();
+#else
+               slot->curl = curl_easy_duphandle(curl_default);
+#endif
+       }
+
        active_requests++;
        slot->in_use = 1;
        slot->done = 0;
@@ -612,6 +616,7 @@ void process_curl_messages(void)
 void process_request_queue(void)
 {
        struct transfer_request *request = request_queue_head;
+       struct active_request_slot *slot = active_queue_head;
        int num_transfers;
 
        while (active_requests < max_requests && request != NULL) {
@@ -624,6 +629,14 @@ void process_request_queue(void)
                }
                request = request->next;
        }
+
+       while (slot != NULL) {
+               if (!slot->in_use && slot->curl != NULL) {
+                       curl_easy_cleanup(slot->curl);
+                       slot->curl = NULL;
+               }
+               slot = slot->next;
+       }                               
 }
 #endif
 
@@ -1297,7 +1310,8 @@ int main(int argc, char **argv)
 #endif
        slot = active_queue_head;
        while (slot != NULL) {
-               curl_easy_cleanup(slot->curl);
+               if (slot->curl != NULL)
+                       curl_easy_cleanup(slot->curl);
                slot = slot->next;
        }
 #ifdef USE_CURL_MULTI