summaryrefslogtreecommitdiff
path: root/http.c
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2007-09-10 23:02:34 -0400
committerJunio C Hamano <gitster@pobox.com>2007-09-19 03:22:30 -0700
commitfc57b6aaa5bc59ecbe0c052b98196a93b35760a5 (patch)
treee64dcae3f9242d3a57fbb138e6d38f1b9672216e /http.c
parent45c1741235a1fbd54484fa1c67ea68569dcfa23e (diff)
downloadgit-fc57b6aaa5bc59ecbe0c052b98196a93b35760a5.tar.gz
Make function to refill http queue a callback
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>
Diffstat (limited to 'http.c')
-rw-r--r--http.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/http.c b/http.c
index 1f305bd355..a95483be8b 100644
--- 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) {