Make function to refill http queue a callback
authorDaniel Barkalow <barkalow@iabervon.org>
Tue, 11 Sep 2007 03:02:34 +0000 (23:02 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Sep 2007 10:22:30 +0000 (03:22 -0700)
This eliminates the last function provided by the code using http.h as
a global symbol, so it should be possible to have multiple programs
using http.h in the same executable, and it also adds an argument to
that callback, so that info can be passed into the callback without
being global.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http-fetch.c
http-push.c
http.c
http.h

index e9b9f307f8f0a38326df56e9a827b261990734fe..7786110ffc1fa283dc1e67f874ea5a61d532a9a5 100644 (file)
@@ -317,7 +317,7 @@ static void release_object_request(struct object_request *obj_req)
 }
 
 #ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
 {
        struct object_request *obj_req;
 
@@ -1035,6 +1035,10 @@ int main(int argc, const char **argv)
        alt->packs = NULL;
        alt->next = NULL;
 
+#ifdef USE_CURL_MULTI
+       add_fill_function(NULL, fill_active_slot);
+#endif
+
        if (pull(commits, commit_id, write_ref, url))
                rc = 1;
 
index c7471fa11d962afe79518d3916b542e1a2290604..c54230b6f3bb873d9d0d3c03d5cfc5ec8cde2177 100644 (file)
@@ -795,7 +795,7 @@ static void finish_request(struct transfer_request *request)
 }
 
 #ifdef USE_CURL_MULTI
-int fill_active_slot(void)
+static int fill_active_slot(void *unused)
 {
        struct transfer_request *request = request_queue_head;
 
@@ -2496,6 +2496,7 @@ int main(int argc, char **argv)
                                objects_to_send);
 #ifdef USE_CURL_MULTI
                fill_active_slots();
+               add_fill_function(NULL, fill_active_slot);
 #endif
                finish_all_active_slots();
 
diff --git a/http.c b/http.c
index 1f305bd355fd66e3cd01659e3ee1f894c3324a33..a95483be8b41664824b57883bcc4801ea0d10311 100644 (file)
--- a/http.c
+++ b/http.c
@@ -391,13 +391,39 @@ int start_active_slot(struct active_request_slot *slot)
 }
 
 #ifdef USE_CURL_MULTI
+struct fill_chain {
+       void *data;
+       int (*fill)(void *);
+       struct fill_chain *next;
+};
+
+static struct fill_chain *fill_cfg = NULL;
+
+void add_fill_function(void *data, int (*fill)(void *))
+{
+       struct fill_chain *new = malloc(sizeof(*new));
+       struct fill_chain **linkp = &fill_cfg;
+       new->data = data;
+       new->fill = fill;
+       new->next = NULL;
+       while (*linkp)
+               linkp = &(*linkp)->next;
+       *linkp = new;
+}
+
 void fill_active_slots(void)
 {
        struct active_request_slot *slot = active_queue_head;
 
-       while (active_requests < max_requests)
-               if (!fill_active_slot())
+       while (active_requests < max_requests) {
+               struct fill_chain *fill;
+               for (fill = fill_cfg; fill; fill = fill->next)
+                       if (fill->fill(fill->data))
+                               break;
+
+               if (!fill)
                        break;
+       }
 
        while (slot != NULL) {
                if (!slot->in_use && slot->curl != NULL) {
diff --git a/http.h b/http.h
index 559105cc034467551041f9b57f7d649b3473f50a..72abac20f856b45c873cc370f23c7df08b650370 100644 (file)
--- a/http.h
+++ b/http.h
@@ -70,10 +70,8 @@ extern void release_active_slot(struct active_request_slot *slot);
 
 #ifdef USE_CURL_MULTI
 extern void fill_active_slots(void);
+extern void add_fill_function(void *data, int (*fill)(void *));
 extern void step_active_slots(void);
-
-/* Provided by the program using http. */
-extern int fill_active_slot(void);
 #endif
 
 extern void http_init(void);